[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v5 08/15] include/uk: bitopts.h - remove already existing functions
Some of the functions provided by bitopts.h are already implemented in unikraft. This patch turns these functions into wrappers around existing ones. The original FreeBSD code is using the same (atomic) function for both __set_bit and set_bit. That is not correct. The underscored version should be non-atomic. This patch also drops the test_bit for now, because there is a problem with it's implementation. Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> --- include/uk/bitops.h | 76 ++++++++++----------------------------------- 1 file changed, 17 insertions(+), 59 deletions(-) diff --git a/include/uk/bitops.h b/include/uk/bitops.h index e003a43..bb77e04 100644 --- a/include/uk/bitops.h +++ b/include/uk/bitops.h @@ -58,11 +58,11 @@ (((~0ULL) >> (BITS_PER_LONG_LONG - (h) - 1)) & ((~0ULL) << (l))) #define BITS_PER_BYTE 8 -#define hweight8(x) bitcount((uint8_t)(x)) -#define hweight16(x) bitcount16(x) -#define hweight32(x) bitcount32(x) -#define hweight64(x) bitcount64(x) -#define hweight_long(x) bitcountl(x) +#define hweight8(x) uk_bitcount((uint8_t)(x)) +#define hweight16(x) uk_bitcount16(x) +#define hweight32(x) uk_bitcount32(x) +#define hweight64(x) uk_bitcount64(x) +#define hweight_long(x) uk_bitcountl(x) static inline int fls64(uint64_t mask) @@ -236,79 +236,37 @@ find_next_zero_bit(const unsigned long *addr, unsigned long size, return (bit); } -#define __set_bit(i, a) \ - atomic_set_long(&((volatile unsigned long *)(a))[BIT_WORD(i)], BIT_MASK(i)) - -#define set_bit(i, a) \ - atomic_set_long(&((volatile unsigned long *)(a))[BIT_WORD(i)], BIT_MASK(i)) - -#define __clear_bit(i, a) \ - atomic_clear_long(&((volatile unsigned long *)(a))[BIT_WORD(i)], BIT_MASK(i)) - -#define clear_bit(i, a) \ - atomic_clear_long(&((volatile unsigned long *)(a))[BIT_WORD(i)], BIT_MASK(i)) - -#define test_bit(i, a) \ - !!(READ_ONCE(((volatile unsigned long *)(a))[BIT_WORD(i)]) & BIT_MASK(i)) +/* set_bit and clear_bit are atomic and protected against + * reordering (do barriers), while the underscored (__*) versions of + * them don't (not atomic). + */ +#define __set_bit(i, a) ukarch_set_bit(i, a) +#define set_bit(i, a) ukarch_set_bit_sync(i, a) +#define __clear_bit(i, a) ukarch_clr_bit(i, a) +#define clear_bit(i, a) ukarch_clr_bit_sync(i, a) static inline int test_and_clear_bit(long bit, volatile unsigned long *var) { - long val; - - var += BIT_WORD(bit); - bit %= BITS_PER_LONG; - bit = (1UL << bit); - do { - val = *var; - } while (atomic_cmpset_long(var, val, val & ~bit) == 0); - - return !!(val & bit); + return ukarch_test_and_clr_bit_sync(bit, (volatile void *) var); } static inline int __test_and_clear_bit(long bit, volatile unsigned long *var) { - long val; - - var += BIT_WORD(bit); - bit %= BITS_PER_LONG; - bit = (1UL << bit); - - val = *var; - *var &= ~bit; - - return !!(val & bit); + return ukarch_test_and_clr_bit(bit, (volatile void *) var); } static inline int test_and_set_bit(long bit, volatile unsigned long *var) { - long val; - - var += BIT_WORD(bit); - bit %= BITS_PER_LONG; - bit = (1UL << bit); - do { - val = *var; - } while (atomic_cmpset_long(var, val, val | bit) == 0); - - return !!(val & bit); + return ukarch_test_and_set_bit_sync(bit, (volatile void *) var); } static inline int __test_and_set_bit(long bit, volatile unsigned long *var) { - long val; - - var += BIT_WORD(bit); - bit %= BITS_PER_LONG; - bit = (1UL << bit); - - val = *var; - *var |= bit; - - return !!(val & bit); + return ukarch_test_and_set_bit(bit, (volatile void *) var); } enum { -- 2.18.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |