Source-Changes-HG archive

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

[src/trunk]: src/sys/net add drop count which means the sum of struct if_perc...



details:   https://anonhg.NetBSD.org/src/rev/9c3fdfdf91cf
branches:  trunk
changeset: 344337:9c3fdfdf91cf
user:      knakahara <knakahara%NetBSD.org@localhost>
date:      Wed Mar 23 07:05:28 2016 +0000

description:
add drop count which means the sum of struct if_percpuq's per-CPU queues.

ok by ozaki-r@n.o

diffstat:

 sys/net/if.c |  105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 103 insertions(+), 2 deletions(-)

diffs (140 lines):

diff -r c54e9e69d14e -r 9c3fdfdf91cf sys/net/if.c
--- a/sys/net/if.c      Wed Mar 23 06:59:59 2016 +0000
+++ b/sys/net/if.c      Wed Mar 23 07:05:28 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if.c,v 1.326 2016/03/07 01:41:55 ozaki-r Exp $ */
+/*     $NetBSD: if.c,v 1.327 2016/03/23 07:05:28 knakahara Exp $       */
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.326 2016/03/07 01:41:55 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.327 2016/03/23 07:05:28 knakahara Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -210,6 +210,11 @@
 
 static struct mbuf *if_percpuq_dequeue(struct if_percpuq *);
 
+static void if_percpuq_drops(void *, void *, struct cpu_info *);
+static int sysctl_percpuq_drops_handler(SYSCTLFN_PROTO);
+static void sysctl_percpuq_setup(struct sysctllog **, const char *,
+    struct if_percpuq *);
+
 #if defined(INET) || defined(INET6)
 static void sysctl_net_pktq_setup(struct sysctllog **, int);
 #endif
@@ -718,6 +723,8 @@
        ipq->ipq_ifqs = percpu_alloc(sizeof(struct ifqueue));
        percpu_foreach(ipq->ipq_ifqs, &if_percpuq_init_ifq, NULL);
 
+       sysctl_percpuq_setup(&ifp->if_sysctl_log, ifp->if_xname, ipq);
+
        return ipq;
 }
 
@@ -782,6 +789,100 @@
        splx(s);
 }
 
+static void
+if_percpuq_drops(void *p, void *arg, struct cpu_info *ci __unused)
+{
+       struct ifqueue *const ifq = p;
+       int *sum = arg;
+
+       *sum += ifq->ifq_drops;
+}
+
+static int
+sysctl_percpuq_drops_handler(SYSCTLFN_ARGS)
+{
+       struct sysctlnode node;
+       struct if_percpuq *ipq;
+       int sum = 0;
+       int error;
+
+       node = *rnode;
+       ipq = node.sysctl_data;
+
+       percpu_foreach(ipq->ipq_ifqs, if_percpuq_drops, &sum);
+
+       node.sysctl_data = &sum;
+       error = sysctl_lookup(SYSCTLFN_CALL(&node));
+       if (error != 0 || newp == NULL)
+               return error;
+
+       return 0;
+}
+
+static void
+sysctl_percpuq_setup(struct sysctllog **clog, const char* ifname,
+    struct if_percpuq *ipq)
+{
+       const struct sysctlnode *cnode, *rnode;
+
+       if (sysctl_createv(clog, 0, NULL, &rnode,
+                      CTLFLAG_PERMANENT,
+                      CTLTYPE_NODE, "interfaces",
+                      SYSCTL_DESCR("Per-interface controls"),
+                      NULL, 0, NULL, 0,
+                      CTL_NET, CTL_CREATE, CTL_EOL) != 0)
+               goto bad;
+
+       if (sysctl_createv(clog, 0, &rnode, &rnode,
+                      CTLFLAG_PERMANENT,
+                      CTLTYPE_NODE, ifname,
+                      SYSCTL_DESCR("Interface controls"),
+                      NULL, 0, NULL, 0,
+                      CTL_CREATE, CTL_EOL) != 0)
+               goto bad;
+
+       if (sysctl_createv(clog, 0, &rnode, &rnode,
+                      CTLFLAG_PERMANENT,
+                      CTLTYPE_NODE, "rcvq",
+                      SYSCTL_DESCR("Interface input queue controls"),
+                      NULL, 0, NULL, 0,
+                      CTL_CREATE, CTL_EOL) != 0)
+               goto bad;
+
+#ifdef NOTYET
+       /* XXX Should show each per-CPU queue length? */
+       if (sysctl_createv(clog, 0, &rnode, &rnode,
+                      CTLFLAG_PERMANENT,
+                      CTLTYPE_INT, "len",
+                      SYSCTL_DESCR("Current input queue length"),
+                      sysctl_percpuq_len, 0, NULL, 0,
+                      CTL_CREATE, CTL_EOL) != 0)
+               goto bad;
+
+       if (sysctl_createv(clog, 0, &rnode, &cnode,
+                      CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+                      CTLTYPE_INT, "maxlen",
+                      SYSCTL_DESCR("Maximum allowed input queue length"),
+                      sysctl_percpuq_maxlen_handler, 0, (void *)ipq, 0,
+                      CTL_CREATE, CTL_EOL) != 0)
+               goto bad;
+#endif
+
+       if (sysctl_createv(clog, 0, &rnode, &cnode,
+                      CTLFLAG_PERMANENT,
+                      CTLTYPE_INT, "drops",
+                      SYSCTL_DESCR("Total packets dropped due to full input queue"),
+                      sysctl_percpuq_drops_handler, 0, (void *)ipq, 0,
+                      CTL_CREATE, CTL_EOL) != 0)
+               goto bad;
+
+       return;
+bad:
+       printf("%s: could not attach sysctl nodes\n", ifname);
+       return;
+}
+
+
 /*
  * The common interface input routine that is called by device drivers,
  * which should be used only when the driver's rx handler already runs



Home | Main Index | Thread Index | Old Index