at v4.8-rc8 2.7 kB view raw
1#ifndef _PERF_BITOPS_H 2#define _PERF_BITOPS_H 3 4#include <string.h> 5#include <linux/bitops.h> 6#include <stdlib.h> 7 8#define DECLARE_BITMAP(name,bits) \ 9 unsigned long name[BITS_TO_LONGS(bits)] 10 11int __bitmap_weight(const unsigned long *bitmap, int bits); 12void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, 13 const unsigned long *bitmap2, int bits); 14int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, 15 const unsigned long *bitmap2, unsigned int bits); 16 17#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) 18 19#define BITMAP_LAST_WORD_MASK(nbits) \ 20( \ 21 ((nbits) % BITS_PER_LONG) ? \ 22 (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \ 23) 24 25#define small_const_nbits(nbits) \ 26 (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG) 27 28static inline void bitmap_zero(unsigned long *dst, int nbits) 29{ 30 if (small_const_nbits(nbits)) 31 *dst = 0UL; 32 else { 33 int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); 34 memset(dst, 0, len); 35 } 36} 37 38static inline int bitmap_weight(const unsigned long *src, int nbits) 39{ 40 if (small_const_nbits(nbits)) 41 return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); 42 return __bitmap_weight(src, nbits); 43} 44 45static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, 46 const unsigned long *src2, int nbits) 47{ 48 if (small_const_nbits(nbits)) 49 *dst = *src1 | *src2; 50 else 51 __bitmap_or(dst, src1, src2, nbits); 52} 53 54/** 55 * test_and_set_bit - Set a bit and return its old value 56 * @nr: Bit to set 57 * @addr: Address to count from 58 */ 59static inline int test_and_set_bit(int nr, unsigned long *addr) 60{ 61 unsigned long mask = BIT_MASK(nr); 62 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 63 unsigned long old; 64 65 old = *p; 66 *p = old | mask; 67 68 return (old & mask) != 0; 69} 70 71/** 72 * bitmap_alloc - Allocate bitmap 73 * @nr: Bit to set 74 */ 75static inline unsigned long *bitmap_alloc(int nbits) 76{ 77 return calloc(1, BITS_TO_LONGS(nbits) * sizeof(unsigned long)); 78} 79 80/* 81 * bitmap_scnprintf - print bitmap list into buffer 82 * @bitmap: bitmap 83 * @nbits: size of bitmap 84 * @buf: buffer to store output 85 * @size: size of @buf 86 */ 87size_t bitmap_scnprintf(unsigned long *bitmap, int nbits, 88 char *buf, size_t size); 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 */ 97static 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 105#endif /* _PERF_BITOPS_H */