From 81a1ef5e5a52dfae714905638b060b5606aa97ed Mon Sep 17 00:00:00 2001 From: Linda Jacobson Date: Wed, 15 Apr 2015 11:02:07 -0600 Subject: [PATCH] libxl: provide libxl_bitmap_{or,and} New functions to provide logical and and or of two bitmaps. These are generically useful utility functions added to the public API for the benefit of libxl's users. In the future they may also be useful internally, e.g. in the vNUMA configuration check function. Signed-off-by: Linda Jacobson Acked-by: Ian Campbell [ ijc -- rewrote commit message and fixed typo ] --- tools/libxl/libxl.h | 9 +++++ tools/libxl/libxl_utils.c | 70 +++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_utils.h | 6 ++++ 3 files changed, 85 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 1cf5699e94..44bd8e20b4 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -99,6 +99,15 @@ */ #define LIBXL_HAVE_CPUPOOL_ADD_REM_CPUMAP 1 +/* + * + * LIBXL_HAVE_BITMAP_AND_OR + * + * If this is defined, libxl has two library functions, libxl_bitmap_and + * and libxl_bitmap_or to compute the logical and and or of two bitmaps + */ +#define LIBXL_HAVE_BITMAP_AND_OR 1 + /* * LIBXL_HAVE_FIRMWARE_PASSTHROUGH indicates the feature for * passing in SMBIOS and ACPI firmware to HVM guests is present diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 9053b2798a..67c0b1c562 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -691,6 +691,76 @@ void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit) bitmap->map[bit / 8] &= ~(1 << (bit & 7)); } +int libxl_bitmap_or(libxl_ctx *ctx, libxl_bitmap *or_map, + const libxl_bitmap *map1, const libxl_bitmap *map2) +{ + GC_INIT(ctx); + int rc; + uint32_t i; + const libxl_bitmap *large_map; + const libxl_bitmap *small_map; + + if (map1->size > map2->size) { + large_map = map1; + small_map = map2; + } else { + large_map = map2; + small_map = map1; + } + + rc = libxl_bitmap_alloc(ctx, or_map, large_map->size * 8); + if (rc) + goto out; + + /* + * If bitmaps aren't the same size, their union (logical or) will + * be size of larger bit map. Any bit past the end of the + * smaller bit map, will match the larger one. + */ + for (i = 0; i < small_map->size; i++) + or_map->map[i] = (small_map->map[i] | large_map->map[i]); + + for (i = small_map->size; i < large_map->size; i++) + or_map->map[i] = large_map->map[i]; + +out: + GC_FREE; + return rc; +} + +int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map, + const libxl_bitmap *map1, const libxl_bitmap *map2) +{ + GC_INIT(ctx); + int rc; + uint32_t i; + const libxl_bitmap *large_map; + const libxl_bitmap *small_map; + + if (map1->size > map2->size) { + large_map = map1; + small_map = map2; + } else { + large_map = map2; + small_map = map1; + } + + rc = libxl_bitmap_alloc(ctx, and_map, small_map->size * 8); + if (rc) + goto out; + + /* + * If bitmaps aren't same size, their 'and' will be size of + * smaller bit map + */ + for (i = 0; i < and_map->size; i++) + and_map->map[i] = (large_map->map[i] & small_map->map[i]); + +out: + GC_FREE; + return rc; +} + int libxl_bitmap_count_set(const libxl_bitmap *bitmap) { int i, nr_set_bits = 0; diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 68b5580ff2..1c1761da4e 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -90,6 +90,12 @@ int libxl_bitmap_test(const libxl_bitmap *bitmap, int bit); void libxl_bitmap_set(libxl_bitmap *bitmap, int bit); void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit); int libxl_bitmap_count_set(const libxl_bitmap *bitmap); +int libxl_bitmap_or(libxl_ctx *ctx, libxl_bitmap *or_map, + const libxl_bitmap *map1, + const libxl_bitmap *map2); +int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map, + const libxl_bitmap *map1, + const libxl_bitmap *map2); char *libxl_bitmap_to_hex_string(libxl_ctx *ctx, const libxl_bitmap *bitmap); static inline void libxl_bitmap_set_any(libxl_bitmap *bitmap) { -- 2.39.5