Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/libexec/rpc.rstatd Remove majority of KVM usage.



details:   https://anonhg.NetBSD.org/src/rev/75c6bda810a2
branches:  trunk
changeset: 796421:75c6bda810a2
user:      joerg <joerg%NetBSD.org@localhost>
date:      Mon Jun 02 18:17:51 2014 +0000

description:
Remove majority of KVM usage.

diffstat:

 libexec/rpc.rstatd/rstat_proc.c |  107 ++++++++++-----------------------------
 1 files changed, 28 insertions(+), 79 deletions(-)

diffs (180 lines):

diff -r d94eade0069f -r 75c6bda810a2 libexec/rpc.rstatd/rstat_proc.c
--- a/libexec/rpc.rstatd/rstat_proc.c   Mon Jun 02 17:40:05 2014 +0000
+++ b/libexec/rpc.rstatd/rstat_proc.c   Mon Jun 02 18:17:51 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rstat_proc.c,v 1.48 2014/06/02 17:40:05 joerg Exp $    */
+/*     $NetBSD: rstat_proc.c,v 1.49 2014/06/02 18:17:51 joerg Exp $    */
 
 /*
  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: rstat_proc.c,v 1.48 2014/06/02 17:40:05 joerg Exp $");
+__RCSID("$NetBSD: rstat_proc.c,v 1.49 2014/06/02 18:17:51 joerg Exp $");
 
 /*
  * rstat service:  built with rstat.x and derived from rpc.rstatd.c
@@ -41,6 +41,7 @@
 #include <sys/param.h>
 #include <sys/sched.h>
 #include <sys/socket.h>
+#include <sys/ioctl.h>
 
 #include <errno.h>
 #include <stdio.h>
@@ -48,7 +49,6 @@
 #include <string.h>
 #include <signal.h>
 #include <fcntl.h>
-#include <kvm.h>
 #include <limits.h>
 #include <nlist.h>
 #include <syslog.h>
@@ -89,13 +89,9 @@
 int hz;
 char *memf = NULL, *nlistf = NULL;
 
-struct ifnet_head ifnetq;      /* chain of ethernet interfaces */
-unsigned int numintfs;
-
 extern int from_inetd;
 int sincelastreq = 0;          /* number of alarms since last request */
 extern int closedown;
-kvm_t *kfd;
 
 union {
        struct stats s1;
@@ -104,8 +100,6 @@
 } stats_all;
 
 void updatestat(int);
-void setup(void);
-void setup_kd_once(void);
 void stat_init(void);
 int havedisk(void);
 void rstat_service(struct svc_req *, SVCXPRT *);
@@ -120,7 +114,7 @@
 stat_init(void)
 {
        stat_is_init = 1;
-       setup();
+       drvinit(0);
        updatestat(0);
        (void) signal(SIGALRM, updatestat);
        alarm(1);
@@ -182,12 +176,11 @@
 void
 updatestat(int dummy)
 {
-       long off;
-       unsigned int i;
-       size_t len;
-       int mib[2];
+       struct if_nameindex *ifps;
+       struct ifdatareq ifdr;
+       size_t i, len;
+       int mib[2], s;
        struct uvmexp_sysctl uvmexp;
-       struct ifnet ifnet;
        double avrun[3];
        struct timeval tm, btm;
 
@@ -261,76 +254,32 @@
        stats_all.s3.if_ierrors = 0;
        stats_all.s3.if_oerrors = 0;
        stats_all.s3.if_collisions = 0;
-       for (off = (long)ifnetq.tqh_first, i = 0; off && i < numintfs; i++) {
-               if (kvm_read(kfd, off, (char *)&ifnet, sizeof ifnet) !=
-                   sizeof ifnet) {
-                       syslog(LOG_ERR, "can't read ifnet from kmem");
-                       exit(1);
-               }
-               stats_all.s3.if_ipackets += ifnet.if_data.ifi_ipackets;
-               stats_all.s3.if_opackets += ifnet.if_data.ifi_opackets;
-               stats_all.s3.if_ierrors += ifnet.if_data.ifi_ierrors;
-               stats_all.s3.if_oerrors += ifnet.if_data.ifi_oerrors;
-               stats_all.s3.if_collisions += ifnet.if_data.ifi_collisions;
-               off = (long)ifnet.if_list.tqe_next;
+
+       ifps = if_nameindex();
+       if (ifps == NULL) {
+               syslog(LOG_ERR, "can't read interface list from kernel");
+               exit(1);
        }
+       s = socket(AF_INET, SOCK_DGRAM, 0);
+       for (i = 0; s != -1 && ifps[i].if_name != NULL; ++i) {
+               strncpy(ifdr.ifdr_name, ifps[i].if_name, sizeof(ifdr.ifdr_name));
+               if (ioctl(s, SIOCGIFDATA, &ifdr) != 0)
+                       continue;
+               stats_all.s3.if_ipackets += ifdr.ifdr_data.ifi_ipackets;
+               stats_all.s3.if_opackets += ifdr.ifdr_data.ifi_opackets;
+               stats_all.s3.if_ierrors += ifdr.ifdr_data.ifi_ierrors;
+               stats_all.s3.if_oerrors += ifdr.ifdr_data.ifi_oerrors;
+               stats_all.s3.if_collisions += ifdr.ifdr_data.ifi_collisions;
+       }
+       if (s != -1)
+               close(s);
+       if_freenameindex(ifps);
+
        stats_all.s3.curtime.tv_sec = tm.tv_sec;
        stats_all.s3.curtime.tv_usec = tm.tv_usec;
        alarm(1);
 }
 
-void
-setup_kd_once(void)
-{
-        char errbuf[_POSIX2_LINE_MAX];
-        kfd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
-        if (kfd == NULL) {
-                syslog(LOG_ERR, "%s", errbuf);
-                exit (1);
-        }
-}
-
-void
-setup(void)
-{
-       struct ifnet ifnet;
-       long off;
-        static int is_kfd_setup = 0;
-
-        /*  setup() is called after each dormant->active
-         *  transition.  Since we never close the kvm files
-         *  (there's no reason), make sure we don't open them
-         *  each time, as that can lead to exhaustion of all open
-         *  files!  */
-        if (!is_kfd_setup) {
-                setup_kd_once();
-                is_kfd_setup = 1;
-       }
-
-       if (kvm_nlist(kfd, nl) != 0) {
-               syslog(LOG_ERR, "can't get namelist");
-               exit (1);
-        }
-
-       if (kvm_read(kfd, (long)nl[X_IFNET].n_value, &ifnetq,
-                     sizeof ifnetq) != sizeof ifnetq)  {
-               syslog(LOG_ERR, "can't read ifnet queue head from kmem");
-               exit(1);
-        }
-
-       numintfs = 0;
-       for (off = (long)ifnetq.tqh_first; off;) {
-               if (kvm_read(kfd, off, (char *)&ifnet, sizeof ifnet) !=
-                   sizeof ifnet) {
-                       syslog(LOG_ERR, "can't read ifnet from kmem");
-                       exit(1);
-               }
-               numintfs++;
-               off = (long)ifnet.if_list.tqe_next;
-       }
-       drvinit(0);
-}
-
 /*
  * returns true if have a disk
  */



Home | Main Index | Thread Index | Old Index