Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / fs / nfsd / nfssvc.c
index fce472f5f39e74f2fb9ab36bdf70019f573a73af..28dfad39f0c50a626384c4363955e2b9d7e3212f 100644 (file)
@@ -307,33 +307,37 @@ static void set_max_drc(void)
        dprintk("%s nfsd_drc_max_mem %u \n", __func__, nfsd_drc_max_mem);
 }
 
-int nfsd_create_serv(void)
+static int nfsd_get_default_max_blksize(void)
 {
-       int err = 0;
+       struct sysinfo i;
+       unsigned long long target;
+       unsigned long ret;
+
+       si_meminfo(&i);
+       target = (i.totalram - i.totalhigh) << PAGE_SHIFT;
+       /*
+        * Aim for 1/4096 of memory per thread This gives 1MB on 4Gig
+        * machines, but only uses 32K on 128M machines.  Bottom out at
+        * 8K on 32M and smaller.  Of course, this is only a default.
+        */
+       target >>= 12;
+
+       ret = NFSSVC_MAXBLKSIZE;
+       while (ret > target && ret >= 8*1024*2)
+               ret /= 2;
+       return ret;
+}
 
+int nfsd_create_serv(void)
+{
        WARN_ON(!mutex_is_locked(&nfsd_mutex));
        if (nfsd_serv) {
                svc_get(nfsd_serv);
                return 0;
        }
-       if (nfsd_max_blksize == 0) {
-               /* choose a suitable default */
-               struct sysinfo i;
-               si_meminfo(&i);
-               /* Aim for 1/4096 of memory per thread
-                * This gives 1MB on 4Gig machines
-                * But only uses 32K on 128M machines.
-                * Bottom out at 8K on 32M and smaller.
-                * Of course, this is only a default.
-                */
-               nfsd_max_blksize = NFSSVC_MAXBLKSIZE;
-               i.totalram <<= PAGE_SHIFT - 12;
-               while (nfsd_max_blksize > i.totalram &&
-                      nfsd_max_blksize >= 8*1024*2)
-                       nfsd_max_blksize /= 2;
-       }
+       if (nfsd_max_blksize == 0)
+               nfsd_max_blksize = nfsd_get_default_max_blksize();
        nfsd_reset_versions();
-
        nfsd_serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize,
                                      nfsd_last_thread, nfsd, THIS_MODULE);
        if (nfsd_serv == NULL)
@@ -341,7 +345,7 @@ int nfsd_create_serv(void)
 
        set_max_drc();
        do_gettimeofday(&nfssvc_boot);          /* record boot time */
-       return err;
+       return 0;
 }
 
 int nfsd_nrpools(void)