Message ID | 20240620175703.605111-25-yury.norov@gmail.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | lib/find: add atomic find_bit() primitives | expand |
On Thu, Jun 20, 2024 at 7:58 PM Yury Norov <yury.norov@gmail.com> wrote: > > The function opencodes find_and_set_bit_lock() with a while-loop polling > on test_and_set_bit_lock(). Use the dedicated function instead. > > Signed-off-by: Yury Norov <yury.norov@gmail.com> lgtm, thx! Reviewed-by: Jack Wang <jinpu.wang@ionos.com> > --- > drivers/infiniband/ulp/rtrs/rtrs-clt.c | 16 ++++------------ > 1 file changed, 4 insertions(+), 12 deletions(-) > > diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c > index 88106cf5ce55..52b7728f6c63 100644 > --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c > +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c > @@ -10,6 +10,7 @@ > #undef pr_fmt > #define pr_fmt(fmt) KBUILD_MODNAME " L" __stringify(__LINE__) ": " fmt > > +#include <linux/find_atomic.h> > #include <linux/module.h> > #include <linux/rculist.h> > #include <linux/random.h> > @@ -72,18 +73,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); > -- > 2.43.0 >
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c index 88106cf5ce55..52b7728f6c63 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c @@ -10,6 +10,7 @@ #undef pr_fmt #define pr_fmt(fmt) KBUILD_MODNAME " L" __stringify(__LINE__) ": " fmt +#include <linux/find_atomic.h> #include <linux/module.h> #include <linux/rculist.h> #include <linux/random.h> @@ -72,18 +73,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 the dedicated function instead. Signed-off-by: Yury Norov <yury.norov@gmail.com> --- drivers/infiniband/ulp/rtrs/rtrs-clt.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)