diff options
author | Yury Norov <yury.norov@gmail.com> | 2022-09-19 23:05:56 +0200 |
---|---|---|
committer | Yury Norov <yury.norov@gmail.com> | 2022-10-01 19:22:57 +0200 |
commit | 6cc18331a987c4a29d66b9c4fd292587fba4d7bd (patch) | |
tree | ec87f04dbf7cdcb81c4094fa9ad5b9943ecd8de2 /lib | |
parent | cpumask: switch for_each_cpu{,_not} to use for_each_bit() (diff) | |
download | linux-6cc18331a987c4a29d66b9c4fd292587fba4d7bd.tar.xz linux-6cc18331a987c4a29d66b9c4fd292587fba4d7bd.zip |
lib/find_bit: add find_next{,_and}_bit_wrap
The helper is better optimized for the worst case: in case of empty
cpumask, current code traverses 2 * size:
next = cpumask_next_and(prev, src1p, src2p);
if (next >= nr_cpu_ids)
next = cpumask_first_and(src1p, src2p);
At bitmap level we can stop earlier after checking 'size + offset' bits.
Signed-off-by: Yury Norov <yury.norov@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cpumask.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/lib/cpumask.c b/lib/cpumask.c index 2c4a63b6f03f..c7c392514fd3 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c @@ -166,10 +166,8 @@ unsigned int cpumask_any_and_distribute(const struct cpumask *src1p, /* NOTE: our first selection will skip 0. */ prev = __this_cpu_read(distribute_cpu_mask_prev); - next = cpumask_next_and(prev, src1p, src2p); - if (next >= nr_cpu_ids) - next = cpumask_first_and(src1p, src2p); - + next = find_next_and_bit_wrap(cpumask_bits(src1p), cpumask_bits(src2p), + nr_cpumask_bits, prev + 1); if (next < nr_cpu_ids) __this_cpu_write(distribute_cpu_mask_prev, next); @@ -183,11 +181,7 @@ unsigned int cpumask_any_distribute(const struct cpumask *srcp) /* NOTE: our first selection will skip 0. */ prev = __this_cpu_read(distribute_cpu_mask_prev); - - next = cpumask_next(prev, srcp); - if (next >= nr_cpu_ids) - next = cpumask_first(srcp); - + next = find_next_bit_wrap(cpumask_bits(srcp), nr_cpumask_bits, prev + 1); if (next < nr_cpu_ids) __this_cpu_write(distribute_cpu_mask_prev, next); |