+ dev. +cristian(Bitmap maintainer) Please review.
Thanks! On Monday 24 September 2018 09:08 PM, Vivek Sharma wrote: > Currently, slab operations use unsigned long data type for 64-bit slab > related operations. On target 'i686-native-linuxapp-gcc', unsigned long > is 32-bit and thus, slab operations breaks on this target. Changing slab > operations to use unsigned long long for correct functioning on all targets. > > Fixes: de3cfa2c9823 ("sched: initial import") > Fixes: 693f715da45c ("remove extra parentheses in return statement") > CC: sta...@dpdk.org > > Signed-off-by: Vivek Sharma <vivek.sha...@caviumnetworks.com> > --- > lib/librte_eal/common/include/rte_bitmap.h | 14 +++++++------- > test/test/test_bitmap.c | 18 ++++++++++++++++++ > 2 files changed, 25 insertions(+), 7 deletions(-) > > diff --git a/lib/librte_eal/common/include/rte_bitmap.h > b/lib/librte_eal/common/include/rte_bitmap.h > index d9facc6..7a36ce7 100644 > --- a/lib/librte_eal/common/include/rte_bitmap.h > +++ b/lib/librte_eal/common/include/rte_bitmap.h > @@ -88,7 +88,7 @@ __rte_bitmap_index1_inc(struct rte_bitmap *bmp) > static inline uint64_t > __rte_bitmap_mask1_get(struct rte_bitmap *bmp) > { > - return (~1lu) << bmp->offset1; > + return (~1llu) << bmp->offset1; > } > > static inline void > @@ -317,7 +317,7 @@ rte_bitmap_get(struct rte_bitmap *bmp, uint32_t pos) > index2 = pos >> RTE_BITMAP_SLAB_BIT_SIZE_LOG2; > offset2 = pos & RTE_BITMAP_SLAB_BIT_MASK; > slab2 = bmp->array2 + index2; > - return (*slab2) & (1lu << offset2); > + return (*slab2) & (1llu << offset2); > } > > /** > @@ -342,8 +342,8 @@ rte_bitmap_set(struct rte_bitmap *bmp, uint32_t pos) > slab2 = bmp->array2 + index2; > slab1 = bmp->array1 + index1; > > - *slab2 |= 1lu << offset2; > - *slab1 |= 1lu << offset1; > + *slab2 |= 1llu << offset2; > + *slab1 |= 1llu << offset1; > } > > /** > @@ -370,7 +370,7 @@ rte_bitmap_set_slab(struct rte_bitmap *bmp, uint32_t pos, > uint64_t slab) > slab1 = bmp->array1 + index1; > > *slab2 |= slab; > - *slab1 |= 1lu << offset1; > + *slab1 |= 1llu << offset1; > } > > static inline uint64_t > @@ -408,7 +408,7 @@ rte_bitmap_clear(struct rte_bitmap *bmp, uint32_t pos) > slab2 = bmp->array2 + index2; > > /* Return if array2 slab is not all-zeros */ > - *slab2 &= ~(1lu << offset2); > + *slab2 &= ~(1llu << offset2); > if (*slab2){ > return; > } > @@ -424,7 +424,7 @@ rte_bitmap_clear(struct rte_bitmap *bmp, uint32_t pos) > index1 = pos >> (RTE_BITMAP_SLAB_BIT_SIZE_LOG2 + > RTE_BITMAP_CL_BIT_SIZE_LOG2); > offset1 = (pos >> RTE_BITMAP_CL_BIT_SIZE_LOG2) & > RTE_BITMAP_SLAB_BIT_MASK; > slab1 = bmp->array1 + index1; > - *slab1 &= ~(1lu << offset1); > + *slab1 &= ~(1llu << offset1); > > return; > } > diff --git a/test/test/test_bitmap.c b/test/test/test_bitmap.c > index c3169e9..95c5184 100644 > --- a/test/test/test_bitmap.c > +++ b/test/test/test_bitmap.c > @@ -101,6 +101,7 @@ test_bitmap_slab_set_get(struct rte_bitmap *bmp) > static int > test_bitmap_set_get_clear(struct rte_bitmap *bmp) > { > + uint64_t val; > int i; > > rte_bitmap_reset(bmp); > @@ -124,6 +125,23 @@ test_bitmap_set_get_clear(struct rte_bitmap *bmp) > } > } > > + rte_bitmap_reset(bmp); > + > + /* Alternate slab set test */ > + for (i = 0; i < MAX_BITS; i++) { > + if (i % RTE_BITMAP_SLAB_BIT_SIZE) > + rte_bitmap_set(bmp, i); > + } > + > + for (i = 0; i < MAX_BITS; i++) { > + val = rte_bitmap_get(bmp, i); > + if (((i % RTE_BITMAP_SLAB_BIT_SIZE) && !val) || > + (!(i % RTE_BITMAP_SLAB_BIT_SIZE) && val)) { > + printf("Failed to get set bit.\n"); > + return TEST_FAILED; > + } > + } > + > return TEST_SUCCESS; > } > >