svn commit: r318969 - in head: lib/libprocstat sys/kern sys/sys usr.bin/procstat
Conrad Meyer
cem at FreeBSD.org
Fri May 26 22:17:46 UTC 2017
Author: cem
Date: Fri May 26 22:17:44 2017
New Revision: 318969
URL: https://svnweb.freebsd.org/changeset/base/318969
Log:
procstat(1): Add TCP socket send/recv buffer size
Add TCP socket send and receive buffer size to procstat -f output.
Reviewed by: kib, markj
Sponsored by: Dell EMC Isilon
Differential Revision: https://reviews.freebsd.org/D10689
Modified:
head/lib/libprocstat/Symbol.map
head/lib/libprocstat/libprocstat.c
head/lib/libprocstat/libprocstat.h
head/lib/libprocstat/libprocstat_compat.c
head/sys/kern/sys_socket.c
head/sys/sys/user.h
head/usr.bin/procstat/procstat_files.c
Modified: head/lib/libprocstat/Symbol.map
==============================================================================
--- head/lib/libprocstat/Symbol.map Fri May 26 21:10:01 2017 (r318968)
+++ head/lib/libprocstat/Symbol.map Fri May 26 22:17:44 2017 (r318969)
@@ -6,7 +6,6 @@ FBSD_1.2 {
procstat_freefiles;
procstat_freeprocs;
procstat_get_pipe_info;
- procstat_get_socket_info;
procstat_getfiles;
procstat_getprocs;
procstat_open_kvm;
@@ -39,5 +38,6 @@ FBSD_1.5 {
procstat_get_pts_info;
procstat_get_sem_info;
procstat_get_shm_info;
+ procstat_get_socket_info;
procstat_get_vnode_info;
};
Modified: head/lib/libprocstat/libprocstat.c
==============================================================================
--- head/lib/libprocstat/libprocstat.c Fri May 26 21:10:01 2017 (r318968)
+++ head/lib/libprocstat/libprocstat.c Fri May 26 22:17:44 2017 (r318969)
@@ -1497,6 +1497,8 @@ procstat_get_socket_info_kvm(kvm_t *kd,
} else
sock->inp_ppcb =
(uintptr_t)inpcb.inp_ppcb;
+ sock->sendq = s.so_snd.sb_ccc;
+ sock->recvq = s.so_rcv.sb_ccc;
}
}
break;
@@ -1510,6 +1512,8 @@ procstat_get_socket_info_kvm(kvm_t *kd,
sock->so_rcv_sb_state = s.so_rcv.sb_state;
sock->so_snd_sb_state = s.so_snd.sb_state;
sock->unp_conn = (uintptr_t)unpcb.unp_conn;
+ sock->sendq = s.so_snd.sb_ccc;
+ sock->recvq = s.so_rcv.sb_ccc;
}
}
break;
@@ -1556,17 +1560,22 @@ procstat_get_socket_info_sysctl(struct f
switch(sock->dom_family) {
case AF_INET:
case AF_INET6:
- if (sock->proto == IPPROTO_TCP)
+ if (sock->proto == IPPROTO_TCP) {
sock->inp_ppcb = kif->kf_un.kf_sock.kf_sock_inpcb;
+ sock->sendq = kif->kf_un.kf_sock.kf_sock_sendq;
+ sock->recvq = kif->kf_un.kf_sock.kf_sock_recvq;
+ }
break;
case AF_UNIX:
if (kif->kf_un.kf_sock.kf_sock_unpconn != 0) {
- sock->so_rcv_sb_state =
- kif->kf_un.kf_sock.kf_sock_rcv_sb_state;
- sock->so_snd_sb_state =
- kif->kf_un.kf_sock.kf_sock_snd_sb_state;
- sock->unp_conn =
- kif->kf_un.kf_sock.kf_sock_unpconn;
+ sock->so_rcv_sb_state =
+ kif->kf_un.kf_sock.kf_sock_rcv_sb_state;
+ sock->so_snd_sb_state =
+ kif->kf_un.kf_sock.kf_sock_snd_sb_state;
+ sock->unp_conn =
+ kif->kf_un.kf_sock.kf_sock_unpconn;
+ sock->sendq = kif->kf_un.kf_sock.kf_sock_sendq;
+ sock->recvq = kif->kf_un.kf_sock.kf_sock_recvq;
}
break;
default:
Modified: head/lib/libprocstat/libprocstat.h
==============================================================================
--- head/lib/libprocstat/libprocstat.h Fri May 26 21:10:01 2017 (r318968)
+++ head/lib/libprocstat/libprocstat.h Fri May 26 22:17:44 2017 (r318969)
@@ -157,6 +157,8 @@ struct sockstat {
struct sockaddr_storage sa_peer; /* Peer address. */
int type;
char dname[32];
+ unsigned int sendq;
+ unsigned int recvq;
};
STAILQ_HEAD(filestat_list, filestat);
Modified: head/lib/libprocstat/libprocstat_compat.c
==============================================================================
--- head/lib/libprocstat/libprocstat_compat.c Fri May 26 21:10:01 2017 (r318968)
+++ head/lib/libprocstat/libprocstat_compat.c Fri May 26 22:17:44 2017 (r318969)
@@ -60,12 +60,29 @@ struct freebsd11_shmstat {
uint16_t mode;
};
+struct freebsd11_sockstat {
+ uint64_t inp_ppcb;
+ uint64_t so_addr;
+ uint64_t so_pcb;
+ uint64_t unp_conn;
+ int dom_family;
+ int proto;
+ int so_rcv_sb_state;
+ int so_snd_sb_state;
+ struct sockaddr_storage sa_local; /* Socket address. */
+ struct sockaddr_storage sa_peer; /* Peer address. */
+ int type;
+ char dname[32];
+};
+
int freebsd11_procstat_get_pts_info(struct procstat *procstat,
struct filestat *fst, struct freebsd11_ptsstat *pts, char *errbuf);
int freebsd11_procstat_get_sem_info(struct procstat *procstat,
struct filestat *fst, struct freebsd11_semstat *sem, char *errbuf);
int freebsd11_procstat_get_shm_info(struct procstat *procstat,
struct filestat *fst, struct freebsd11_shmstat *shm, char *errbuf);
+int freebsd11_procstat_get_socket_info(struct procstat *procstat,
+ struct filestat *fst, struct freebsd11_sockstat *sock, char *errbuf);
int freebsd11_procstat_get_vnode_info(struct procstat *procstat,
struct filestat *fst, struct freebsd11_vnstat *vn, char *errbuf);
@@ -116,6 +133,31 @@ freebsd11_procstat_get_shm_info(struct p
}
int
+freebsd11_procstat_get_socket_info(struct procstat *procstat, struct filestat *fst,
+ struct freebsd11_sockstat *sock_compat, char *errbuf)
+{
+ struct sockstat sock;
+ int r;
+
+ r = procstat_get_socket_info(procstat, fst, &sock, errbuf);
+ if (r != 0)
+ return (r);
+ sock_compat->inp_ppcb = sock.inp_ppcb;
+ sock_compat->so_addr = sock.so_addr;
+ sock_compat->so_pcb = sock.so_pcb;
+ sock_compat->unp_conn = sock.unp_conn;
+ sock_compat->dom_family = sock.dom_family;
+ sock_compat->proto = sock.proto;
+ sock_compat->so_rcv_sb_state = sock.so_rcv_sb_state;
+ sock_compat->so_snd_sb_state = sock.so_snd_sb_state;
+ sock_compat->sa_local = sock.sa_local;
+ sock_compat->sa_peer = sock.sa_peer;
+ sock_compat->type = sock.type;
+ memcpy(sock_compat->dname, sock.dname, sizeof(sock.dname));
+ return (0);
+}
+
+int
freebsd11_procstat_get_vnode_info(struct procstat *procstat,
struct filestat *fst, struct freebsd11_vnstat *vn_compat, char *errbuf)
{
@@ -138,6 +180,8 @@ freebsd11_procstat_get_vnode_info(struct
}
__sym_compat(procstat_get_pts_info, freebsd11_procstat_get_pts_info, FBSD_1.2);
+__sym_compat(procstat_get_socket_info, freebsd11_procstat_get_socket_info,
+ FBSD_1.2);
__sym_compat(procstat_get_vnode_info, freebsd11_procstat_get_vnode_info,
FBSD_1.2);
__sym_compat(procstat_get_sem_info, freebsd11_procstat_get_sem_info, FBSD_1.3);
Modified: head/sys/kern/sys_socket.c
==============================================================================
--- head/sys/kern/sys_socket.c Fri May 26 21:10:01 2017 (r318968)
+++ head/sys/kern/sys_socket.c Fri May 26 22:17:44 2017 (r318969)
@@ -359,6 +359,10 @@ soo_fill_kinfo(struct file *fp, struct k
inpcb = (struct inpcb *)(so->so_pcb);
kif->kf_un.kf_sock.kf_sock_inpcb =
(uintptr_t)inpcb->inp_ppcb;
+ kif->kf_un.kf_sock.kf_sock_sendq =
+ sbused(&so->so_snd);
+ kif->kf_un.kf_sock.kf_sock_recvq =
+ sbused(&so->so_rcv);
}
}
break;
@@ -372,6 +376,10 @@ soo_fill_kinfo(struct file *fp, struct k
so->so_rcv.sb_state;
kif->kf_un.kf_sock.kf_sock_snd_sb_state =
so->so_snd.sb_state;
+ kif->kf_un.kf_sock.kf_sock_sendq =
+ sbused(&so->so_snd);
+ kif->kf_un.kf_sock.kf_sock_recvq =
+ sbused(&so->so_rcv);
}
}
break;
Modified: head/sys/sys/user.h
==============================================================================
--- head/sys/sys/user.h Fri May 26 21:10:01 2017 (r318968)
+++ head/sys/sys/user.h Fri May 26 22:17:44 2017 (r318969)
@@ -344,7 +344,8 @@ struct kinfo_file {
int64_t kf_offset; /* Seek location. */
union {
struct {
- uint32_t kf_spareint;
+ /* Sendq size */
+ uint32_t kf_sock_sendq;
/* Socket domain. */
int kf_sock_domain0;
/* Socket type. */
@@ -365,8 +366,8 @@ struct kinfo_file {
uint16_t kf_sock_snd_sb_state;
/* Receive buffer state. */
uint16_t kf_sock_rcv_sb_state;
- /* Round to 64 bit alignment. */
- uint32_t kf_sock_pad0;
+ /* Recvq size. */
+ uint32_t kf_sock_recvq;
} kf_sock;
struct {
/* Vnode type. */
Modified: head/usr.bin/procstat/procstat_files.c
==============================================================================
--- head/usr.bin/procstat/procstat_files.c Fri May 26 21:10:01 2017 (r318968)
+++ head/usr.bin/procstat/procstat_files.c Fri May 26 22:17:44 2017 (r318969)
@@ -534,6 +534,12 @@ procstat_files(struct procstat *procstat
xo_emit("{:protocol/%-3s/%s} ",
protocol_to_string(sock.dom_family,
sock.type, sock.proto));
+ if (sock.proto == IPPROTO_TCP ||
+ sock.proto == IPPROTO_SCTP ||
+ sock.type == SOCK_STREAM) {
+ xo_emit("{:sendq/%u} ", sock.sendq);
+ xo_emit("{:recvq/%u} ", sock.recvq);
+ }
/*
* While generally we like to print two addresses,
* local and peer, for sockets, it turns out to be
More information about the svn-src-head
mailing list