I tested this by diff'ing sysctl output before/after on amd64. Since
there's a bunch of ifdef'ness I verified RAMDISK still builds.

I deliberately didn't fix the indentation to keep this diff a pure line
motion (would run over 80 chars otherwise). I can either fix that it in
a separate commit or in this one before submitting.

OK?

Subject: [PATCH] Reduce case duplication in kern_sysctl

This changes amd64 GENERIC.MP .text size of kern_sysctl.o from 6440 to 6400.
Surprisingly, RAMDISK grows from 1645 to 1678.
---
 sys/kern/kern_sysctl.c | 180 ++++++++++++++++++-----------------------
 1 file changed, 79 insertions(+), 101 deletions(-)

diff --git sys/kern/kern_sysctl.c sys/kern/kern_sysctl.c
index 82010e3ee1c..72686560b5d 100644
--- sys/kern/kern_sysctl.c
+++ sys/kern/kern_sysctl.c
@@ -356,31 +356,87 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
        dev_t dev;
        extern int pool_debug;
 
-       /* all sysctl names at this level are terminal except a ton of them */
+       /* dispatch the non-terminal nodes first */
        if (namelen != 1) {
                switch (name[0]) {
-               case KERN_PROC:
-               case KERN_PROF:
-               case KERN_MALLOCSTATS:
-               case KERN_TTY:
-               case KERN_POOL:
-               case KERN_PROC_ARGS:
-               case KERN_PROC_CWD:
-               case KERN_PROC_NOBROADCASTKILL:
-               case KERN_PROC_VMMAP:
-               case KERN_SYSVIPC_INFO:
-               case KERN_SEMINFO:
-               case KERN_SHMINFO:
-               case KERN_INTRCNT:
-               case KERN_WATCHDOG:
-               case KERN_EVCOUNT:
-               case KERN_TIMECOUNTER:
-               case KERN_CPTIME2:
-               case KERN_FILE:
-               case KERN_WITNESS:
-               case KERN_AUDIO:
-               case KERN_CPUSTATS:
-                       break;
+#ifndef SMALL_KERNEL
+       case KERN_PROC:
+               return (sysctl_doproc(name + 1, namelen - 1, oldp, oldlenp));
+       case KERN_PROC_ARGS:
+               return (sysctl_proc_args(name + 1, namelen - 1, oldp, oldlenp,
+                    p));
+       case KERN_PROC_CWD:
+               return (sysctl_proc_cwd(name + 1, namelen - 1, oldp, oldlenp,
+                    p));
+       case KERN_PROC_NOBROADCASTKILL:
+               return (sysctl_proc_nobroadcastkill(name + 1, namelen - 1,
+                    newp, newlen, oldp, oldlenp, p));
+       case KERN_PROC_VMMAP:
+               return (sysctl_proc_vmmap(name + 1, namelen - 1, oldp, oldlenp,
+                    p));
+       case KERN_FILE:
+               return (sysctl_file(name + 1, namelen - 1, oldp, oldlenp, p));
+#endif
+#if defined(GPROF) || defined(DDBPROF)
+       case KERN_PROF:
+               return (sysctl_doprof(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+#endif
+       case KERN_MALLOCSTATS:
+               return (sysctl_malloc(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen, p));
+       case KERN_TTY:
+               return (sysctl_tty(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+       case KERN_POOL:
+               return (sysctl_dopool(name + 1, namelen - 1, oldp, oldlenp));
+#if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
+       case KERN_SYSVIPC_INFO:
+               return (sysctl_sysvipc(name + 1, namelen - 1, oldp, oldlenp));
+#endif
+#ifdef SYSVSEM
+       case KERN_SEMINFO:
+               return (sysctl_sysvsem(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+#endif
+#ifdef SYSVSHM
+       case KERN_SHMINFO:
+               return (sysctl_sysvshm(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+#endif
+#ifndef SMALL_KERNEL
+       case KERN_INTRCNT:
+               return (sysctl_intrcnt(name + 1, namelen - 1, oldp, oldlenp));
+       case KERN_WATCHDOG:
+               return (sysctl_wdog(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+#endif
+#ifndef SMALL_KERNEL
+       case KERN_EVCOUNT:
+               return (evcount_sysctl(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+#endif
+       case KERN_TIMECOUNTER:
+               return (sysctl_tc(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+       case KERN_CPTIME2:
+               return (sysctl_cptime2(name + 1, namelen -1, oldp, oldlenp,
+                   newp, newlen));
+#ifdef WITNESS
+       case KERN_WITNESSWATCH:
+               return witness_sysctl_watch(oldp, oldlenp, newp, newlen);
+       case KERN_WITNESS:
+               return witness_sysctl(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen);
+#endif
+#if NAUDIO > 0
+       case KERN_AUDIO:
+               return (sysctl_audio(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
+#endif
+       case KERN_CPUSTATS:
+               return (sysctl_cpustats(name + 1, namelen - 1, oldp, oldlenp,
+                   newp, newlen));
                default:
                        return (ENOTDIR);       /* overloaded */
                }
@@ -440,24 +496,6 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
                microboottime(&bt);
                return (sysctl_rdstruct(oldp, oldlenp, newp, &bt, sizeof bt));
          }
-#ifndef SMALL_KERNEL
-       case KERN_PROC:
-               return (sysctl_doproc(name + 1, namelen - 1, oldp, oldlenp));
-       case KERN_PROC_ARGS:
-               return (sysctl_proc_args(name + 1, namelen - 1, oldp, oldlenp,
-                    p));
-       case KERN_PROC_CWD:
-               return (sysctl_proc_cwd(name + 1, namelen - 1, oldp, oldlenp,
-                    p));
-       case KERN_PROC_NOBROADCASTKILL:
-               return (sysctl_proc_nobroadcastkill(name + 1, namelen - 1,
-                    newp, newlen, oldp, oldlenp, p));
-       case KERN_PROC_VMMAP:
-               return (sysctl_proc_vmmap(name + 1, namelen - 1, oldp, oldlenp,
-                    p));
-       case KERN_FILE:
-               return (sysctl_file(name + 1, namelen - 1, oldp, oldlenp, p));
-#endif
        case KERN_MBSTAT: {
                extern struct cpumem *mbstat;
                uint64_t counters[MBSTAT_COUNT];
@@ -476,11 +514,6 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
                return (sysctl_rdstruct(oldp, oldlenp, newp,
                    &mbs, sizeof(mbs)));
        }
-#if defined(GPROF) || defined(DDBPROF)
-       case KERN_PROF:
-               return (sysctl_doprof(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-#endif
        case KERN_MSGBUFSIZE:
        case KERN_CONSBUFSIZE: {
                struct msgbuf *mp;
@@ -506,9 +539,6 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
                return (sysctl_rdstruct(oldp, oldlenp, newp, mp,
                    mp->msg_bufs + offsetof(struct msgbuf, msg_bufc)));
        }
-       case KERN_MALLOCSTATS:
-               return (sysctl_malloc(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen, p));
        case KERN_CPTIME:
        {
                CPU_INFO_ITERATOR cii;
@@ -538,11 +568,6 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
        case KERN_FORKSTAT:
                return (sysctl_rdstruct(oldp, oldlenp, newp, &forkstat,
                    sizeof(struct forkstat)));
-       case KERN_TTY:
-               return (sysctl_tty(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-       case KERN_POOL:
-               return (sysctl_dopool(name + 1, namelen - 1, oldp, oldlenp));
        case KERN_STACKGAPRANDOM:
                stackgap = stackgap_random;
                error = sysctl_int(oldp, oldlenp, newp, newlen, &stackgap);
@@ -556,27 +581,6 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
                        return (EINVAL);
                stackgap_random = stackgap;
                return (0);
-#if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
-       case KERN_SYSVIPC_INFO:
-               return (sysctl_sysvipc(name + 1, namelen - 1, oldp, oldlenp));
-#endif
-#ifdef SYSVSEM
-       case KERN_SEMINFO:
-               return (sysctl_sysvsem(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-#endif
-#ifdef SYSVSHM
-       case KERN_SHMINFO:
-               return (sysctl_sysvshm(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-#endif
-#ifndef SMALL_KERNEL
-       case KERN_INTRCNT:
-               return (sysctl_intrcnt(name + 1, namelen - 1, oldp, oldlenp));
-       case KERN_WATCHDOG:
-               return (sysctl_wdog(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-#endif
        case KERN_MAXCLUSTERS: {
                int val = nmbclust;
                error = sysctl_int(oldp, oldlenp, newp, newlen, &val);
@@ -584,17 +588,6 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
                        error = nmbclust_update(val);
                return (error);
        }
-#ifndef SMALL_KERNEL
-       case KERN_EVCOUNT:
-               return (evcount_sysctl(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-#endif
-       case KERN_TIMECOUNTER:
-               return (sysctl_tc(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-       case KERN_CPTIME2:
-               return (sysctl_cptime2(name + 1, namelen -1, oldp, oldlenp,
-                   newp, newlen));
        case KERN_CACHEPCT: {
                u_int64_t dmapages;
                int opct, pgs;
@@ -630,21 +623,6 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t 
*oldlenp, void *newp,
                        pool_reclaim_all();
                return (error);
        }
-#ifdef WITNESS
-       case KERN_WITNESSWATCH:
-               return witness_sysctl_watch(oldp, oldlenp, newp, newlen);
-       case KERN_WITNESS:
-               return witness_sysctl(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen);
-#endif
-#if NAUDIO > 0
-       case KERN_AUDIO:
-               return (sysctl_audio(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
-#endif
-       case KERN_CPUSTATS:
-               return (sysctl_cpustats(name + 1, namelen - 1, oldp, oldlenp,
-                   newp, newlen));
 #if NPF > 0
        case KERN_PFSTATUS:
                return (pf_sysctl(oldp, oldlenp, newp, newlen));
-- 
2.29.2

Reply via email to