PERFORCE change 166172 for review

Gabor Pali pgj at FreeBSD.org
Thu Jul 16 19:03:37 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=166172

Change 166172 by pgj at petymeg-current on 2009/07/16 19:03:03

	Modify netstat(1) to call libnetstat for mbuf(9) statistics.  As a
	bonus, extraction from kvm(3) works completely now.

Affected files ...

.. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#6 edit
.. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#13 edit
.. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/mbuf.c#3 edit

Differences ...

==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/extern.h#6 (text+ko) ====

@@ -35,6 +35,8 @@
  */
 
 #include <sys/cdefs.h>
+#include <sys/socketvar.h>
+#include <stdint.h>
 #include <netstat.h>
 
 extern int	Aflag;	/* show addresses of protocol control block */
@@ -112,7 +114,7 @@
 void	pfkey_stats(u_long, const char *, int, int);
 #endif
 
-void	mbpr(void *, u_long);
+void	mbpr(void *);
 
 void	hostpr(u_long, u_long);
 void	impstats(u_long, u_long);

==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/main.c#13 (text+ko) ====

@@ -119,57 +119,35 @@
 	{ .n_name = "_mif6table" },
 #define	N_PFKEYSTAT	20
 	{ .n_name = "_pfkeystat" },
-#define	N_MBSTAT	21
-	{ .n_name = "_mbstat" },
-#define	N_MBTYPES	22
-	{ .n_name = "_mbtypes" },
-#define	N_NMBCLUSTERS	23
-	{ .n_name = "_nmbclusters" },
-#define	N_NMBUFS	24
-	{ .n_name = "_nmbufs" },
-#define	N_MBHI		25
-	{ .n_name = "_mbuf_hiwm" },
-#define	N_CLHI		26
-	{ .n_name = "_clust_hiwm" },
-#define	N_NCPUS		27
-	{ .n_name = "_smp_cpus" },
-#define	N_PAGESZ	28
-	{ .n_name = "_pagesize" },
-#define	N_MBPSTAT	29
-	{ .n_name = "_mb_statpcpu" },
-#define	N_RTTRASH	30
+#define	N_RTTRASH	21
 	{ .n_name = "_rttrash" },
-#define	N_MBLO		31
-	{ .n_name = "_mbuf_lowm" },
-#define	N_CLLO		32
-	{ .n_name = "_clust_lowm" },
-#define	N_CARPSTAT	33
+#define	N_CARPSTAT	22
 	{ .n_name = "_carpstats" },
-#define	N_PFSYNCSTAT	34
+#define	N_PFSYNCSTAT	23
 	{ .n_name = "_pfsyncstats" },
-#define	N_AHSTAT	35
+#define	N_AHSTAT	24
 	{ .n_name = "_ahstat" },
-#define	N_ESPSTAT	36
+#define	N_ESPSTAT	25
 	{ .n_name = "_espstat" },
-#define	N_IPCOMPSTAT	37
+#define	N_IPCOMPSTAT	26
 	{ .n_name = "_ipcompstat" },
-#define	N_TCPSTAT	38
+#define	N_TCPSTAT	27
 	{ .n_name = "_tcpstat" },
-#define	N_UDPSTAT	39
+#define	N_UDPSTAT	28
 	{ .n_name = "_udpstat" },
-#define	N_IPSTAT	40
+#define	N_IPSTAT	29
 	{ .n_name = "_ipstat" },
-#define	N_ICMPSTAT	41
+#define	N_ICMPSTAT	30
 	{ .n_name = "_icmpstat" },
-#define	N_IGMPSTAT	42
+#define	N_IGMPSTAT	31
 	{ .n_name = "_igmpstat" },
-#define	N_PIMSTAT	43
+#define	N_PIMSTAT	32
 	{ .n_name = "_pimstat" },
-#define	N_RIP6STAT	44
+#define	N_RIP6STAT	33
 	{ .n_name = "_rip6stat" },
-#define	N_SCTPSTAT	45
+#define	N_SCTPSTAT	34
 	{ .n_name = "_sctpstat" },
-#define	N_MFCTABLESIZE	46
+#define	N_MFCTABLESIZE	35
 	{ .n_name = "_mfctablesize" },
 	{ .n_name = NULL },
 };
