]> git.baikalelectronics.ru Git - kernel.git/commitdiff
block/rnbd-srv: Replace sess_dev_list with index_idr
authorMd Haris Iqbal <haris.iqbal@ionos.com>
Thu, 7 Jul 2022 14:31:22 +0000 (16:31 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 2 Aug 2022 23:14:50 +0000 (17:14 -0600)
The structure rnbd_srv_session maintains a list and an xarray of
rnbd_srv_dev. There is no need to keep both as one of them can serve the
purpose.

Since one of the places where the lookup of rnbd_srv_dev using
rnbd_srv_session is IO path, an xarray would serve us better than a list
traversal. Hence remove sess_dev_list from rnbd_srv_session, and replace
its uses from xarray.

Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Reviewed-by: Aleksei Marov <aleksei.marov@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Link: https://lore.kernel.org/r/20220707143122.460362-3-haris.iqbal@ionos.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/rnbd/rnbd-srv.c
drivers/block/rnbd/rnbd-srv.h

index 69fdaee895c77aab0a5b18de8022b0bfb6428299..5e08da277ddf8f08cbed6e7547a99fd1a56e24da 100644 (file)
@@ -224,7 +224,6 @@ void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev, bool keep_id)
        wait_for_completion(&dc); /* wait for inflights to drop to zero */
 
        rnbd_dev_close(sess_dev->rnbd_dev);
-       list_del(&sess_dev->sess_list);
        mutex_lock(&sess_dev->dev->lock);
        list_del(&sess_dev->dev_list);
        if (sess_dev->open_flags & FMODE_WRITE)
@@ -239,14 +238,14 @@ void rnbd_destroy_sess_dev(struct rnbd_srv_sess_dev *sess_dev, bool keep_id)
 
 static void destroy_sess(struct rnbd_srv_session *srv_sess)
 {
-       struct rnbd_srv_sess_dev *sess_dev, *tmp;
+       struct rnbd_srv_sess_dev *sess_dev;
+       unsigned long index;
 
-       if (list_empty(&srv_sess->sess_dev_list))
+       if (xa_empty(&srv_sess->index_idr))
                goto out;
 
        mutex_lock(&srv_sess->lock);
-       list_for_each_entry_safe(sess_dev, tmp, &srv_sess->sess_dev_list,
-                                sess_list)
+       xa_for_each(&srv_sess->index_idr, index, sess_dev)
                rnbd_srv_destroy_dev_session_sysfs(sess_dev);
        mutex_unlock(&srv_sess->lock);
 
@@ -281,7 +280,6 @@ static int create_sess(struct rtrs_srv_sess *rtrs)
 
        srv_sess->queue_depth = rtrs_srv_get_queue_depth(rtrs);
        xa_init_flags(&srv_sess->index_idr, XA_FLAGS_ALLOC);
-       INIT_LIST_HEAD(&srv_sess->sess_dev_list);
        mutex_init(&srv_sess->lock);
        mutex_lock(&sess_lock);
        list_add(&srv_sess->list, &sess_list);
@@ -667,11 +665,12 @@ static struct rnbd_srv_sess_dev *
 find_srv_sess_dev(struct rnbd_srv_session *srv_sess, const char *dev_name)
 {
        struct rnbd_srv_sess_dev *sess_dev;
+       unsigned long index;
 
-       if (list_empty(&srv_sess->sess_dev_list))
+       if (xa_empty(&srv_sess->index_idr))
                return NULL;
 
-       list_for_each_entry(sess_dev, &srv_sess->sess_dev_list, sess_list)
+       xa_for_each(&srv_sess->index_idr, index, sess_dev)
                if (!strcmp(sess_dev->pathname, dev_name))
                        return sess_dev;
 
@@ -781,8 +780,6 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess,
        list_add(&srv_sess_dev->dev_list, &srv_dev->sess_dev_list);
        mutex_unlock(&srv_dev->lock);
 
-       list_add(&srv_sess_dev->sess_list, &srv_sess->sess_dev_list);
-
        rnbd_srv_info(srv_sess_dev, "Opened device '%s'\n", srv_dev->id);
 
        kfree(full_path);
index 6926f9069dc4bfdafbeaae73bc62a5a1f69ee3f3..081bceaf4ae9e2c02b3754fff6eabe691339d64d 100644 (file)
@@ -25,8 +25,6 @@ struct rnbd_srv_session {
        int                     queue_depth;
 
        struct xarray           index_idr;
-       /* List of struct rnbd_srv_sess_dev */
-       struct list_head        sess_dev_list;
        struct mutex            lock;
        u8                      ver;
 };
@@ -48,8 +46,6 @@ struct rnbd_srv_dev {
 struct rnbd_srv_sess_dev {
        /* Entry inside rnbd_srv_dev struct */
        struct list_head                dev_list;
-       /* Entry inside rnbd_srv_session struct */
-       struct list_head                sess_list;
        struct rnbd_dev                 *rnbd_dev;
        struct rnbd_srv_session         *sess;
        struct rnbd_srv_dev             *dev;