sysctl_mq() messes with 'struct mbuf_queue' internals, so keep it in kern/uipc_mbuf.c with the rest of the mq* functions.
ok? Index: net/if.c =================================================================== RCS file: /cvs/src/sys/net/if.c,v retrieving revision 1.514 diff -u -p -r1.514 if.c --- net/if.c 11 Oct 2017 07:57:27 -0000 1.514 +++ net/if.c 11 Oct 2017 12:56:18 -0000 @@ -82,7 +82,6 @@ #include <sys/kernel.h> #include <sys/ioctl.h> #include <sys/domain.h> -#include <sys/sysctl.h> #include <sys/task.h> #include <sys/atomic.h> #include <sys/proc.h> @@ -2654,38 +2653,6 @@ ifpromisc(struct ifnet *ifp, int pswitch } ifr.ifr_flags = ifp->if_flags; return ((*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr)); -} - -/* XXX move to kern/uipc_mbuf.c */ -int -sysctl_mq(int *name, u_int namelen, void *oldp, size_t *oldlenp, - void *newp, size_t newlen, struct mbuf_queue *mq) -{ - unsigned int maxlen; - int error; - - /* All sysctl names at this level are terminal. */ - if (namelen != 1) - return (ENOTDIR); - - switch (name[0]) { - case IFQCTL_LEN: - return (sysctl_rdint(oldp, oldlenp, newp, mq_len(mq))); - case IFQCTL_MAXLEN: - maxlen = mq->mq_maxlen; - error = sysctl_int(oldp, oldlenp, newp, newlen, &maxlen); - if (!error && maxlen != mq->mq_maxlen) { - mtx_enter(&mq->mq_mtx); - mq->mq_maxlen = maxlen; - mtx_leave(&mq->mq_mtx); - } - return (error); - case IFQCTL_DROPS: - return (sysctl_rdint(oldp, oldlenp, newp, mq_drops(mq))); - default: - return (EOPNOTSUPP); - } - /* NOTREACHED */ } void Index: net/if_var.h =================================================================== RCS file: /cvs/src/sys/net/if_var.h,v retrieving revision 1.81 diff -u -p -r1.81 if_var.h --- net/if_var.h 8 May 2017 08:46:39 -0000 1.81 +++ net/if_var.h 11 Oct 2017 12:56:18 -0000 @@ -324,9 +324,6 @@ int if_clone_destroy(const char *); struct if_clone * if_clone_lookup(const char *, int *); -int sysctl_mq(int *, u_int, void *, size_t *, void *, size_t, - struct mbuf_queue *); - void ifa_add(struct ifnet *, struct ifaddr *); void ifa_del(struct ifnet *, struct ifaddr *); void ifa_update_broadaddr(struct ifnet *, struct ifaddr *, Index: kern/uipc_mbuf.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.249 diff -u -p -r1.249 uipc_mbuf.c --- kern/uipc_mbuf.c 15 Sep 2017 18:13:05 -0000 1.249 +++ kern/uipc_mbuf.c 11 Oct 2017 12:56:19 -0000 @@ -84,6 +84,7 @@ #include <sys/protosw.h> #include <sys/pool.h> #include <sys/percpu.h> +#include <sys/sysctl.h> #include <sys/socket.h> #include <sys/socketvar.h> @@ -1648,4 +1649,35 @@ mq_purge(struct mbuf_queue *mq) mq_delist(mq, &ml); return (ml_purge(&ml)); +} + +int +sysctl_mq(int *name, u_int namelen, void *oldp, size_t *oldlenp, + void *newp, size_t newlen, struct mbuf_queue *mq) +{ + unsigned int maxlen; + int error; + + /* All sysctl names at this level are terminal. */ + if (namelen != 1) + return (ENOTDIR); + + switch (name[0]) { + case IFQCTL_LEN: + return (sysctl_rdint(oldp, oldlenp, newp, mq_len(mq))); + case IFQCTL_MAXLEN: + maxlen = mq->mq_maxlen; + error = sysctl_int(oldp, oldlenp, newp, newlen, &maxlen); + if (!error && maxlen != mq->mq_maxlen) { + mtx_enter(&mq->mq_mtx); + mq->mq_maxlen = maxlen; + mtx_leave(&mq->mq_mtx); + } + return (error); + case IFQCTL_DROPS: + return (sysctl_rdint(oldp, oldlenp, newp, mq_drops(mq))); + default: + return (EOPNOTSUPP); + } + /* NOTREACHED */ } Index: sys/sysctl.h =================================================================== RCS file: /cvs/src/sys/sys/sysctl.h,v retrieving revision 1.174 diff -u -p -r1.174 sysctl.h --- sys/sysctl.h 14 Jun 2017 03:00:40 -0000 1.174 +++ sys/sysctl.h 11 Oct 2017 12:56:21 -0000 @@ -936,6 +936,9 @@ int sysctl_rdstruct(void *, size_t *, vo int sysctl_struct(void *, size_t *, void *, size_t, void *, size_t); int sysctl_file(int *, u_int, char *, size_t *, struct proc *); int sysctl_doproc(int *, u_int, char *, size_t *); +struct mbuf_queue; +int sysctl_mq(int *, u_int, void *, size_t *, void *, size_t, + struct mbuf_queue *); struct rtentry; struct walkarg; int sysctl_dumpentry(struct rtentry *, void *, unsigned int);