Messages in this thread Patch in this message | | | From | Sasha Levin <> | Subject | [PATCH v3 04/14] tools bitmap: add bitmap_andnot definition | Date | Mon, 22 Jun 2020 18:42:48 -0400 |
| |
Add definition of bitmap_andnot() and wire tools/lib/bitmap.c into liblockdep.
This is needed as a result of de4643a77356 ("locking/lockdep: Reuse lock chains that have been freed").
Signed-off-by: Sasha Levin <sashal@kernel.org> --- tools/include/linux/bitmap.h | 10 ++++++++++ tools/lib/bitmap.c | 15 +++++++++++++++ tools/lib/lockdep/Build | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/tools/include/linux/bitmap.h b/tools/include/linux/bitmap.h index 477a1cae513f2..ab5df035f8eda 100644 --- a/tools/include/linux/bitmap.h +++ b/tools/include/linux/bitmap.h @@ -18,6 +18,8 @@ int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, int __bitmap_equal(const unsigned long *bitmap1, const unsigned long *bitmap2, unsigned int bits); void bitmap_clear(unsigned long *map, unsigned int start, int len); +int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, + const unsigned long *bitmap2, unsigned int bits); #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) @@ -178,4 +180,12 @@ static inline int bitmap_equal(const unsigned long *src1, return __bitmap_equal(src1, src2, nbits); } +static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1, + const unsigned long *src2, unsigned int nbits) +{ + if (small_const_nbits(nbits)) + return (*dst = *src1 & ~(*src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0; + return __bitmap_andnot(dst, src1, src2, nbits); +} + #endif /* _PERF_BITOPS_H */ diff --git a/tools/lib/bitmap.c b/tools/lib/bitmap.c index 5043747ef6c5f..b6bc037623fc1 100644 --- a/tools/lib/bitmap.c +++ b/tools/lib/bitmap.c @@ -86,3 +86,18 @@ int __bitmap_equal(const unsigned long *bitmap1, return 1; } + +int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, + const unsigned long *bitmap2, unsigned int bits) +{ + unsigned int k; + unsigned int lim = bits/BITS_PER_LONG; + unsigned long result = 0; + + for (k = 0; k < lim; k++) + result |= (dst[k] = bitmap1[k] & ~bitmap2[k]); + if (bits % BITS_PER_LONG) + result |= (dst[k] = bitmap1[k] & ~bitmap2[k] & + BITMAP_LAST_WORD_MASK(bits)); + return result != 0; +} diff --git a/tools/lib/lockdep/Build b/tools/lib/lockdep/Build index 6f667355b0687..219a9e2d9e0ba 100644 --- a/tools/lib/lockdep/Build +++ b/tools/lib/lockdep/Build @@ -1 +1 @@ -liblockdep-y += common.o lockdep.o preload.o rbtree.o +liblockdep-y += common.o lockdep.o preload.o rbtree.o ../../lib/bitmap.o -- 2.25.1
| |