From 9ba375983d498690f5caa29c289c137470a76505 Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Wed, 1 Nov 2023 17:55:39 +0300 Subject: [PATCH] LU-17249 ptlrpc: protect scp_rqbd_idle list operations 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 Change-Id: Iace37b1ee79bfd0c3a54a35722952e17d860a91c Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52931 Reviewed-by: Andreas Dilger Reviewed-by: Arshad Hussain Reviewed-by: Oleg Drokin Tested-by: jenkins Tested-by: Maloo --- lustre/ptlrpc/service.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index ea51d80..f6b2739 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -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); -- 1.8.3.1