fs: nfsd: use group allocation/free of per-cpu counters API
authorKefeng Wang <wangkefeng.wang@huawei.com>
Mon, 25 Mar 2024 13:21:39 +0000 (21:21 +0800)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 6 May 2024 13:07:17 +0000 (09:07 -0400)
Use group allocation/free of per-cpu counters api to accelerate
nfsd percpu_counters init/destroy(), and also squash the
nfsd_percpu_counters_init/reset/destroy() and nfsd_counters_init/destroy()
into callers to simplify code.

Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/export.c
fs/nfsd/nfsctl.c
fs/nfsd/stats.c
fs/nfsd/stats.h

index 7b641095a665fde11850eb670831ce89ceead18c..50b3135d07ac7345de22fe44b7ed781dc4d125f2 100644 (file)
@@ -334,21 +334,25 @@ static void nfsd4_fslocs_free(struct nfsd4_fs_locations *fsloc)
 static int export_stats_init(struct export_stats *stats)
 {
        stats->start_time = ktime_get_seconds();
-       return nfsd_percpu_counters_init(stats->counter, EXP_STATS_COUNTERS_NUM);
+       return percpu_counter_init_many(stats->counter, 0, GFP_KERNEL,
+                                       EXP_STATS_COUNTERS_NUM);
 }
 
 static void export_stats_reset(struct export_stats *stats)
 {
-       if (stats)
-               nfsd_percpu_counters_reset(stats->counter,
-                                          EXP_STATS_COUNTERS_NUM);
+       if (stats) {
+               int i;
+
+               for (i = 0; i < EXP_STATS_COUNTERS_NUM; i++)
+                       percpu_counter_set(&stats->counter[i], 0);
+       }
 }
 
 static void export_stats_destroy(struct export_stats *stats)
 {
        if (stats)
-               nfsd_percpu_counters_destroy(stats->counter,
-                                            EXP_STATS_COUNTERS_NUM);
+               percpu_counter_destroy_many(stats->counter,
+                                           EXP_STATS_COUNTERS_NUM);
 }
 
 static void svc_export_put(struct kref *ref)
index ecd18bffeebc7599f789bd46244e9d52f0adbf2f..93c87587e646101715e1b4dfc9246b788ce8dc3e 100644 (file)
@@ -1672,7 +1672,8 @@ static __net_init int nfsd_net_init(struct net *net)
        retval = nfsd_idmap_init(net);
        if (retval)
                goto out_idmap_error;
-       retval = nfsd_stat_counters_init(nn);
+       retval = percpu_counter_init_many(nn->counter, 0, GFP_KERNEL,
+                                         NFSD_STATS_COUNTERS_NUM);
        if (retval)
                goto out_repcache_error;
        memset(&nn->nfsd_svcstats, 0, sizeof(nn->nfsd_svcstats));
@@ -1704,7 +1705,7 @@ static __net_exit void nfsd_net_exit(struct net *net)
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 
        nfsd_proc_stat_shutdown(net);
-       nfsd_stat_counters_destroy(nn);
+       percpu_counter_destroy_many(nn->counter, NFSD_STATS_COUNTERS_NUM);
        nfsd_idmap_shutdown(net);
        nfsd_export_shutdown(net);
        nfsd_netns_free_versions(nn);
index be52fb1e928ed62d4ccfd680f19149faa62f0880..bb22893f1157e4c159e123b6d8e25b8eab52e187 100644 (file)
@@ -73,48 +73,6 @@ static int nfsd_show(struct seq_file *seq, void *v)
 
 DEFINE_PROC_SHOW_ATTRIBUTE(nfsd);
 
-int nfsd_percpu_counters_init(struct percpu_counter *counters, int num)
-{
-       int i, err = 0;
-
-       for (i = 0; !err && i < num; i++)
-               err = percpu_counter_init(&counters[i], 0, GFP_KERNEL);
-
-       if (!err)
-               return 0;
-
-       for (; i > 0; i--)
-               percpu_counter_destroy(&counters[i-1]);
-
-       return err;
-}
-
-void nfsd_percpu_counters_reset(struct percpu_counter counters[], int num)
-{
-       int i;
-
-       for (i = 0; i < num; i++)
-               percpu_counter_set(&counters[i], 0);
-}
-
-void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num)
-{
-       int i;
-
-       for (i = 0; i < num; i++)
-               percpu_counter_destroy(&counters[i]);
-}
-
-int nfsd_stat_counters_init(struct nfsd_net *nn)
-{
-       return nfsd_percpu_counters_init(nn->counter, NFSD_STATS_COUNTERS_NUM);
-}
-
-void nfsd_stat_counters_destroy(struct nfsd_net *nn)
-{
-       nfsd_percpu_counters_destroy(nn->counter, NFSD_STATS_COUNTERS_NUM);
-}
-
 void nfsd_proc_stat_init(struct net *net)
 {
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
index d2753e975dfd3429aeeeac3a3d78a183024de697..04aacb6c36e2576ba231ee481e3a3e9e9f255a61 100644 (file)
 #include <uapi/linux/nfsd/stats.h>
 #include <linux/percpu_counter.h>
 
-int nfsd_percpu_counters_init(struct percpu_counter *counters, int num);
-void nfsd_percpu_counters_reset(struct percpu_counter *counters, int num);
-void nfsd_percpu_counters_destroy(struct percpu_counter *counters, int num);
-int nfsd_stat_counters_init(struct nfsd_net *nn);
-void nfsd_stat_counters_destroy(struct nfsd_net *nn);
 void nfsd_proc_stat_init(struct net *net);
 void nfsd_proc_stat_shutdown(struct net *net);