|
[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 |