X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Flinux%2Fbitops.h;h=758476b1699cc34516d3fd3e2772c96a2a9a9901;hb=f6bdf318437339b1248ab2fd20139d28d9514a0e;hp=f2183d5430ba49affa395b20b0a6acf3c444b2c4;hpb=133dfeb64843af65a018be770eb005363ca59bd9;p=bcachefs-tools-debian diff --git a/include/linux/bitops.h b/include/linux/bitops.h index f2183d5..758476b 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -16,6 +16,7 @@ #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BITS_PER_TYPE(type) (sizeof(type) * BITS_PER_BYTE) #define BITS_PER_BYTE 8 #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) #define BITS_TO_U64(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64)) @@ -85,6 +86,17 @@ static inline bool test_and_set_bit(long nr, volatile unsigned long *addr) return (old & mask) != 0; } +static inline bool test_and_clear_bit(long nr, volatile unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *) addr) + BIT_WORD(nr); + unsigned long old; + + old = __atomic_fetch_and(p, ~mask, __ATOMIC_RELAXED); + + return (old & mask) != 0; +} + static inline void clear_bit_unlock(long nr, volatile unsigned long *addr) { unsigned long mask = BIT_MASK(nr); @@ -126,6 +138,11 @@ static inline unsigned long hweight64(u64 w) __builtin_popcount(w >> 32); } +static inline unsigned long hweight32(u32 w) +{ + return __builtin_popcount(w); +} + static inline unsigned long hweight8(unsigned long w) { return __builtin_popcountl(w);