@@ -502,11 +480,9 @@
 		exit(0);
 	}
 	if (mflag) {
-		if (!live) {
-			if (kread(0, NULL, 0) == 0)
-				mbpr(kvmd, nl[N_MBSTAT].n_value);
-		} else
-			mbpr(NULL, 0);
+		if (!live)
+			kread(0, NULL, 0);
+		mbpr(kvmd);
 		exit(0);
 	}
 #if 0

==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/mbuf.c#3 (text+ko) ====

@@ -2,6 +2,7 @@
  * Copyright (c) 1983, 1988, 1993
  *	The Regents of the University of California.
  * Copyright (c) 2005 Robert N. M. Watson
+ * Copyright (c) 2009 Gabor Pali
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,272 +43,119 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/usr.bin/netstat/mbuf.c,v 1.54 2008/01/02 23:26:11 obrien Exp $");
 
-#include <sys/param.h>
-#include <sys/mbuf.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-
+#include <sys/types.h>
 #include <err.h>
 #include <kvm.h>
-#include <memstat.h>
-#include <stdint.h>
+#include <netstat.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include "extern.h"
 
 /*
  * Print mbuf statistics.
  */
 void
-mbpr(void *kvmd, u_long mbaddr)
+mbpr(void *kvmd)
 {
-	struct memory_type_list *mtlp;
-	struct memory_type *mtp;
-	uintmax_t mbuf_count, mbuf_bytes, mbuf_free, mbuf_failures, mbuf_size;
-	uintmax_t cluster_count, cluster_bytes, cluster_limit, cluster_free;
-	uintmax_t cluster_failures, cluster_size;
-	uintmax_t packet_count, packet_bytes, packet_free, packet_failures;
-	uintmax_t tag_count, tag_bytes;
-	uintmax_t jumbop_count, jumbop_bytes, jumbop_limit, jumbop_free;
-	uintmax_t jumbop_failures, jumbop_size;
-	uintmax_t jumbo9_count, jumbo9_bytes, jumbo9_limit, jumbo9_free;
-	uintmax_t jumbo9_failures, jumbo9_size;
-	uintmax_t jumbo16_count, jumbo16_bytes, jumbo16_limit, jumbo16_free;
-	uintmax_t jumbo16_failures, jumbo16_size;
-	uintmax_t bytes_inuse, bytes_incache, bytes_total;
-	int nsfbufs, nsfbufspeak, nsfbufsused;
-	struct mbstat mbstat;
-	size_t mlen;
-	int error;
+	struct mbuf_type *mbtp;
+	const struct buffer_type *mbuf, *cluster, *packet, *tag, *jumbop,
+	    *jumbo9, *jumbo16;
+	int mbt_flags, error;
 
-	mtlp = memstat_mtl_alloc();
-	if (mtlp == NULL) {
-		warn("memstat_mtl_alloc");
+	mbtp = netstat_mbt_alloc();
+	if (mbtp == NULL) {
+		warn("netstat_mbtp_alloc");
 		return;
 	}
 
-	/*
-	 * Use memstat_*_all() because some mbuf-related memory is in uma(9),
-	 * and some malloc(9).
-	 */
-	if (live) {
-		if (memstat_sysctl_all(mtlp, 0) < 0) {
-			warnx("memstat_sysctl_all: %s",
-			    memstat_strerror(memstat_mtl_geterror(mtlp)));
-			goto out;
-		}
-	} else {
-		if (memstat_kvm_all(mtlp, kvmd) < 0) {
-			error = memstat_mtl_geterror(mtlp);
-			if (error == MEMSTAT_ERROR_KVM)
-				warnx("memstat_kvm_all: %s",
-				    kvm_geterr(kvmd));
-			else
-				warnx("memstat_kvm_all: %s",
-				    memstat_strerror(error));
-			goto out;
-		}
-	}
+	mbt_flags = 0;
+	if (!live)
+		mbt_flags |= NETSTAT_MBUF_KVM;
 
-	mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_MEM_NAME);
-	if (mtp == NULL) {
-		warnx("memstat_mtl_find: zone %s not found", MBUF_MEM_NAME);
+	if (netstat_mbuf(mbtp, mbt_flags, kvmd) < 0) {
+		error = netstat_mbt_geterror(mbtp);
+		if (error == NETSTAT_ERROR_KVM)
+			warnx("netstat_mbuf: %s", kvm_geterr(kvmd));
+		else
+			warnx("netstat_mbuf: %s", netstat_strerror(error));
 		goto out;
 	}
-	mbuf_count = memstat_get_count(mtp);
-	mbuf_bytes = memstat_get_bytes(mtp);
-	mbuf_free = memstat_get_free(mtp);
-	mbuf_failures = memstat_get_failures(mtp);
-	mbuf_size = memstat_get_size(mtp);
 
-	mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_PACKET_MEM_NAME);
-	if (mtp == NULL) {
-		warnx("memstat_mtl_find: zone %s not found",
-		    MBUF_PACKET_MEM_NAME);
-		goto out;
-	}
-	packet_count = memstat_get_count(mtp);
-	packet_bytes = memstat_get_bytes(mtp);
-	packet_free = memstat_get_free(mtp);
-	packet_failures = memstat_get_failures(mtp);
-
-	mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_CLUSTER_MEM_NAME);
-	if (mtp == NULL) {
-		warnx("memstat_mtl_find: zone %s not found",
-		    MBUF_CLUSTER_MEM_NAME);
-		goto out;
-	}
-	cluster_count = memstat_get_count(mtp);
-	cluster_bytes = memstat_get_bytes(mtp);
-	cluster_limit = memstat_get_countlimit(mtp);
-	cluster_free = memstat_get_free(mtp);
-	cluster_failures = memstat_get_failures(mtp);
-	cluster_size = memstat_get_size(mtp);
-
-	mtp = memstat_mtl_find(mtlp, ALLOCATOR_MALLOC, MBUF_TAG_MEM_NAME);
-	if (mtp == NULL) {
-		warnx("memstat_mtl_find: malloc type %s not found",
-		    MBUF_TAG_MEM_NAME);
-		goto out;
-	}
-	tag_count = memstat_get_count(mtp);
-	tag_bytes = memstat_get_bytes(mtp);
-
-	mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_JUMBOP_MEM_NAME);
-	if (mtp == NULL) {
-		warnx("memstat_mtl_find: zone %s not found",
-		    MBUF_JUMBOP_MEM_NAME);
-		goto out;
-	}
-	jumbop_count = memstat_get_count(mtp);
-	jumbop_bytes = memstat_get_bytes(mtp);
-	jumbop_limit = memstat_get_countlimit(mtp);
-	jumbop_free = memstat_get_free(mtp);
-	jumbop_failures = memstat_get_failures(mtp);
-	jumbop_size = memstat_get_size(mtp);
-
-	mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_JUMBO9_MEM_NAME);
-	if (mtp == NULL) {
-		warnx("memstat_mtl_find: zone %s not found",
-		    MBUF_JUMBO9_MEM_NAME);
-		goto out;
-	}
-	jumbo9_count = memstat_get_count(mtp);
-	jumbo9_bytes = memstat_get_bytes(mtp);
-	jumbo9_limit = memstat_get_countlimit(mtp);
-	jumbo9_free = memstat_get_free(mtp);
-	jumbo9_failures = memstat_get_failures(mtp);
-	jumbo9_size = memstat_get_size(mtp);
+	mbuf = netstat_mbt_get_mbuf(mbtp);
+	cluster = netstat_mbt_get_cluster(mbtp);
+	packet = netstat_mbt_get_packet(mbtp);
+	tag = netstat_mbt_get_tag(mbtp);
+	jumbop = netstat_mbt_get_jumbop(mbtp);
+	jumbo9 = netstat_mbt_get_jumbo9(mbtp);
+	jumbo16 = netstat_mbt_get_jumbo16(mbtp);
 
