Whamcloud - gitweb
LU-17249 ptlrpc: protect scp_rqbd_idle list operations 31/52931/2
authorMikhail Pershin <mpershin@whamcloud.com>
Wed, 1 Nov 2023 14:55:39 +0000 (17:55 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 8 Nov 2023 22:07:01 +0000 (22:07 +0000)
Protect scp_rqbd_idle list entry getting by spinlock
in ptlrpc_service_purge_all() like it does in all
other places where rqbd_list linkage is being managed

Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com>
Change-Id: Iace37b1ee79bfd0c3a54a35722952e17d860a91c
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52931
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/ptlrpc/service.c

index ea51d80..f6b2739 100644 (file)
@@ -108,11 +108,6 @@ static void ptlrpc_free_rqbd(struct ptlrpc_request_buffer_desc *rqbd)
        LASSERT(rqbd->rqbd_refcount == 0);
        LASSERT(list_empty(&rqbd->rqbd_reqs));
 
-       spin_lock(&svcpt->scp_lock);
-       list_del(&rqbd->rqbd_list);
-       svcpt->scp_nrqbds_total--;
-       spin_unlock(&svcpt->scp_lock);
-
        OBD_FREE_LARGE(rqbd->rqbd_buffer, svcpt->scp_service->srv_buf_size);
        OBD_FREE_PTR(rqbd);
 }
@@ -3544,10 +3539,18 @@ ptlrpc_service_purge_all(struct ptlrpc_service *svc)
                 * Now free all the request buffers since nothing
                 * references them any more...
                 */
+               spin_lock(&svcpt->scp_lock);
                while ((rqbd = list_first_entry_or_null(&svcpt->scp_rqbd_idle,
                                                        struct ptlrpc_request_buffer_desc,
-                                                       rqbd_list)) != NULL)
+                                                       rqbd_list)) != NULL) {
+                       list_del(&rqbd->rqbd_list);
+                       svcpt->scp_nrqbds_total--;
+                       spin_unlock(&svcpt->scp_lock);
+
                        ptlrpc_free_rqbd(rqbd);
+                       spin_lock(&svcpt->scp_lock);
+               }
+               spin_unlock(&svcpt->scp_lock);
 
                ptlrpc_wait_replies(svcpt);