summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vnet/vnet/devices/dpdk/init.c11
-rw-r--r--vppinfra/vppinfra/bitmap.h25
2 files changed, 29 insertions, 7 deletions
diff --git a/vnet/vnet/devices/dpdk/init.c b/vnet/vnet/devices/dpdk/init.c
index 67ed251c88f..f51a5b7638e 100644
--- a/vnet/vnet/devices/dpdk/init.c
+++ b/vnet/vnet/devices/dpdk/init.c
@@ -1303,24 +1303,23 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
if (!dm->coremask_set_manually)
{
vlib_thread_registration_t * tr;
- uword coremask;
+ uword * coremask = 0;
int i;
/* main thread core */
- coremask = 1 << tm->main_lcore;
+ coremask = clib_bitmap_set(coremask, tm->main_lcore, 1);
for (i = 0; i < vec_len (tm->registrations); i++)
{
tr = tm->registrations[i];
- if (clib_bitmap_is_zero(tr->coremask))
- continue;
- coremask |= tr->coremask[0];
+ coremask = clib_bitmap_or(coremask, tr->coremask);
}
vec_insert (dm->eal_init_args, 2, 1);
dm->eal_init_args[1] = (u8 *) "-c";
- tmp = format (0, "%x%c", coremask, 0);
+ tmp = format (0, "%U%c", format_bitmap_hex, coremask, 0);
dm->eal_init_args[2] = tmp;
+ clib_bitmap_free(coremask);
}
if (!dm->nchannels_set_manually)
diff --git a/vppinfra/vppinfra/bitmap.h b/vppinfra/vppinfra/bitmap.h
index d8fd1542ffa..e69851b60be 100644
--- a/vppinfra/vppinfra/bitmap.h
+++ b/vppinfra/vppinfra/bitmap.h
@@ -542,7 +542,7 @@ unformat_bitmap_list(unformat_input_t * input, va_list * va)
else
goto error;
- if ((b < a) || (b > 63))
+ if (b < a)
goto error;
for (i = a; i <= b; i++)
@@ -555,4 +555,27 @@ error:
return 0;
}
+static inline u8 *
+format_bitmap_hex(u8 * s, va_list * args)
+{
+ uword * bitmap = va_arg (*args, uword *);
+ int i, is_trailing_zero = 1;
+
+ if (!bitmap)
+ return format(s, "0");
+
+ i = vec_bytes (bitmap) * 2;
+
+ while (i > 0)
+ {
+ u8 x = clib_bitmap_get_multiple(bitmap, --i * 4, 4);
+
+ if (x && is_trailing_zero)
+ is_trailing_zero = 0;
+
+ if (x || !is_trailing_zero)
+ s = format(s, "%x", x);
+ }
+ return s;
+}
#endif /* included_clib_bitmap_h */