diff options
-rw-r--r-- | tools/libxl/gentest.py | 14 | ||||
-rw-r--r-- | tools/libxl/libxl.c | 38 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 15 | ||||
-rw-r--r-- | tools/libxl/libxl_create.c | 8 | ||||
-rw-r--r-- | tools/libxl/libxl_dm.c | 6 | ||||
-rw-r--r-- | tools/libxl/libxl_dom.c | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_json.c | 8 | ||||
-rw-r--r-- | tools/libxl/libxl_json.h | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_types.idl | 10 | ||||
-rw-r--r-- | tools/libxl/libxl_utils.c | 67 | ||||
-rw-r--r-- | tools/libxl/libxl_utils.h | 47 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 100 | ||||
-rw-r--r-- | tools/python/xen/lowlevel/xl/xl.c | 10 |
13 files changed, 167 insertions, 160 deletions
diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py index f79c906fe0..2915f717fc 100644 --- a/tools/libxl/gentest.py +++ b/tools/libxl/gentest.py @@ -20,7 +20,7 @@ def randomize_case(s): def randomize_enum(e): return random.choice([v.name for v in e.values]) -handcoded = ["libxl_cpumap", "libxl_key_value_list", +handcoded = ["libxl_bitmap", "libxl_key_value_list", "libxl_cpuid_policy_list", "libxl_string_list"] def gen_rand_init(ty, v, indent = " ", parent = None): @@ -117,16 +117,16 @@ static void rand_bytes(uint8_t *p, size_t sz) p[i] = rand() % 256; } -static void libxl_cpumap_rand_init(libxl_cpumap *cpumap) +static void libxl_bitmap_rand_init(libxl_bitmap *bitmap) { int i; - cpumap->size = rand() % 16; - cpumap->map = calloc(cpumap->size, sizeof(*cpumap->map)); - libxl_for_each_cpu(i, *cpumap) { + bitmap->size = rand() % 16; + bitmap->map = calloc(bitmap->size, sizeof(*bitmap->map)); + libxl_for_each_bit(i, *bitmap) { if (rand() % 2) - libxl_cpumap_set(cpumap, i); + libxl_bitmap_set(bitmap, i); else - libxl_cpumap_reset(cpumap, i); + libxl_bitmap_reset(bitmap, i); } } diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2ecdce3efd..427774560b 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -586,7 +586,7 @@ static int cpupool_info(libxl__gc *gc, info->poolid = xcinfo->cpupool_id; info->sched = xcinfo->sched_id; info->n_dom = xcinfo->n_dom; - rc = libxl_cpumap_alloc(CTX, &info->cpumap, 0); + rc = libxl_cpu_bitmap_alloc(CTX, &info->cpumap, 0); if (rc) { LOG(ERROR, "unable to allocate cpumap %d\n", rc); @@ -3431,7 +3431,7 @@ libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid, } for (*nb_vcpu = 0; *nb_vcpu <= domaininfo.max_vcpu_id; ++*nb_vcpu, ++ptr) { - if (libxl_cpumap_alloc(ctx, &ptr->cpumap, 0)) { + if (libxl_cpu_bitmap_alloc(ctx, &ptr->cpumap, 0)) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpumap"); return NULL; } @@ -3454,7 +3454,7 @@ libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid, } int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, - libxl_cpumap *cpumap) + libxl_bitmap *cpumap) { if (xc_vcpu_setaffinity(ctx->xch, domid, vcpuid, cpumap->map)) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting vcpu affinity"); @@ -3464,7 +3464,7 @@ int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, } int libxl_set_vcpuaffinity_all(libxl_ctx *ctx, uint32_t domid, - unsigned int max_vcpus, libxl_cpumap *cpumap) + unsigned int max_vcpus, libxl_bitmap *cpumap) { int i, rc = 0; @@ -3478,7 +3478,7 @@ int libxl_set_vcpuaffinity_all(libxl_ctx *ctx, uint32_t domid, return rc; } -int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap) +int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) { GC_INIT(ctx); libxl_dominfo info; @@ -3498,7 +3498,7 @@ retry_transaction: for (i = 0; i <= info.vcpu_max_id; i++) libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/cpu/%u/availability", dompath, i), - "%s", libxl_cpumap_test(cpumap, i) ? "online" : "offline"); + "%s", libxl_bitmap_test(cpumap, i) ? "online" : "offline"); if (!xs_transaction_end(ctx->xsh, t, 0)) { if (errno == EAGAIN) goto retry_transaction; @@ -4094,7 +4094,7 @@ int libxl_tmem_freeable(libxl_ctx *ctx) return rc; } -int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap) +int libxl_get_freecpus(libxl_ctx *ctx, libxl_bitmap *cpumap) { int ncpus; @@ -4113,7 +4113,7 @@ int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap) int libxl_cpupool_create(libxl_ctx *ctx, const char *name, libxl_scheduler sched, - libxl_cpumap cpumap, libxl_uuid *uuid, + libxl_bitmap cpumap, libxl_uuid *uuid, uint32_t *poolid) { GC_INIT(ctx); @@ -4136,8 +4136,8 @@ int libxl_cpupool_create(libxl_ctx *ctx, const char *name, return ERROR_FAIL; } - libxl_for_each_cpu(i, cpumap) - if (libxl_cpumap_test(&cpumap, i)) { + libxl_for_each_bit(i, cpumap) + if (libxl_bitmap_test(&cpumap, i)) { rc = xc_cpupool_addcpu(ctx->xch, *poolid, i); if (rc) { LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, @@ -4172,7 +4172,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid) int rc, i; xc_cpupoolinfo_t *info; xs_transaction_t t; - libxl_cpumap cpumap; + libxl_bitmap cpumap; info = xc_cpupool_getinfo(ctx->xch, poolid); if (info == NULL) { @@ -4184,13 +4184,13 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid) if ((info->cpupool_id != poolid) || (info->n_dom)) goto out; - rc = libxl_cpumap_alloc(ctx, &cpumap, 0); + rc = libxl_cpu_bitmap_alloc(ctx, &cpumap, 0); if (rc) goto out; memcpy(cpumap.map, info->cpumap, cpumap.size); - libxl_for_each_cpu(i, cpumap) - if (libxl_cpumap_test(&cpumap, i)) { + libxl_for_each_bit(i, cpumap) + if (libxl_bitmap_test(&cpumap, i)) { rc = xc_cpupool_removecpu(ctx->xch, poolid, i); if (rc) { LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, @@ -4219,7 +4219,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid) rc = 0; out1: - libxl_cpumap_dispose(&cpumap); + libxl_bitmap_dispose(&cpumap); out: xc_cpupool_infofree(ctx->xch, info); GC_FREE; @@ -4287,7 +4287,7 @@ int libxl_cpupool_cpuadd_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cp { int rc = 0; int cpu, nr; - libxl_cpumap freemap; + libxl_bitmap freemap; libxl_cputopology *topology; if (libxl_get_freecpus(ctx, &freemap)) { @@ -4302,7 +4302,7 @@ int libxl_cpupool_cpuadd_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cp *cpus = 0; for (cpu = 0; cpu < nr; cpu++) { - if (libxl_cpumap_test(&freemap, cpu) && (topology[cpu].node == node) && + if (libxl_bitmap_test(&freemap, cpu) && (topology[cpu].node == node) && !libxl_cpupool_cpuadd(ctx, poolid, cpu)) { (*cpus)++; } @@ -4311,7 +4311,7 @@ int libxl_cpupool_cpuadd_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cp free(topology); out: - libxl_cpumap_dispose(&freemap); + libxl_bitmap_dispose(&freemap); return rc; } @@ -4353,7 +4353,7 @@ int libxl_cpupool_cpuremove_node(libxl_ctx *ctx, uint32_t poolid, int node, int if (poolinfo[p].poolid == poolid) { for (cpu = 0; cpu < nr_cpus; cpu++) { if ((topology[cpu].node == node) && - libxl_cpumap_test(&poolinfo[p].cpumap, cpu) && + libxl_bitmap_test(&poolinfo[p].cpumap, cpu) && !libxl_cpupool_cpuremove(ctx, poolid, cpu)) { (*cpus)++; } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index cb18eda9d5..f5a8f877ea 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -285,8 +285,9 @@ typedef uint64_t libxl_ev_user; typedef struct { uint32_t size; /* number of bytes in map */ uint8_t *map; -} libxl_cpumap; -void libxl_cpumap_dispose(libxl_cpumap *map); +} libxl_bitmap; +void libxl_bitmap_init(libxl_bitmap *map); +void libxl_bitmap_dispose(libxl_bitmap *map); /* libxl_cpuid_policy_list is a dynamic array storing CPUID policies * for multiple leafs. It is terminated with an entry holding @@ -790,10 +791,10 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid, int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo); int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, - libxl_cpumap *cpumap); + libxl_bitmap *cpumap); int libxl_set_vcpuaffinity_all(libxl_ctx *ctx, uint32_t domid, - unsigned int max_vcpus, libxl_cpumap *cpumap); -int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap); + unsigned int max_vcpus, libxl_bitmap *cpumap); +int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap); libxl_scheduler libxl_get_scheduler(libxl_ctx *ctx); @@ -843,10 +844,10 @@ int libxl_tmem_shared_auth(libxl_ctx *ctx, uint32_t domid, char* uuid, int auth); int libxl_tmem_freeable(libxl_ctx *ctx); -int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap); +int libxl_get_freecpus(libxl_ctx *ctx, libxl_bitmap *cpumap); int libxl_cpupool_create(libxl_ctx *ctx, const char *name, libxl_scheduler sched, - libxl_cpumap cpumap, libxl_uuid *uuid, + libxl_bitmap cpumap, libxl_uuid *uuid, uint32_t *poolid); int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid); int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 2ddf5fba48..294a73fe57 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -203,16 +203,16 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, if (!b_info->max_vcpus) b_info->max_vcpus = 1; if (!b_info->avail_vcpus.size) { - if (libxl_cpumap_alloc(CTX, &b_info->avail_vcpus, 1)) + if (libxl_cpu_bitmap_alloc(CTX, &b_info->avail_vcpus, 1)) return ERROR_FAIL; - libxl_cpumap_set(&b_info->avail_vcpus, 0); + libxl_bitmap_set(&b_info->avail_vcpus, 0); } else if (b_info->avail_vcpus.size > HVM_MAX_VCPUS) return ERROR_FAIL; if (!b_info->cpumap.size) { - if (libxl_cpumap_alloc(CTX, &b_info->cpumap, 0)) + if (libxl_cpu_bitmap_alloc(CTX, &b_info->cpumap, 0)) return ERROR_FAIL; - libxl_cpumap_set_any(&b_info->cpumap); + libxl_bitmap_set_any(&b_info->cpumap); } if (b_info->max_memkb == LIBXL_MEMKB_DEFAULT) diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index acba613dff..dadad76108 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -208,8 +208,8 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc, NULL); } - nr_set_cpus = libxl_cpumap_count_set(&b_info->avail_vcpus); - s = libxl_cpumap_to_hex_string(CTX, &b_info->avail_vcpus); + nr_set_cpus = libxl_bitmap_count_set(&b_info->avail_vcpus); + s = libxl_bitmap_to_hex_string(CTX, &b_info->avail_vcpus); flexarray_vappend(dm_args, "-vcpu_avail", libxl__sprintf(gc, "%s", s), NULL); free(s); @@ -459,7 +459,7 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc, flexarray_append(dm_args, "-smp"); if (b_info->avail_vcpus.size) { int nr_set_cpus = 0; - nr_set_cpus = libxl_cpumap_count_set(&b_info->avail_vcpus); + nr_set_cpus = libxl_bitmap_count_set(&b_info->avail_vcpus); flexarray_append(dm_args, libxl__sprintf(gc, "%d,maxcpus=%d", b_info->max_vcpus, diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 91aa4a279e..b6111ad434 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -202,7 +202,7 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, ents[11] = libxl__sprintf(gc, "%lu", state->store_mfn); for (i = 0; i < info->max_vcpus; i++) { ents[12+(i*2)] = libxl__sprintf(gc, "cpu/%d/availability", i); - ents[12+(i*2)+1] = libxl_cpumap_test(&info->avail_vcpus, i) + ents[12+(i*2)+1] = libxl_bitmap_test(&info->avail_vcpus, i) ? "online" : "offline"; } diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c index cd2719ab1e..e870606db5 100644 --- a/tools/libxl/libxl_json.c +++ b/tools/libxl/libxl_json.c @@ -99,8 +99,8 @@ yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, return yajl_gen_string(hand, (const unsigned char *)buf, LIBXL_UUID_FMTLEN); } -yajl_gen_status libxl_cpumap_gen_json(yajl_gen hand, - libxl_cpumap *cpumap) +yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand, + libxl_bitmap *bitmap) { yajl_gen_status s; int i; @@ -108,8 +108,8 @@ yajl_gen_status libxl_cpumap_gen_json(yajl_gen hand, s = yajl_gen_array_open(hand); if (s != yajl_gen_status_ok) goto out; - libxl_for_each_cpu(i, *cpumap) { - if (libxl_cpumap_test(cpumap, i)) { + libxl_for_each_bit(i, *bitmap) { + if (libxl_bitmap_test(bitmap, i)) { s = yajl_gen_integer(hand, i); if (s != yajl_gen_status_ok) goto out; } diff --git a/tools/libxl/libxl_json.h b/tools/libxl/libxl_json.h index a9721a7007..1464459141 100644 --- a/tools/libxl/libxl_json.h +++ b/tools/libxl/libxl_json.h @@ -26,7 +26,7 @@ yajl_gen_status libxl_defbool_gen_json(yajl_gen hand, libxl_defbool *p); yajl_gen_status libxl_domid_gen_json(yajl_gen hand, libxl_domid *p); yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, libxl_uuid *p); yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *p); -yajl_gen_status libxl_cpumap_gen_json(yajl_gen hand, libxl_cpumap *p); +yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand, libxl_bitmap *p); yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand, libxl_cpuid_policy_list *p); yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *p); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 2735ebd82a..c3fbe77c67 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -10,7 +10,7 @@ libxl_defbool = Builtin("defbool", passby=PASS_BY_REFERENCE) libxl_domid = Builtin("domid", json_fn = "yajl_gen_integer", autogenerate_json = False) libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE) libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE) -libxl_cpumap = Builtin("cpumap", dispose_fn="libxl_cpumap_dispose", passby=PASS_BY_REFERENCE) +libxl_bitmap = Builtin("bitmap", dispose_fn="libxl_bitmap_dispose", passby=PASS_BY_REFERENCE) libxl_cpuid_policy_list = Builtin("cpuid_policy_list", dispose_fn="libxl_cpuid_dispose", passby=PASS_BY_REFERENCE) libxl_string_list = Builtin("string_list", dispose_fn="libxl_string_list_dispose", passby=PASS_BY_REFERENCE) @@ -198,7 +198,7 @@ libxl_cpupoolinfo = Struct("cpupoolinfo", [ ("poolid", uint32), ("sched", libxl_scheduler), ("n_dom", uint32), - ("cpumap", libxl_cpumap) + ("cpumap", libxl_bitmap) ], dir=DIR_OUT) libxl_vminfo = Struct("vminfo", [ @@ -247,8 +247,8 @@ libxl_domain_sched_params = Struct("domain_sched_params",[ libxl_domain_build_info = Struct("domain_build_info",[ ("max_vcpus", integer), - ("avail_vcpus", libxl_cpumap), - ("cpumap", libxl_cpumap), + ("avail_vcpus", libxl_bitmap), + ("cpumap", libxl_bitmap), ("tsc_mode", libxl_tsc_mode), ("max_memkb", MemKB), ("target_memkb", MemKB), @@ -409,7 +409,7 @@ libxl_vcpuinfo = Struct("vcpuinfo", [ ("blocked", bool), ("running", bool), ("vcpu_time", uint64), # total vcpu time ran (ns) - ("cpumap", libxl_cpumap), # current cpu's affinities + ("cpumap", libxl_bitmap), # current cpu's affinities ], dir=DIR_OUT) libxl_physinfo = Struct("physinfo", [ diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 29f430d977..0301bd00a3 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -487,79 +487,70 @@ int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid, return rc; } -int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap, int max_cpus) +int libxl_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *bitmap, int n_bits) { GC_INIT(ctx); int sz; - int rc; - if (max_cpus < 0) { - rc = ERROR_INVAL; - goto out; - } - if (max_cpus == 0) - max_cpus = libxl_get_max_cpus(ctx); - if (max_cpus == 0) { - rc = ERROR_FAIL; - goto out; - } - - sz = (max_cpus + 7) / 8; - cpumap->map = libxl__calloc(NOGC, sizeof(*cpumap->map), sz); - cpumap->size = sz; + sz = (n_bits + 7) / 8; + bitmap->map = libxl__calloc(NOGC, sizeof(*bitmap->map), sz); + bitmap->size = sz; - rc = 0; - out: GC_FREE; - return rc; + return 0; +} + +void libxl_bitmap_init(libxl_bitmap *map) +{ + memset(map, '\0', sizeof(*map)); } -void libxl_cpumap_dispose(libxl_cpumap *map) +void libxl_bitmap_dispose(libxl_bitmap *map) { free(map->map); } -int libxl_cpumap_test(const libxl_cpumap *cpumap, int cpu) +int libxl_bitmap_test(const libxl_bitmap *bitmap, int bit) { - if (cpu >= cpumap->size * 8) + if (bit >= bitmap->size * 8) return 0; - return (cpumap->map[cpu / 8] & (1 << (cpu & 7))) ? 1 : 0; + return (bitmap->map[bit / 8] & (1 << (bit & 7))) ? 1 : 0; } -void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu) +void libxl_bitmap_set(libxl_bitmap *bitmap, int bit) { - if (cpu >= cpumap->size * 8) + if (bit >= bitmap->size * 8) return; - cpumap->map[cpu / 8] |= 1 << (cpu & 7); + bitmap->map[bit / 8] |= 1 << (bit & 7); } -void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu) +void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit) { - if (cpu >= cpumap->size * 8) + if (bit >= bitmap->size * 8) return; - cpumap->map[cpu / 8] &= ~(1 << (cpu & 7)); + bitmap->map[bit / 8] &= ~(1 << (bit & 7)); } -int libxl_cpumap_count_set(const libxl_cpumap *cpumap) +int libxl_bitmap_count_set(const libxl_bitmap *bitmap) { - int i, nr_set_cpus = 0; - libxl_for_each_set_cpu(i, *cpumap) - nr_set_cpus++; + int i, nr_set_bits = 0; + libxl_for_each_set_bit(i, *bitmap) + nr_set_bits++; - return nr_set_cpus; + return nr_set_bits; } /* NB. caller is responsible for freeing the memory */ -char *libxl_cpumap_to_hex_string(libxl_ctx *ctx, const libxl_cpumap *cpumap) +char *libxl_bitmap_to_hex_string(libxl_ctx *ctx, const libxl_bitmap *bitmap) { GC_INIT(ctx); - int i = cpumap->size; - char *p = libxl__zalloc(NOGC, cpumap->size * 2 + 3); + int i = bitmap->size; + char *p = libxl__zalloc(NOGC, bitmap->size * 2 + 3); char *q = p; strncpy(p, "0x", 2); p += 2; while(--i >= 0) { - sprintf(p, "%02x", cpumap->map[i]); + sprintf(p, "%02x", bitmap->map[i]); p += 2; } *p = '\0'; diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 05a269a9e1..74ab611502 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -63,29 +63,44 @@ int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, int devid, int libxl_vdev_to_device_disk(libxl_ctx *ctx, uint32_t domid, const char *vdev, libxl_device_disk *disk); -int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap, int max_cpus); -int libxl_cpumap_test(const libxl_cpumap *cpumap, int cpu); -void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu); -void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu); -int libxl_cpumap_count_set(const libxl_cpumap *cpumap); -char *libxl_cpumap_to_hex_string(libxl_ctx *ctx, const libxl_cpumap *cpumap); -static inline void libxl_cpumap_set_any(libxl_cpumap *cpumap) +int libxl_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *bitmap, int n_bits); + /* Allocated bimap is from malloc, libxl_bitmap_dispose() to be + * called by the application when done. */ +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 *cpumap); +char *libxl_bitmap_to_hex_string(libxl_ctx *ctx, const libxl_bitmap *cpumap); +static inline void libxl_bitmap_set_any(libxl_bitmap *bitmap) { - memset(cpumap->map, -1, cpumap->size); + memset(bitmap->map, -1, bitmap->size); } -static inline void libxl_cpumap_set_none(libxl_cpumap *cpumap) +static inline void libxl_bitmap_set_none(libxl_bitmap *bitmap) { - memset(cpumap->map, 0, cpumap->size); + memset(bitmap->map, 0, bitmap->size); } -static inline int libxl_cpumap_cpu_valid(libxl_cpumap *cpumap, int cpu) +static inline int libxl_bitmap_cpu_valid(libxl_bitmap *bitmap, int bit) { - return cpu >= 0 && cpu < (cpumap->size * 8); + return bit >= 0 && bit < (bitmap->size * 8); } -#define libxl_for_each_cpu(var, map) for (var = 0; var < (map).size * 8; var++) -#define libxl_for_each_set_cpu(v, m) for (v = 0; v < (m).size * 8; v++) \ - if (libxl_cpumap_test(&(m), v)) +#define libxl_for_each_bit(var, map) for (var = 0; var < (map).size * 8; var++) +#define libxl_for_each_set_bit(v, m) for (v = 0; v < (m).size * 8; v++) \ + if (libxl_bitmap_test(&(m), v)) -static inline uint32_t libxl__sizekb_to_mb(uint32_t s) { +static inline int libxl_cpu_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *cpumap, + int max_cpus) +{ + if (max_cpus < 0) + return ERROR_INVAL; + if (max_cpus == 0) + max_cpus = libxl_get_max_cpus(ctx); + if (max_cpus == 0) + return ERROR_FAIL; + + return libxl_bitmap_alloc(ctx, cpumap, max_cpus); +} + + static inline uint32_t libxl__sizekb_to_mb(uint32_t s) { return (s + 1023) / 1024; } diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index f98dab7af6..e2aa8592bc 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -492,19 +492,19 @@ static void split_string_into_string_list(const char *str, free(s); } -static int vcpupin_parse(char *cpu, libxl_cpumap *cpumap) +static int vcpupin_parse(char *cpu, libxl_bitmap *cpumap) { - libxl_cpumap exclude_cpumap; + libxl_bitmap exclude_cpumap; uint32_t cpuida, cpuidb; char *endptr, *toka, *tokb, *saveptr = NULL; int i, rc = 0, rmcpu; if (!strcmp(cpu, "all")) { - libxl_cpumap_set_any(cpumap); + libxl_bitmap_set_any(cpumap); return 0; } - if (libxl_cpumap_alloc(ctx, &exclude_cpumap, 0)) { + if (libxl_cpu_bitmap_alloc(ctx, &exclude_cpumap, 0)) { fprintf(stderr, "Error: Failed to allocate cpumap.\n"); return ENOMEM; } @@ -534,19 +534,19 @@ static int vcpupin_parse(char *cpu, libxl_cpumap *cpumap) } } while (cpuida <= cpuidb) { - rmcpu == 0 ? libxl_cpumap_set(cpumap, cpuida) : - libxl_cpumap_set(&exclude_cpumap, cpuida); + rmcpu == 0 ? libxl_bitmap_set(cpumap, cpuida) : + libxl_bitmap_set(&exclude_cpumap, cpuida); cpuida++; } } /* Clear all the cpus from the removal list */ - libxl_for_each_set_cpu(i, exclude_cpumap) { - libxl_cpumap_reset(cpumap, i); + libxl_for_each_set_bit(i, exclude_cpumap) { + libxl_bitmap_reset(cpumap, i); } vcpp_out: - libxl_cpumap_dispose(&exclude_cpumap); + libxl_bitmap_dispose(&exclude_cpumap); return rc; } @@ -649,13 +649,13 @@ static void parse_config_data(const char *config_source, if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) { b_info->max_vcpus = l; - if (libxl_cpumap_alloc(ctx, &b_info->avail_vcpus, l)) { + if (libxl_cpu_bitmap_alloc(ctx, &b_info->avail_vcpus, l)) { fprintf(stderr, "Unable to allocate cpumap\n"); exit(1); } - libxl_cpumap_set_none(&b_info->avail_vcpus); + libxl_bitmap_set_none(&b_info->avail_vcpus); while (l-- > 0) - libxl_cpumap_set((&b_info->avail_vcpus), l); + libxl_bitmap_set((&b_info->avail_vcpus), l); } if (!xlu_cfg_get_long (config, "maxvcpus", &l, 0)) @@ -664,7 +664,7 @@ static void parse_config_data(const char *config_source, if (!xlu_cfg_get_list (config, "cpus", &cpus, 0, 1)) { int i, n_cpus = 0; - if (libxl_cpumap_alloc(ctx, &b_info->cpumap, 0)) { + if (libxl_cpu_bitmap_alloc(ctx, &b_info->cpumap, 0)) { fprintf(stderr, "Unable to allocate cpumap\n"); exit(1); } @@ -684,14 +684,14 @@ static void parse_config_data(const char *config_source, * the cpumap derived from the list ensures memory is being * allocated on the proper nodes anyway. */ - libxl_cpumap_set_none(&b_info->cpumap); + libxl_bitmap_set_none(&b_info->cpumap); while ((buf = xlu_cfg_get_listitem(cpus, n_cpus)) != NULL) { i = atoi(buf); - if (!libxl_cpumap_cpu_valid(&b_info->cpumap, i)) { + if (!libxl_bitmap_cpu_valid(&b_info->cpumap, i)) { fprintf(stderr, "cpu %d illegal\n", i); exit(1); } - libxl_cpumap_set(&b_info->cpumap, i); + libxl_bitmap_set(&b_info->cpumap, i); if (n_cpus < b_info->max_vcpus) vcpu_to_pcpu[n_cpus] = i; n_cpus++; @@ -700,12 +700,12 @@ static void parse_config_data(const char *config_source, else if (!xlu_cfg_get_string (config, "cpus", &buf, 0)) { char *buf2 = strdup(buf); - if (libxl_cpumap_alloc(ctx, &b_info->cpumap, 0)) { + if (libxl_cpu_bitmap_alloc(ctx, &b_info->cpumap, 0)) { fprintf(stderr, "Unable to allocate cpumap\n"); exit(1); } - libxl_cpumap_set_none(&b_info->cpumap); + libxl_bitmap_set_none(&b_info->cpumap); if (vcpupin_parse(buf2, &b_info->cpumap)) exit(1); free(buf2); @@ -1805,28 +1805,28 @@ start: /* If single vcpu to pcpu mapping was requested, honour it */ if (vcpu_to_pcpu) { - libxl_cpumap vcpu_cpumap; + libxl_bitmap vcpu_cpumap; - ret = libxl_cpumap_alloc(ctx, &vcpu_cpumap, 0); + ret = libxl_cpu_bitmap_alloc(ctx, &vcpu_cpumap, 0); if (ret) goto error_out; for (i = 0; i < d_config.b_info.max_vcpus; i++) { if (vcpu_to_pcpu[i] != -1) { - libxl_cpumap_set_none(&vcpu_cpumap); - libxl_cpumap_set(&vcpu_cpumap, vcpu_to_pcpu[i]); + libxl_bitmap_set_none(&vcpu_cpumap); + libxl_bitmap_set(&vcpu_cpumap, vcpu_to_pcpu[i]); } else { - libxl_cpumap_set_any(&vcpu_cpumap); + libxl_bitmap_set_any(&vcpu_cpumap); } if (libxl_set_vcpuaffinity(ctx, domid, i, &vcpu_cpumap)) { fprintf(stderr, "setting affinity failed on vcpu `%d'.\n", i); - libxl_cpumap_dispose(&vcpu_cpumap); + libxl_bitmap_dispose(&vcpu_cpumap); free(vcpu_to_pcpu); ret = ERROR_FAIL; goto error_out; } } - libxl_cpumap_dispose(&vcpu_cpumap); + libxl_bitmap_dispose(&vcpu_cpumap); free(vcpu_to_pcpu); vcpu_to_pcpu = NULL; } @@ -4063,7 +4063,7 @@ int main_vcpulist(int argc, char **argv) static void vcpupin(const char *d, const char *vcpu, char *cpu) { libxl_vcpuinfo *vcpuinfo; - libxl_cpumap cpumap; + libxl_bitmap cpumap; uint32_t vcpuid; char *endptr; @@ -4080,7 +4080,7 @@ static void vcpupin(const char *d, const char *vcpu, char *cpu) find_domain(d); - if (libxl_cpumap_alloc(ctx, &cpumap, 0)) { + if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) { goto vcpupin_out; } @@ -4107,7 +4107,7 @@ static void vcpupin(const char *d, const char *vcpu, char *cpu) libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu); } vcpupin_out1: - libxl_cpumap_dispose(&cpumap); + libxl_bitmap_dispose(&cpumap); vcpupin_out: ; } @@ -4127,7 +4127,7 @@ static void vcpuset(const char *d, const char* nr_vcpus) { char *endptr; unsigned int max_vcpus, i; - libxl_cpumap cpumap; + libxl_bitmap cpumap; max_vcpus = strtoul(nr_vcpus, &endptr, 10); if (nr_vcpus == endptr) { @@ -4137,17 +4137,17 @@ static void vcpuset(const char *d, const char* nr_vcpus) find_domain(d); - if (libxl_cpumap_alloc(ctx, &cpumap, 0)) { - fprintf(stderr, "libxl_cpumap_alloc failed\n"); + if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) { + fprintf(stderr, "libxl_cpu_bitmap_alloc failed\n"); return; } for (i = 0; i < max_vcpus; i++) - libxl_cpumap_set(&cpumap, i); + libxl_bitmap_set(&cpumap, i); if (libxl_set_vcpuonline(ctx, domid, &cpumap) < 0) fprintf(stderr, "libxl_set_vcpuonline failed domid=%d max_vcpus=%d\n", domid, max_vcpus); - libxl_cpumap_dispose(&cpumap); + libxl_bitmap_dispose(&cpumap); } int main_vcpuset(int argc, char **argv) @@ -4211,7 +4211,7 @@ static void output_physinfo(void) libxl_physinfo info; const libxl_version_info *vinfo; unsigned int i; - libxl_cpumap cpumap; + libxl_bitmap cpumap; int n = 0; if (libxl_get_physinfo(ctx, &info) != 0) { @@ -4243,8 +4243,8 @@ static void output_physinfo(void) printf("sharing_used_memory : %"PRIu64"\n", info.sharing_used_frames / i); } if (!libxl_get_freecpus(ctx, &cpumap)) { - libxl_for_each_cpu(i, cpumap) - if (libxl_cpumap_test(&cpumap, i)) + libxl_for_each_bit(i, cpumap) + if (libxl_bitmap_test(&cpumap, i)) n++; printf("free_cpus : %d\n", n); free(cpumap.map); @@ -5866,8 +5866,8 @@ int main_cpupoolcreate(int argc, char **argv) XLU_ConfigList *cpus; XLU_ConfigList *nodes; int n_cpus, n_nodes, i, n; - libxl_cpumap freemap; - libxl_cpumap cpumap; + libxl_bitmap freemap; + libxl_bitmap cpumap; libxl_uuid uuid; libxl_cputopology *topology; int rc = -ERROR_FAIL; @@ -5980,7 +5980,7 @@ int main_cpupoolcreate(int argc, char **argv) fprintf(stderr, "libxl_get_freecpus failed\n"); goto out_cfg; } - if (libxl_cpumap_alloc(ctx, &cpumap, 0)) { + if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) { fprintf(stderr, "Failed to allocate cpumap\n"); goto out_cfg; } @@ -5997,8 +5997,8 @@ int main_cpupoolcreate(int argc, char **argv) n = atoi(buf); for (i = 0; i < nr; i++) { if ((topology[i].node == n) && - libxl_cpumap_test(&freemap, i)) { - libxl_cpumap_set(&cpumap, i); + libxl_bitmap_test(&freemap, i)) { + libxl_bitmap_set(&cpumap, i); n_cpus++; } } @@ -6016,11 +6016,11 @@ int main_cpupoolcreate(int argc, char **argv) while ((buf = xlu_cfg_get_listitem(cpus, n_cpus)) != NULL) { i = atoi(buf); if ((i < 0) || (i >= freemap.size * 8) || - !libxl_cpumap_test(&freemap, i)) { + !libxl_bitmap_test(&freemap, i)) { fprintf(stderr, "cpu %d illegal or not free\n", i); goto out_cfg; } - libxl_cpumap_set(&cpumap, i); + libxl_bitmap_set(&cpumap, i); n_cpus++; } } else @@ -6118,8 +6118,8 @@ int main_cpupoollist(int argc, char **argv) printf("%-19s", name); free(name); n = 0; - libxl_for_each_cpu(c, poolinfo[p].cpumap) - if (libxl_cpumap_test(&poolinfo[p].cpumap, c)) { + libxl_for_each_bit(c, poolinfo[p].cpumap) + if (libxl_bitmap_test(&poolinfo[p].cpumap, c)) { if (n && opt_cpus) printf(","); if (opt_cpus) printf("%d", c); n++; @@ -6318,7 +6318,7 @@ int main_cpupoolnumasplit(int argc, char **argv) int n_cpus; char name[16]; libxl_uuid uuid; - libxl_cpumap cpumap; + libxl_bitmap cpumap; libxl_cpupoolinfo *poolinfo; libxl_cputopology *topology; libxl_dominfo info; @@ -6348,7 +6348,7 @@ int main_cpupoolnumasplit(int argc, char **argv) return -ERROR_FAIL; } - if (libxl_cpumap_alloc(ctx, &cpumap, 0)) { + if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) { fprintf(stderr, "Failed to allocate cpumap\n"); libxl_cputopology_list_free(topology, n_cpus); return -ERROR_FAIL; @@ -6374,7 +6374,7 @@ int main_cpupoolnumasplit(int argc, char **argv) for (c = 0; c < n_cpus; c++) { if (topology[c].node == node) { topology[c].node = LIBXL_CPUTOPOLOGY_INVALID_ENTRY; - libxl_cpumap_set(&cpumap, n); + libxl_bitmap_set(&cpumap, n); n++; } } @@ -6396,7 +6396,7 @@ int main_cpupoolnumasplit(int argc, char **argv) fprintf(stderr, "failed to offline vcpus\n"); goto out; } - libxl_cpumap_set_none(&cpumap); + libxl_bitmap_set_none(&cpumap); for (c = 0; c < n_cpus; c++) { if (topology[c].node == LIBXL_CPUTOPOLOGY_INVALID_ENTRY) { @@ -6434,7 +6434,7 @@ int main_cpupoolnumasplit(int argc, char **argv) out: libxl_cputopology_list_free(topology, n_cpus); - libxl_cpumap_dispose(&cpumap); + libxl_bitmap_dispose(&cpumap); return ret; } diff --git a/tools/python/xen/lowlevel/xl/xl.c b/tools/python/xen/lowlevel/xl/xl.c index 1db777dce3..b68b55ad87 100644 --- a/tools/python/xen/lowlevel/xl/xl.c +++ b/tools/python/xen/lowlevel/xl/xl.c @@ -231,14 +231,14 @@ int attrib__libxl_cpuid_policy_list_set(PyObject *v, libxl_cpuid_policy_list *pp return -1; } -int attrib__libxl_cpumap_set(PyObject *v, libxl_cpumap *pptr) +int attrib__libxl_bitmap_set(PyObject *v, libxl_bitmap *pptr) { int i; long cpu; for (i = 0; i < PyList_Size(v); i++) { cpu = PyInt_AsLong(PyList_GetItem(v, i)); - libxl_cpumap_set(pptr, cpu); + libxl_bitmap_set(pptr, cpu); } return 0; } @@ -293,14 +293,14 @@ PyObject *attrib__libxl_cpuid_policy_list_get(libxl_cpuid_policy_list *pptr) return NULL; } -PyObject *attrib__libxl_cpumap_get(libxl_cpumap *pptr) +PyObject *attrib__libxl_bitmap_get(libxl_bitmap *pptr) { PyObject *cpulist = NULL; int i; cpulist = PyList_New(0); - libxl_for_each_cpu(i, *pptr) { - if ( libxl_cpumap_test(pptr, i) ) { + libxl_for_each_bit(i, *pptr) { + if ( libxl_bitmap_test(pptr, i) ) { PyObject* pyint = PyInt_FromLong(i); PyList_Append(cpulist, pyint); |