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