-	mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_JUMBO16_MEM_NAME);
-	if (mtp == NULL) {
-		warnx("memstat_mtl_find: zone %s not found",
-		    MBUF_JUMBO16_MEM_NAME);
-		goto out;
-	}
-	jumbo16_count = memstat_get_count(mtp);
-	jumbo16_bytes = memstat_get_bytes(mtp);
-	jumbo16_limit = memstat_get_countlimit(mtp);
-	jumbo16_free = memstat_get_free(mtp);
-	jumbo16_failures = memstat_get_failures(mtp);
-	jumbo16_size = memstat_get_size(mtp);
-
 	printf("%ju/%ju/%ju mbufs in use (current/cache/total)\n",
-	    mbuf_count + packet_count, mbuf_free + packet_free,
-	    mbuf_count + packet_count + mbuf_free + packet_free);
+	    netstat_bt_get_count(mbuf) + netstat_bt_get_count(packet),
+	    netstat_bt_get_free(mbuf) + netstat_bt_get_free(packet),
+	    netstat_bt_get_count(mbuf) + netstat_bt_get_count(packet) +
+	    netstat_bt_get_free(mbuf) + netstat_bt_get_free(packet));
 
 	printf("%ju/%ju/%ju/%ju mbuf clusters in use "
 	    "(current/cache/total/max)\n",
-	    cluster_count - packet_free, cluster_free + packet_free,
-	    cluster_count + cluster_free, cluster_limit);
+	    netstat_bt_get_count(cluster) - netstat_bt_get_free(packet),
+	    netstat_bt_get_free(cluster) + netstat_bt_get_free(packet),
+	    netstat_bt_get_count(cluster) + netstat_bt_get_free(cluster),
+	    netstat_bt_get_limit(cluster));
 
 	printf("%ju/%ju mbuf+clusters out of packet secondary zone in use "
 	    "(current/cache)\n",
-	    packet_count, packet_free);
+	    netstat_bt_get_count(packet), netstat_bt_get_free(packet));
 
 	printf("%ju/%ju/%ju/%ju %juk (page size) jumbo clusters in use "
 	    "(current/cache/total/max)\n",
-	    jumbop_count, jumbop_free, jumbop_count + jumbop_free,
-	    jumbop_limit, jumbop_size / 1024);
+	    netstat_bt_get_count(jumbop), netstat_bt_get_free(jumbop),
+	    netstat_bt_get_count(jumbop) + netstat_bt_get_free(jumbop),
+	    netstat_bt_get_limit(jumbop), netstat_bt_get_size(jumbop) / 1024);
 
 	printf("%ju/%ju/%ju/%ju 9k jumbo clusters in use "
 	    "(current/cache/total/max)\n",
-	    jumbo9_count, jumbo9_free, jumbo9_count + jumbo9_free,
-	    jumbo9_limit);
+	    netstat_bt_get_count(jumbo9), netstat_bt_get_free(jumbo9),
+	    netstat_bt_get_count(jumbo9) + netstat_bt_get_free(jumbo9),
+	    netstat_bt_get_limit(jumbo9));
 
 	printf("%ju/%ju/%ju/%ju 16k jumbo clusters in use "
 	    "(current/cache/total/max)\n",
-	    jumbo16_count, jumbo16_free, jumbo16_count + jumbo16_free,
-	    jumbo16_limit);
+	    netstat_bt_get_count(jumbo16), netstat_bt_get_free(jumbo16),
+	    netstat_bt_get_count(jumbo16) + netstat_bt_get_free(jumbo16),
+	    netstat_bt_get_limit(jumbo16));
 
 #if 0
