From 6d8192489123a5f4eb33007cb7c7c75cdb2e6722 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Thu, 13 Dec 2018 07:33:16 +0100 Subject: [PATCH] Remove assembler code Replace assembler code with C equivalent and slightly simplify logic searching for first free core. Signed-off-by: Robert Baldyga --- src/mngt/ocf_mngt_core.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/mngt/ocf_mngt_core.c b/src/mngt/ocf_mngt_core.c index d56af4b..13ba4d4 100644 --- a/src/mngt/ocf_mngt_core.c +++ b/src/mngt/ocf_mngt_core.c @@ -190,33 +190,34 @@ error_out: static unsigned long _ffz(unsigned long word) { - asm("rep; bsf %1,%0" - : "=r" (word) - : "r" (~word)); - return word; + int i; + + for (i = 0; i < sizeof(word)*8 && (word & 1); i++) + word <<= 1; + + return i; } -static unsigned long _ocf_mngt_find_first_free_core(const unsigned long *bitmap, - unsigned long size) +static unsigned long _ocf_mngt_find_first_free_core(const unsigned long *bitmap) { unsigned long i; - unsigned long ret = size; + unsigned long ret = OCF_CORE_MAX; /* check core 0 availability */ bool zero_core_free = !(*bitmap & 0x1UL); /* check if any core id is free except 0 */ - for (i = 0; i * sizeof(unsigned long) * 8 < size; i++) { + for (i = 0; i * sizeof(unsigned long) * 8 < OCF_CORE_MAX; i++) { unsigned long long ignore_mask = (i == 0) ? 1UL : 0UL; if (~(bitmap[i] | ignore_mask)) { - ret = MIN(size, i * sizeof(unsigned long) * 8 + + ret = MIN(OCF_CORE_MAX, i * sizeof(unsigned long) * 8 + _ffz(bitmap[i] | ignore_mask)); break; } } /* return 0 only if no other core is free */ - if (ret == size && zero_core_free) + if (ret == OCF_CORE_MAX && zero_core_free) return 0; return ret; @@ -287,8 +288,7 @@ static int __ocf_mngt_find_core_id(ocf_cache_t cache, /* Core is unspecified */ cfg->core_id = _ocf_mngt_find_first_free_core( - cache->conf_meta->valid_object_bitmap, - OCF_CORE_MAX); + cache->conf_meta->valid_object_bitmap); /* no need to check if find_first_zero_bit failed and * *core_id == MAX_CORE_OBJS_PER_CACHE, as above there is check * for core_count being greater or equal to