ceph: add global total_caps to count the mdsc's total caps number
authorXiubo Li <xiubli@redhat.com>
Tue, 30 Jun 2020 07:52:16 +0000 (03:52 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 3 Aug 2020 09:05:15 +0000 (11:05 +0200)
This will help to reduce using the global mdsc->mutex lock in many
places.

Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c
fs/ceph/debugfs.c
fs/ceph/mds_client.c
fs/ceph/metric.c
fs/ceph/metric.h

index 972c13a..5f48940 100644 (file)
@@ -668,6 +668,7 @@ void ceph_add_cap(struct inode *inode,
                spin_lock(&session->s_cap_lock);
                list_add_tail(&cap->session_caps, &session->s_caps);
                session->s_nr_caps++;
+               atomic64_inc(&mdsc->metric.total_caps);
                spin_unlock(&session->s_cap_lock);
        } else {
                spin_lock(&session->s_cap_lock);
@@ -1161,6 +1162,7 @@ void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
        } else {
                list_del_init(&cap->session_caps);
                session->s_nr_caps--;
+               atomic64_dec(&mdsc->metric.total_caps);
                cap->session = NULL;
                removed = 1;
        }
index 070ed84..3030f55 100644 (file)
@@ -145,7 +145,7 @@ static int metric_show(struct seq_file *s, void *p)
        struct ceph_fs_client *fsc = s->private;
        struct ceph_mds_client *mdsc = fsc->mdsc;
        struct ceph_client_metric *m = &mdsc->metric;
-       int i, nr_caps = 0;
+       int nr_caps = 0;
        s64 total, sum, avg, min, max, sq;
 
        seq_printf(s, "item          total       avg_lat(us)     min_lat(us)     max_lat(us)     stdev(us)\n");
@@ -190,17 +190,7 @@ static int metric_show(struct seq_file *s, void *p)
                   percpu_counter_sum(&m->d_lease_mis),
                   percpu_counter_sum(&m->d_lease_hit));
 
-       mutex_lock(&mdsc->mutex);
-       for (i = 0; i < mdsc->max_sessions; i++) {
-               struct ceph_mds_session *s;
-
-               s = __ceph_lookup_mds_session(mdsc, i);
-               if (!s)
-                       continue;
-               nr_caps += s->s_nr_caps;
-               ceph_put_mds_session(s);
-       }
-       mutex_unlock(&mdsc->mutex);
+       nr_caps = atomic64_read(&m->total_caps);
        seq_printf(s, "%-14s%-16d%-16lld%lld\n", "caps", nr_caps,
                   percpu_counter_sum(&m->i_caps_mis),
                   percpu_counter_sum(&m->i_caps_hit));
index 58c54d4..f3c7123 100644 (file)
@@ -1485,6 +1485,7 @@ int ceph_iterate_session_caps(struct ceph_mds_session *session,
                        cap->session = NULL;
                        list_del_init(&cap->session_caps);
                        session->s_nr_caps--;
+                       atomic64_dec(&session->s_mdsc->metric.total_caps);
                        if (cap->queue_release)
                                __ceph_queue_cap_release(session, cap);
                        else
index 9217f35..269eacb 100644 (file)
@@ -22,6 +22,7 @@ int ceph_metric_init(struct ceph_client_metric *m)
        if (ret)
                goto err_d_lease_mis;
 
+       atomic64_set(&m->total_caps, 0);
        ret = percpu_counter_init(&m->i_caps_hit, 0, GFP_KERNEL);
        if (ret)
                goto err_i_caps_hit;
index ccd8128..23a3373 100644 (file)
@@ -12,6 +12,7 @@ struct ceph_client_metric {
        struct percpu_counter d_lease_hit;
        struct percpu_counter d_lease_mis;
 
+       atomic64_t            total_caps;
        struct percpu_counter i_caps_hit;
        struct percpu_counter i_caps_mis;