Remove assembler code

Replace assembler code with C equivalent and slightly simplify
logic searching for first free core.

Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
This commit is contained in:
Robert Baldyga 2018-12-13 07:33:16 +01:00
parent a643614fd6
commit 6d81924891

View File

@ -190,33 +190,34 @@ error_out:
static unsigned long _ffz(unsigned long word) static unsigned long _ffz(unsigned long word)
{ {
asm("rep; bsf %1,%0" int i;
: "=r" (word)
: "r" (~word)); for (i = 0; i < sizeof(word)*8 && (word & 1); i++)
return word; word <<= 1;
return i;
} }
static unsigned long _ocf_mngt_find_first_free_core(const unsigned long *bitmap, static unsigned long _ocf_mngt_find_first_free_core(const unsigned long *bitmap)
unsigned long size)
{ {
unsigned long i; unsigned long i;
unsigned long ret = size; unsigned long ret = OCF_CORE_MAX;
/* check core 0 availability */ /* check core 0 availability */
bool zero_core_free = !(*bitmap & 0x1UL); bool zero_core_free = !(*bitmap & 0x1UL);
/* check if any core id is free except 0 */ /* 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; unsigned long long ignore_mask = (i == 0) ? 1UL : 0UL;
if (~(bitmap[i] | ignore_mask)) { 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)); _ffz(bitmap[i] | ignore_mask));
break; break;
} }
} }
/* return 0 only if no other core is free */ /* 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 0;
return ret; return ret;
@ -287,8 +288,7 @@ static int __ocf_mngt_find_core_id(ocf_cache_t cache,
/* Core is unspecified */ /* Core is unspecified */
cfg->core_id = _ocf_mngt_find_first_free_core( cfg->core_id = _ocf_mngt_find_first_free_core(
cache->conf_meta->valid_object_bitmap, cache->conf_meta->valid_object_bitmap);
OCF_CORE_MAX);
/* no need to check if find_first_zero_bit failed and /* no need to check if find_first_zero_bit failed and
* *core_id == MAX_CORE_OBJS_PER_CACHE, as above there is check * *core_id == MAX_CORE_OBJS_PER_CACHE, as above there is check
* for core_count being greater or equal to * for core_count being greater or equal to