Skip to content

Commit fdae96a

Browse files
committed
lib/find: optimize for_each() macros
Moving an iterator of the macros inside conditional part of for-loop helps to generate a better code. It had been first implemented in commit 7baac8b ("cpumask: make for_each_cpu_mask a bit smaller"). Now that cpumask for-loops are the aliases to bitmap loops, it's worth to optimize them the same way. Bloat-o-meter says: add/remove: 8/12 grow/shrink: 147/592 up/down: 4876/-24416 (-19540) Signed-off-by: Yury Norov <[email protected]>
1 parent 4fe49b3 commit fdae96a

File tree

1 file changed

+25
-31
lines changed

1 file changed

+25
-31
lines changed

include/linux/find.h

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -458,31 +458,25 @@ unsigned long find_next_bit_le(const void *addr, unsigned
458458
#endif
459459

460460
#define for_each_set_bit(bit, addr, size) \
461-
for ((bit) = find_next_bit((addr), (size), 0); \
462-
(bit) < (size); \
463-
(bit) = find_next_bit((addr), (size), (bit) + 1))
461+
for ((bit) = 0; (bit) = find_next_bit((addr), (size), (bit)), (bit) < (size); (bit)++)
464462

465463
#define for_each_and_bit(bit, addr1, addr2, size) \
466-
for ((bit) = find_next_and_bit((addr1), (addr2), (size), 0); \
467-
(bit) < (size); \
468-
(bit) = find_next_and_bit((addr1), (addr2), (size), (bit) + 1))
464+
for ((bit) = 0; \
465+
(bit) = find_next_and_bit((addr1), (addr2), (size), (bit)), (bit) < (size);\
466+
(bit)++)
469467

470468
/* same as for_each_set_bit() but use bit as value to start with */
471469
#define for_each_set_bit_from(bit, addr, size) \
472-
for ((bit) = find_next_bit((addr), (size), (bit)); \
473-
(bit) < (size); \
474-
(bit) = find_next_bit((addr), (size), (bit) + 1))
470+
for (; (bit) = find_next_bit((addr), (size), (bit)), (bit) < (size); (bit)++)
475471

476472
#define for_each_clear_bit(bit, addr, size) \
477-
for ((bit) = find_next_zero_bit((addr), (size), 0); \
478-
(bit) < (size); \
479-
(bit) = find_next_zero_bit((addr), (size), (bit) + 1))
473+
for ((bit) = 0; \
474+
(bit) = find_next_zero_bit((addr), (size), (bit)), (bit) < (size); \
475+
(bit)++)
480476

481477
/* same as for_each_clear_bit() but use bit as value to start with */
482478
#define for_each_clear_bit_from(bit, addr, size) \
483-
for ((bit) = find_next_zero_bit((addr), (size), (bit)); \
484-
(bit) < (size); \
485-
(bit) = find_next_zero_bit((addr), (size), (bit) + 1))
479+
for (; (bit) = find_next_zero_bit((addr), (size), (bit)), (bit) < (size); (bit)++)
486480

487481
/**
488482
* for_each_set_bitrange - iterate over all set bit ranges [b; e)
@@ -492,11 +486,11 @@ unsigned long find_next_bit_le(const void *addr, unsigned
492486
* @size: bitmap size in number of bits
493487
*/
494488
#define for_each_set_bitrange(b, e, addr, size) \
495-
for ((b) = find_next_bit((addr), (size), 0), \
496-
(e) = find_next_zero_bit((addr), (size), (b) + 1); \
489+
for ((b) = 0; \
490+
(b) = find_next_bit((addr), (size), b), \
491+
(e) = find_next_zero_bit((addr), (size), (b) + 1), \
497492
(b) < (size); \
498-
(b) = find_next_bit((addr), (size), (e) + 1), \
499-
(e) = find_next_zero_bit((addr), (size), (b) + 1))
493+
(b) = (e) + 1)
500494

501495
/**
502496
* for_each_set_bitrange_from - iterate over all set bit ranges [b; e)
@@ -506,11 +500,11 @@ unsigned long find_next_bit_le(const void *addr, unsigned
506500
* @size: bitmap size in number of bits
507501
*/
508502
#define for_each_set_bitrange_from(b, e, addr, size) \
509-
for ((b) = find_next_bit((addr), (size), (b)), \
510-
(e) = find_next_zero_bit((addr), (size), (b) + 1); \
503+
for (; \
504+
(b) = find_next_bit((addr), (size), (b)), \
505+
(e) = find_next_zero_bit((addr), (size), (b) + 1), \
511506
(b) < (size); \
512-
(b) = find_next_bit((addr), (size), (e) + 1), \
513-
(e) = find_next_zero_bit((addr), (size), (b) + 1))
507+
(b) = (e) + 1)
514508

515509
/**
516510
* for_each_clear_bitrange - iterate over all unset bit ranges [b; e)
@@ -520,11 +514,11 @@ unsigned long find_next_bit_le(const void *addr, unsigned
520514
* @size: bitmap size in number of bits
521515
*/
522516
#define for_each_clear_bitrange(b, e, addr, size) \
523-
for ((b) = find_next_zero_bit((addr), (size), 0), \
524-
(e) = find_next_bit((addr), (size), (b) + 1); \
517+
for ((b) = 0; \
518+
(b) = find_next_zero_bit((addr), (size), (b)), \
519+
(e) = find_next_bit((addr), (size), (b) + 1), \
525520
(b) < (size); \
526-
(b) = find_next_zero_bit((addr), (size), (e) + 1), \
527-
(e) = find_next_bit((addr), (size), (b) + 1))
521+
(b) = (e) + 1)
528522

529523
/**
530524
* for_each_clear_bitrange_from - iterate over all unset bit ranges [b; e)
@@ -534,11 +528,11 @@ unsigned long find_next_bit_le(const void *addr, unsigned
534528
* @size: bitmap size in number of bits
535529
*/
536530
#define for_each_clear_bitrange_from(b, e, addr, size) \
537-
for ((b) = find_next_zero_bit((addr), (size), (b)), \
538-
(e) = find_next_bit((addr), (size), (b) + 1); \
531+
for (; \
532+
(b) = find_next_zero_bit((addr), (size), (b)), \
533+
(e) = find_next_bit((addr), (size), (b) + 1), \
539534
(b) < (size); \
540-
(b) = find_next_zero_bit((addr), (size), (e) + 1), \
541-
(e) = find_next_bit((addr), (size), (b) + 1))
535+
(b) = (e) + 1)
542536

543537
/**
544538
* for_each_set_bit_wrap - iterate over all set bits starting from @start, and

0 commit comments

Comments
 (0)