Thread (15 messages) flat view 15 messages, 6 authors, 2023-11-21

Re: [PATCH 29/34] net: smc: fix opencoded find_and_set_bit() in smc_wr_tx_get_free_slot_index()

From: Alexandra Winter <wintera@linux.ibm.com>
Date: 2023-11-20 08:44:40
Also in: linux-s390, lkml


On 18.11.23 16:51, Yury Norov wrote:
quoted hunk ↗ jump to hunk
The function opencodes find_and_set_bit() with a for_each() loop. Fix
it, and make the whole function a simple almost one-liner.

Signed-off-by: Yury Norov <yury.norov@gmail.com>
---
 net/smc/smc_wr.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/net/smc/smc_wr.c b/net/smc/smc_wr.c
index 0021065a600a..b6f0cfc52788 100644
--- a/net/smc/smc_wr.c
+++ b/net/smc/smc_wr.c
@@ -170,15 +170,11 @@ void smc_wr_tx_cq_handler(struct ib_cq *ib_cq, void *cq_context)
 
 static inline int smc_wr_tx_get_free_slot_index(struct smc_link *link, u32 *idx)
 {
-	*idx = link->wr_tx_cnt;
 	if (!smc_link_sendable(link))
 		return -ENOLINK;
-	for_each_clear_bit(*idx, link->wr_tx_mask, link->wr_tx_cnt) {
-		if (!test_and_set_bit(*idx, link->wr_tx_mask))
-			return 0;
-	}
-	*idx = link->wr_tx_cnt;
-	return -EBUSY;
+
+	*idx = find_and_set_bit(link->wr_tx_mask, link->wr_tx_cnt);
+	return *idx < link->wr_tx_cnt ? 0 : -EBUSY;
 }
 
 /**

My understanding is that you can omit the lines with
-	*idx = link->wr_tx_cnt;
because they only apply to the error paths and you checked that the calling function
does not use the idx variable in the error cases. Do I understand this correct?

If so the removal of these 2 lines is not related to your change of using find_and_set_bit(),
do I understand that correctly?

If so, it may be worth mentioning that in the commit message.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help