diff options
author | Jiri Olsa <jolsa@kernel.org> | 2016-08-01 14:02:31 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-08-02 15:33:27 -0400 |
commit | 741c74f55e8a66f3bc5bbc29dc162c952759e47b (patch) | |
tree | cac565727d5c11ee0e6044e16f51d53b2351e251 | |
parent | 820d12b70f91a19eb4a3152b9dd4ea9aee194a36 (diff) |
tools lib: Add bitmap_and function
Add support to perform logical and on bitmaps. Code taken from kernel's
include/linux/bitmap.h.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1470074555-24889-4-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/include/linux/bitmap.h | 17 | ||||
-rw-r--r-- | tools/lib/bitmap.c | 15 |
2 files changed, 32 insertions, 0 deletions
diff --git a/tools/include/linux/bitmap.h b/tools/include/linux/bitmap.h index 1cdded0041a8..43c1c5021e4b 100644 --- a/tools/include/linux/bitmap.h +++ b/tools/include/linux/bitmap.h | |||
@@ -11,6 +11,8 @@ | |||
11 | int __bitmap_weight(const unsigned long *bitmap, int bits); | 11 | int __bitmap_weight(const unsigned long *bitmap, int bits); |
12 | void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, | 12 | void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, |
13 | const unsigned long *bitmap2, int bits); | 13 | const unsigned long *bitmap2, int bits); |
14 | int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, | ||
15 | const unsigned long *bitmap2, unsigned int bits); | ||
14 | 16 | ||
15 | #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) | 17 | #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) |
16 | 18 | ||
@@ -85,4 +87,19 @@ static inline unsigned long *bitmap_alloc(int nbits) | |||
85 | size_t bitmap_scnprintf(unsigned long *bitmap, int nbits, | 87 | size_t bitmap_scnprintf(unsigned long *bitmap, int nbits, |
86 | char *buf, size_t size); | 88 | char *buf, size_t size); |
87 | 89 | ||
90 | /** | ||
91 | * bitmap_and - Do logical and on bitmaps | ||
92 | * @dst: resulting bitmap | ||
93 | * @src1: operand 1 | ||
94 | * @src2: operand 2 | ||
95 | * @nbits: size of bitmap | ||
96 | */ | ||
97 | static inline int bitmap_and(unsigned long *dst, const unsigned long *src1, | ||
98 | const unsigned long *src2, unsigned int nbits) | ||
99 | { | ||
100 | if (small_const_nbits(nbits)) | ||
101 | return (*dst = *src1 & *src2 & BITMAP_LAST_WORD_MASK(nbits)) != 0; | ||
102 | return __bitmap_and(dst, src1, src2, nbits); | ||
103 | } | ||
104 | |||
88 | #endif /* _PERF_BITOPS_H */ | 105 | #endif /* _PERF_BITOPS_H */ |
diff --git a/tools/lib/bitmap.c b/tools/lib/bitmap.c index 5c7e3185507c..38748b0e342f 100644 --- a/tools/lib/bitmap.c +++ b/tools/lib/bitmap.c | |||
@@ -58,3 +58,18 @@ size_t bitmap_scnprintf(unsigned long *bitmap, int nbits, | |||
58 | } | 58 | } |
59 | return ret; | 59 | return ret; |
60 | } | 60 | } |
61 | |||
62 | int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, | ||
63 | const unsigned long *bitmap2, unsigned int bits) | ||
64 | { | ||
65 | unsigned int k; | ||
66 | unsigned int lim = bits/BITS_PER_LONG; | ||
67 | unsigned long result = 0; | ||
68 | |||
69 | for (k = 0; k < lim; k++) | ||
70 | result |= (dst[k] = bitmap1[k] & bitmap2[k]); | ||
71 | if (bits % BITS_PER_LONG) | ||
72 | result |= (dst[k] = bitmap1[k] & bitmap2[k] & | ||
73 | BITMAP_LAST_WORD_MASK(bits)); | ||
74 | return result != 0; | ||
75 | } | ||