From 68b5f8ec82f496445081b76d7c1f87d637f0c905 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 19 May 2020 22:15:36 +0000 Subject: [PATCH 1/2] scst: Backport kvmalloc_array() git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@8942 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/include/backport.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scst/include/backport.h b/scst/include/backport.h index 851121d0b..2b774a8a9 100644 --- a/scst/include/backport.h +++ b/scst/include/backport.h @@ -970,6 +970,15 @@ static inline void *kvzalloc(size_t size, gfp_t flags) { return kvmalloc(size, flags | __GFP_ZERO); } + +/* + * See also commit 752ade68cbd8 ("treewide: use kv[mz]alloc* rather than + * opencoded variants") # v4.12. + */ +static inline void *kvmalloc_array(size_t n, size_t size, gfp_t flags) +{ + return kvmalloc(n * size, flags); +} #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0) && \ From 5ff1a5efb222d29646c233c6b5cf9ac9e8f831f1 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 19 May 2020 22:18:13 +0000 Subject: [PATCH 2/2] scst: Add more wait list state checks git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@8943 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 930729092..cded357f2 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1972,8 +1972,10 @@ srpt_handle_new_iu(struct srpt_rdma_ch *ch, goto push; } - if (!list_empty(&recv_ioctx->wait_list)) + if (!list_empty(&recv_ioctx->wait_list)) { + WARN_ON_ONCE(!ch->processing_wait_list); list_del_init(&recv_ioctx->wait_list); + } switch (opcode) { case SRP_CMD: @@ -2006,8 +2008,10 @@ out: return send_ioctx; push: - if (list_empty(&recv_ioctx->wait_list)) + if (list_empty(&recv_ioctx->wait_list)) { + WARN_ON_ONCE(ch->processing_wait_list); list_add_tail(&recv_ioctx->wait_list, &ch->cmd_wait_list); + } goto out; } @@ -2046,14 +2050,18 @@ static void srpt_process_wait_list(struct srpt_rdma_ch *ch) { struct srpt_recv_ioctx *recv_ioctx, *tmp; - ch->processing_wait_list = true; + WARN_ON_ONCE(ch->state == CH_CONNECTING); + if (list_empty(&ch->cmd_wait_list)) + return; + + WARN_ON_ONCE(ch->processing_wait_list); + ch->processing_wait_list = true; list_for_each_entry_safe(recv_ioctx, tmp, &ch->cmd_wait_list, wait_list) { if (!srpt_handle_new_iu(ch, recv_ioctx, srpt_new_iu_context)) break; } - ch->processing_wait_list = false; }