-	printf("%ju mbuf tags in use\n", tag_count);
+	printf("%ju mbuf tags in use\n", netstat_bt_get_count(tag));
 #endif
 
-	/*-
-	 * Calculate in-use bytes as:
-	 * - straight mbuf memory
-	 * - mbuf memory in packets
-	 * - the clusters attached to packets
-	 * - and the rest of the non-packet-attached clusters.
-	 * - m_tag memory
-	 * This avoids counting the clusters attached to packets in the cache.
-	 * This currently excludes sf_buf space.
-	 */
-	bytes_inuse =
-	    mbuf_bytes +			/* straight mbuf memory */
-	    packet_bytes +			/* mbufs in packets */
-	    (packet_count * cluster_size) +	/* clusters in packets */
-	    /* other clusters */
-	    ((cluster_count - packet_count - packet_free) * cluster_size) +
-	    tag_bytes +
-	    (jumbop_count * jumbop_size) +	/* jumbo clusters */
-	    (jumbo9_count * jumbo9_size) +
-	    (jumbo16_count * jumbo16_size);
-
-	/*
-	 * Calculate in-cache bytes as:
-	 * - cached straught mbufs
-	 * - cached packet mbufs
-	 * - cached packet clusters
-	 * - cached straight clusters
-	 * This currently excludes sf_buf space.
-	 */
-	bytes_incache =
-	    (mbuf_free * mbuf_size) +		/* straight free mbufs */
-	    (packet_free * mbuf_size) +		/* mbufs in free packets */
-	    (packet_free * cluster_size) +	/* clusters in free packets */
-	    (cluster_free * cluster_size) +	/* free clusters */
-	    (jumbop_free * jumbop_size) +	/* jumbo clusters */
-	    (jumbo9_free * jumbo9_size) +
-	    (jumbo16_free * jumbo16_size);
-
-	/*
-	 * Total is bytes in use + bytes in cache.  This doesn't take into
-	 * account various other misc data structures, overhead, etc, but
-	 * gives the user something useful despite that.
-	 */
-	bytes_total = bytes_inuse + bytes_incache;
-
 	printf("%juK/%juK/%juK bytes allocated to network "
-	    "(current/cache/total)\n", bytes_inuse / 1024,
-	    bytes_incache / 1024, bytes_total / 1024);
+	    "(current/cache/total)\n",
+	    netstat_mbt_get_bytes_inuse(mbtp) / 1024,
+	    netstat_mbt_get_bytes_incache(mbtp) / 1024,
+	    netstat_mbt_get_bytes_total(mbtp) / 1024);
 
 	printf("%ju/%ju/%ju requests for mbufs denied (mbufs/clusters/"
-	    "mbuf+clusters)\n", mbuf_failures, cluster_failures,
-	    packet_failures);
+	    "mbuf+clusters)\n", netstat_bt_get_failures(mbuf),
+	    netstat_bt_get_failures(cluster), netstat_bt_get_failures(packet));
 
 	printf("%ju/%ju/%ju requests for jumbo clusters denied "
-	    "(%juk/9k/16k)\n", jumbop_failures, jumbo9_failures,
-	    jumbo16_failures, jumbop_size / 1024);
+	    "(%juk/9k/16k)\n", netstat_bt_get_failures(jumbop),
+	    netstat_bt_get_failures(jumbo9), netstat_bt_get_failures(jumbo16),
+	    netstat_bt_get_size(jumbop) / 1024);
+ 
+	printf("%ju/%ju/%ju sfbufs in use (current/peak/max)\n",
+	    netstat_mbt_get_sf_bufs_inuse(mbtp),
+	    netstat_mbt_get_sf_bufs_peak(mbtp),
+	    netstat_mbt_get_sf_bufs(mbtp));
 
