mbuf: Add helper functions to inc/dec mbuf limits
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 24 Jul 2015 14:51:10 +0000 (22:51 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 24 Jul 2015 15:43:17 +0000 (23:43 +0800)
While I'm here, refactor code a little bit.

sys/kern/uipc_mbuf.c
sys/sys/mbuf.h

index 753433d..9499072 100644 (file)
@@ -256,7 +256,7 @@ struct objcache *mclmeta_cache, *mjclmeta_cache;
 struct objcache *mbufcluster_cache, *mbufphdrcluster_cache;
 struct objcache *mbufjcluster_cache, *mbufphdrjcluster_cache;
 
-struct lock    mbupdate_lk = LOCK_INITIALIZER("mbupdate", 0, 0);
+struct lock    mbupdate_lk = LOCK_INITIALIZER("mbupdate", 0, LK_CANRECURSE);
 
 int            nmbclusters;
 static int     nmbjclusters;
@@ -472,76 +472,89 @@ tunable_mbinit(void *dummy)
 SYSINIT(tunable_mbinit, SI_BOOT1_TUNABLES, SI_ORDER_ANY,
        tunable_mbinit, NULL);
 
-/*
- * Sysctl support to update nmbclusters, nmbjclusters, and nmbufs.
- */
-static int
-sysctl_nmbclusters(SYSCTL_HANDLER_ARGS)
+static void
+mbinclimit(int *limit, int inc, int minlim)
 {
-       int error;
-       int value;
+       int new_limit;
 
-       value = nmbclusters;
-       error = sysctl_handle_int(oidp, &value, 0, req);
-       if (error || req->newptr == NULL)
-               return error;
+       lockmgr(&mbupdate_lk, LK_EXCLUSIVE);
 
-       if (value < NMBCLUSTERS_MIN)
-               return EINVAL;
+       new_limit = *limit + inc;
+       if (new_limit < minlim)
+               new_limit = minlim;
 
-       lockmgr(&mbupdate_lk, LK_EXCLUSIVE);
-       if (nmbclusters != value) {
-               nmbclusters = value;
+       if (*limit != new_limit) {
+               *limit = new_limit;
                mbupdatelimits();
        }
+
        lockmgr(&mbupdate_lk, LK_RELEASE);
-       return 0;
 }
 
 static int
-sysctl_nmbjclusters(SYSCTL_HANDLER_ARGS)
+mbsetlimit(int *limit, int new_limit, int minlim)
 {
-       int error;
-       int value;
-
-       value = nmbjclusters;
-       error = sysctl_handle_int(oidp, &value, 0, req);
-       if (error || req->newptr == NULL)
-               return error;
-
-       if (value < NMBJCLUSTERS_MIN)
+       if (new_limit < minlim)
                return EINVAL;
 
        lockmgr(&mbupdate_lk, LK_EXCLUSIVE);
-       if (nmbjclusters != value) {
-               nmbjclusters = value;
-               mbupdatelimits();
-       }
+       mbinclimit(limit, new_limit - *limit, minlim);
        lockmgr(&mbupdate_lk, LK_RELEASE);
        return 0;
 }
 
 static int
-sysctl_nmbufs(SYSCTL_HANDLER_ARGS)
+sysctl_mblimit(SYSCTL_HANDLER_ARGS, int *limit, int minlim)
 {
-       int error;
-       int value;
+       int error, value;
 
-       value = nmbufs;
+       value = *limit;
        error = sysctl_handle_int(oidp, &value, 0, req);
        if (error || req->newptr == NULL)
                return error;
 
-       if (value < NMBUFS_MIN)
-               return EINVAL;
+       return mbsetlimit(limit, value, minlim);
+}
 
-       lockmgr(&mbupdate_lk, LK_EXCLUSIVE);
-       if (nmbufs != value) {
-               nmbufs = value;
-               mbupdatelimits();
-       }
-       lockmgr(&mbupdate_lk, LK_RELEASE);
-       return 0;
+/*
+ * Sysctl support to update nmbclusters, nmbjclusters, and nmbufs.
+ */
+static int
+sysctl_nmbclusters(SYSCTL_HANDLER_ARGS)
+{
+       return sysctl_mblimit(oidp, arg1, arg2, req, &nmbclusters,
+           NMBCLUSTERS_MIN);
+}
+
+static int
+sysctl_nmbjclusters(SYSCTL_HANDLER_ARGS)
+{
+       return sysctl_mblimit(oidp, arg1, arg2, req, &nmbjclusters,
+           NMBJCLUSTERS_MIN);
+}
+
+static int
+sysctl_nmbufs(SYSCTL_HANDLER_ARGS)
+{
+       return sysctl_mblimit(oidp, arg1, arg2, req, &nmbufs, NMBUFS_MIN);
+}
+
+void
+mcl_inclimit(int inc)
+{
+       mbinclimit(&nmbclusters, inc, NMBCLUSTERS_MIN);
+}
+
+void
+mjcl_inclimit(int inc)
+{
+       mbinclimit(&nmbjclusters, inc, NMBJCLUSTERS_MIN);
+}
+
+void
+mb_inclimit(int inc)
+{
+       mbinclimit(&nmbufs, inc, NMBUFS_MIN);
 }
 
 /* "number of clusters of pages" */
index ec6378f..c6dde01 100644 (file)
@@ -490,6 +490,9 @@ extern      int              nmbufs;
 
 struct uio;
 
+void            mcl_inclimit(int);
+void            mjcl_inclimit(int);
+void            mb_inclimit(int);
 void            m_adj(struct mbuf *, int);
 void            m_align(struct mbuf *, int);
 int             m_apply(struct mbuf *, int, int,