=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/systat/mbufs.c,v retrieving revision 1.34 retrieving revision 1.35 diff -c -r1.34 -r1.35 *** src/usr.bin/systat/mbufs.c 2014/07/02 00:12:34 1.34 --- src/usr.bin/systat/mbufs.c 2014/07/08 05:35:19 1.35 *************** *** 1,4 **** ! /* $OpenBSD: mbufs.c,v 1.34 2014/07/02 00:12:34 dlg Exp $ */ /* * Copyright (c) 2008 Can Erkin Acar * --- 1,4 ---- ! /* $OpenBSD: mbufs.c,v 1.35 2014/07/08 05:35:19 dlg Exp $ */ /* * Copyright (c) 2008 Can Erkin Acar * *************** *** 21,26 **** --- 21,28 ---- #include #include #include + #include + #include #include #include *************** *** 30,61 **** #include "systat.h" ! ! /* pool info for mcl* pools */ ! struct mclpool_info { ! char title[16]; ! int pool_offset; ! int size; ! } mclpools[MCLPOOLS]; ! ! int mclpool_count = 0; int mbpool_index = -1; struct kinfo_pool mbpool; u_int mcllivelocks, mcllivelocks_cur, mcllivelocks_diff; /* interfaces */ ! static int num_ifs; struct if_info { char name[16]; ! struct if_data data; } *interfaces = NULL; void print_mb(void); int read_mb(void); int select_mb(void); static void showmbuf(struct if_info *, int, int); - /* Define fields */ field_def fields_mbuf[] = { {"IFACE", 8, 16, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0}, --- 32,58 ---- #include "systat.h" ! /* pool info */ int mbpool_index = -1; + int mclpools_index[MCLPOOLS]; + int mclpool_count = 0; struct kinfo_pool mbpool; u_int mcllivelocks, mcllivelocks_cur, mcllivelocks_diff; /* interfaces */ ! static int num_ifs = 0; struct if_info { char name[16]; ! struct if_rxrinfo data; } *interfaces = NULL; + static int sock; + void print_mb(void); int read_mb(void); int select_mb(void); static void showmbuf(struct if_info *, int, int); /* Define fields */ field_def fields_mbuf[] = { {"IFACE", 8, 16, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0}, *************** *** 104,117 **** int initmembufs(void) { field_view *v; int i, mib[4], npools; struct kinfo_pool pool; char pname[32]; size_t size; /* go through all pools to identify mbuf and cluster pools */ - bzero(mclpools, sizeof(mclpools)); mib[0] = CTL_KERN; mib[1] = KERN_POOL; --- 101,135 ---- int initmembufs(void) { + struct if_rxring_info *ifr; field_view *v; int i, mib[4], npools; struct kinfo_pool pool; char pname[32]; size_t size; + sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock == -1) { + err(1, "socket()"); + /* NOTREACHED */ + } + + /* set up the "System" interface */ + + interfaces = calloc(1, sizeof(*interfaces)); + if (interfaces == NULL) + err(1, "calloc: interfaces"); + + ifr = calloc(MCLPOOLS, sizeof(*ifr)); + if (ifr == NULL) + err(1, "calloc: system pools"); + + strlcpy(interfaces[0].name, "System", sizeof(interfaces[0].name)); + interfaces[0].data.ifri_total = MCLPOOLS; + interfaces[0].data.ifri_entries = ifr; + num_ifs = 1; + /* go through all pools to identify mbuf and cluster pools */ mib[0] = CTL_KERN; mib[1] = KERN_POOL; *************** *** 154,166 **** /* NOTREACHED */ } ! mclpools[mclpool_count].size = pool.pr_size; ! mclpools[mclpool_count].pool_offset = i; ! snprintf(mclpools[mclpool_count].title, ! sizeof(mclpools[0].title), "%dk", pool.pr_size / 1024); ! mclpool_count++; } if (mclpool_count != MCLPOOLS) --- 172,183 ---- /* NOTREACHED */ } ! snprintf(ifr[mclpool_count].ifr_name, ! sizeof(ifr[mclpool_count].ifr_name), "%dk", pool.pr_size / 1024); + ifr[mclpool_count].ifr_size = pool.pr_size; ! mclpools_index[mclpool_count++] = i; } if (mclpool_count != MCLPOOLS) *************** *** 170,176 **** for (v = views_mb; v->name != NULL; v++) add_view(v); - /* finally read it once */ read_mb(); --- 187,192 ---- *************** *** 190,197 **** struct kinfo_pool pool; struct ifaddrs *ifap, *ifa; struct if_info *ifi; int mib[4]; ! int i, p, nif, ret = 1; size_t size; mib[0] = CTL_KERN; --- 206,215 ---- struct kinfo_pool pool; struct ifaddrs *ifap, *ifa; struct if_info *ifi; + struct if_rxring_info *ifr; int mib[4]; ! int i, p, nif, ret = 1, rv; ! u_int rings; size_t size; mib[0] = CTL_KERN; *************** *** 212,237 **** } nif = 1; ! for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) ! if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_LINK) ! nif++; ! if (interfaces == NULL || num_ifs < nif) { ! size_t len = sizeof(*ifi) * nif; ! if (nif > SIZE_MAX / sizeof(*ifi)) { ! error("overflow allocting %u interfaces", nif); ! goto exit; ! } ! ifi = realloc(interfaces, len); if (ifi == NULL) { ! error("realloc: out of memory allocating %lld bytes", ! (long long) len); goto exit; } interfaces = ifi; ! num_ifs = nif; } /* Fill in the "real" interfaces */ --- 230,253 ---- } nif = 1; ! for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { ! if (ifa->ifa_addr == NULL || ! ifa->ifa_addr->sa_family != AF_LINK) ! continue; ! nif++; ! } ! if (num_ifs < nif) { ! ifi = reallocarray(interfaces, nif, sizeof(*interfaces)); if (ifi == NULL) { ! error("reallocarray: %d interfaces", nif); goto exit; } interfaces = ifi; ! while (num_ifs < nif) ! memset(&interfaces[num_ifs++], 0, sizeof(*interfaces)); } /* Fill in the "real" interfaces */ *************** *** 243,259 **** continue; strlcpy(ifi->name, ifa->ifa_name, sizeof(ifi->name)); ! if (ifa->ifa_data) ! memcpy(&ifi->data, ifa->ifa_data, sizeof(ifi->data)); ! else ! bzero(&ifi->data, sizeof(ifi->data)); ifi++; } /* Fill in the "System" entry from pools */ - bzero(interfaces, sizeof(interfaces[0])); - strlcpy(interfaces[0].name, "System", sizeof(interfaces[0].name)); mib[0] = CTL_KERN; mib[1] = KERN_POOL; --- 259,305 ---- continue; strlcpy(ifi->name, ifa->ifa_name, sizeof(ifi->name)); + for (;;) { + struct ifreq ifreq; + rings = ifi->data.ifri_total; ! memset(&ifreq, 0, sizeof(ifreq)); ! strlcpy(ifreq.ifr_name, ifa->ifa_name, ! sizeof(ifreq.ifr_name)); ! ifreq.ifr_data = (caddr_t)&ifi->data; ! ! rv = ioctl(sock, SIOCGIFRXR, &ifreq); ! if (rv == -1) { ! if (errno == ENOTTY) { ! free(ifi->data.ifri_entries); ! ifi->data.ifri_total = 0; ! ifi->data.ifri_entries = NULL; ! break; ! } ! ! error("ioctl(SIOCGIFRXR) %s", strerror(errno)); ! break; ! } ! ! if (rings >= ifi->data.ifri_total) ! break; ! ! ifr = reallocarray(ifi->data.ifri_entries, ! ifi->data.ifri_total, sizeof(*ifr)); ! if (ifr == NULL) { ! ifi->data.ifri_total = rings; ! error("reallocarray: %u rings", ! ifi->data.ifri_total); ! goto exit; ! } ! ! ifi->data.ifri_entries = ifr; ! } ! ifi++; } /* Fill in the "System" entry from pools */ mib[0] = CTL_KERN; mib[1] = KERN_POOL; *************** *** 267,275 **** } for (i = 0; i < mclpool_count; i++) { ! struct mclpool *mp = &interfaces[0].data.ifi_mclpool[i]; ! mib[3] = mclpools[i].pool_offset; size = sizeof(pool); if (sysctl(mib, 4, &pool, &size, NULL, 0) < 0) { --- 313,321 ---- } for (i = 0; i < mclpool_count; i++) { ! ifr = &interfaces[0].data.ifri_entries[i]; ! mib[3] = mclpools_index[i]; size = sizeof(pool); if (sysctl(mib, 4, &pool, &size, NULL, 0) < 0) { *************** *** 277,285 **** continue; } ! mp->mcl_livelocks = mcllivelocks; ! mp->mcl_alive = pool.pr_nget - pool.pr_nput; ! mp->mcl_hwm = pool.pr_hiwat; } num_disp = 1; --- 323,330 ---- continue; } ! ifr->ifr_info.rxr_alive = pool.pr_nget - pool.pr_nput; ! ifr->ifr_info.rxr_hwm = pool.pr_hiwat; } num_disp = 1; *************** *** 288,296 **** for (i = 0; i < num_ifs; i++) { struct if_info *ifi = &interfaces[i]; int pnd = num_disp; ! for (p = 0; p < mclpool_count; p++) { ! struct mclpool *mp = &ifi->data.ifi_mclpool[p]; ! if (mp->mcl_alive == 0) continue; num_disp++; } --- 333,341 ---- for (i = 0; i < num_ifs; i++) { struct if_info *ifi = &interfaces[i]; int pnd = num_disp; ! for (p = 0; p < ifi->data.ifri_total; p++) { ! ifr = &ifi->data.ifri_entries[p]; ! if (ifr->ifr_info.rxr_alive == 0); continue; num_disp++; } *************** *** 318,326 **** if (maxprint > 0 && count >= maxprint) return; ! for (p = 0; p < mclpool_count; p++) { ! struct mclpool *mp = &ifi->data.ifi_mclpool[p]; ! if (mp->mcl_alive == 0) continue; if (n++ >= dispstart) { showmbuf(ifi, p, showif); --- 363,371 ---- if (maxprint > 0 && count >= maxprint) return; ! for (p = 0; p < ifi->data.ifri_total; p++) { ! struct if_rxring_info *ifr = &ifi->data.ifri_entries[p]; ! if (ifr->ifr_info.rxr_alive == 0) continue; if (n++ >= dispstart) { showmbuf(ifi, p, showif); *************** *** 336,343 **** count++; } } - - } } --- 381,386 ---- *************** *** 356,375 **** } if (p >= 0 && p < mclpool_count) { ! struct mclpool *mp = &ifi->data.ifi_mclpool[p]; ! int livelocks_diff; ! ! livelocks_diff = mp->mcl_livelocks - mcllivelocks; ! if (livelocks_diff) ! print_fld_uint(FLD_MB_LLOCKS, livelocks_diff); ! print_fld_str(FLD_MB_MSIZE, mclpools[p].title); ! print_fld_uint(FLD_MB_MALIVE, mp->mcl_alive); ! if (mp->mcl_lwm) ! print_fld_size(FLD_MB_MLWM, mp->mcl_lwm); ! if (mp->mcl_hwm) ! print_fld_size(FLD_MB_MHWM, mp->mcl_hwm); ! if (mp->mcl_cwm) ! print_fld_size(FLD_MB_MCWM, mp->mcl_cwm); } end_line(); --- 399,414 ---- } if (p >= 0 && p < mclpool_count) { ! struct if_rxring_info *ifr = &ifi->data.ifri_entries[p]; ! struct if_rxring *rxr= &ifr->ifr_info; ! print_fld_uint(FLD_MB_MSIZE, ifr->ifr_size); ! print_fld_uint(FLD_MB_MALIVE, rxr->rxr_alive); ! if (rxr->rxr_lwm) ! print_fld_size(FLD_MB_MLWM, rxr->rxr_lwm); ! if (rxr->rxr_hwm) ! print_fld_size(FLD_MB_MHWM, rxr->rxr_hwm); ! if (rxr->rxr_cwm) ! print_fld_size(FLD_MB_MCWM, rxr->rxr_cwm); } end_line();