1 // SPDX-License-Identifier: GPL-2.0-only
4 * Helper functions for bitmap.h.
6 #include <linux/bitmap.h>
8 unsigned int __bitmap_weight(const unsigned long *bitmap
, int bits
)
10 unsigned int k
, w
= 0, lim
= bits
/BITS_PER_LONG
;
12 for (k
= 0; k
< lim
; k
++)
13 w
+= hweight_long(bitmap
[k
]);
15 if (bits
% BITS_PER_LONG
)
16 w
+= hweight_long(bitmap
[k
] & BITMAP_LAST_WORD_MASK(bits
));
21 void __bitmap_or(unsigned long *dst
, const unsigned long *bitmap1
,
22 const unsigned long *bitmap2
, int bits
)
25 int nr
= BITS_TO_LONGS(bits
);
27 for (k
= 0; k
< nr
; k
++)
28 dst
[k
] = bitmap1
[k
] | bitmap2
[k
];
31 size_t bitmap_scnprintf(unsigned long *bitmap
, unsigned int nbits
,
32 char *buf
, size_t size
)
34 /* current bit is 'cur', most recently seen range is [rbot, rtop] */
35 unsigned int cur
, rbot
, rtop
;
39 rbot
= cur
= find_first_bit(bitmap
, nbits
);
42 cur
= find_next_bit(bitmap
, nbits
, cur
+ 1);
43 if (cur
< nbits
&& cur
<= rtop
+ 1)
47 ret
+= scnprintf(buf
+ ret
, size
- ret
, ",");
51 ret
+= scnprintf(buf
+ ret
, size
- ret
, "%d", rbot
);
53 ret
+= scnprintf(buf
+ ret
, size
- ret
, "-%d", rtop
);
60 bool __bitmap_and(unsigned long *dst
, const unsigned long *bitmap1
,
61 const unsigned long *bitmap2
, unsigned int bits
)
64 unsigned int lim
= bits
/BITS_PER_LONG
;
65 unsigned long result
= 0;
67 for (k
= 0; k
< lim
; k
++)
68 result
|= (dst
[k
] = bitmap1
[k
] & bitmap2
[k
]);
69 if (bits
% BITS_PER_LONG
)
70 result
|= (dst
[k
] = bitmap1
[k
] & bitmap2
[k
] &
71 BITMAP_LAST_WORD_MASK(bits
));
75 bool __bitmap_equal(const unsigned long *bitmap1
,
76 const unsigned long *bitmap2
, unsigned int bits
)
78 unsigned int k
, lim
= bits
/BITS_PER_LONG
;
79 for (k
= 0; k
< lim
; ++k
)
80 if (bitmap1
[k
] != bitmap2
[k
])
83 if (bits
% BITS_PER_LONG
)
84 if ((bitmap1
[k
] ^ bitmap2
[k
]) & BITMAP_LAST_WORD_MASK(bits
))
90 bool __bitmap_intersects(const unsigned long *bitmap1
,
91 const unsigned long *bitmap2
, unsigned int bits
)
93 unsigned int k
, lim
= bits
/BITS_PER_LONG
;
94 for (k
= 0; k
< lim
; ++k
)
95 if (bitmap1
[k
] & bitmap2
[k
])
98 if (bits
% BITS_PER_LONG
)
99 if ((bitmap1
[k
] & bitmap2
[k
]) & BITMAP_LAST_WORD_MASK(bits
))
104 void __bitmap_clear(unsigned long *map
, unsigned int start
, int len
)
106 unsigned long *p
= map
+ BIT_WORD(start
);
107 const unsigned int size
= start
+ len
;
108 int bits_to_clear
= BITS_PER_LONG
- (start
% BITS_PER_LONG
);
109 unsigned long mask_to_clear
= BITMAP_FIRST_WORD_MASK(start
);
111 while (len
- bits_to_clear
>= 0) {
112 *p
&= ~mask_to_clear
;
113 len
-= bits_to_clear
;
114 bits_to_clear
= BITS_PER_LONG
;
115 mask_to_clear
= ~0UL;
119 mask_to_clear
&= BITMAP_LAST_WORD_MASK(size
);
120 *p
&= ~mask_to_clear
;