-	if (live) {
-		mlen = sizeof(nsfbufs);
-		if (!sysctlbyname("kern.ipc.nsfbufs", &nsfbufs, &mlen, NULL,
-		    0) &&
-		    !sysctlbyname("kern.ipc.nsfbufsused", &nsfbufsused,
-		    &mlen, NULL, 0) &&
-		    !sysctlbyname("kern.ipc.nsfbufspeak", &nsfbufspeak,
-		    &mlen, NULL, 0))
-			printf("%d/%d/%d sfbufs in use (current/peak/max)\n",
-			    nsfbufsused, nsfbufspeak, nsfbufs);
-		mlen = sizeof(mbstat);
-		if (sysctlbyname("kern.ipc.mbstat", &mbstat, &mlen, NULL, 0)) {
-			warn("kern.ipc.mbstat");
-			goto out;
-		}
-	} else {
-		if (kread(mbaddr, (char *)&mbstat, sizeof mbstat) != 0)
-			goto out;
-	}
-	printf("%lu requests for sfbufs denied\n", mbstat.sf_allocfail);
-	printf("%lu requests for sfbufs delayed\n", mbstat.sf_allocwait);
-	printf("%lu requests for I/O initiated by sendfile\n",
-	    mbstat.sf_iocnt);
-	printf("%lu calls to protocol drain routines\n", mbstat.m_drain);
+	printf("%ju requests for sfbufs denied\n",
+	    netstat_mbt_get_sf_allocfail(mbtp));
+	printf("%ju requests for sfbufs delayed\n",
+	    netstat_mbt_get_sf_allocwait(mbtp));
+	printf("%ju requests for I/O initiated by sendfile\n",
+	    netstat_mbt_get_sf_iocnt(mbtp));
+	printf("%ju calls to protocol drain routines\n",
+	    netstat_mbt_get_drain(mbtp));
 out:
-	memstat_mtl_free(mtlp);
+	netstat_mbt_free(mbtp);
 }


More information about the p4-projects mailing list