@@ -72,18 +72,9 @@ __rtrs_get_permit(struct rtrs_clt_sess *clt, enum rtrs_clt_con_type con_type)
struct rtrs_permit *permit;
int bit;
- /*
- * Adapted from null_blk get_tag(). Callers from different cpus may
- * grab the same bit, since find_first_zero_bit is not atomic.
- * But then the test_and_set_bit_lock will fail for all the
- * callers but one, so that they will loop again.
- * This way an explicit spinlock is not required.
- */
- do {
- bit = find_first_zero_bit(clt->permits_map, max_depth);
- if (bit >= max_depth)
- return NULL;
- } while (test_and_set_bit_lock(bit, clt->permits_map));
+ bit = find_and_set_bit_lock(clt->permits_map, max_depth);
+ if (bit >= max_depth)
+ return NULL;
permit = get_permit(clt, bit);
WARN_ON(permit->mem_id != bit);
The function opencodes find_and_set_bit_lock() with a while-loop polling on test_and_set_bit_lock(). Use a dedicated find_and_set_bit_lock() instead. Signed-off-by: Yury Norov <yury.norov@gmail.com> --- drivers/infiniband/ulp/rtrs/rtrs-clt.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-)