[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1 of 5 V2] libxl: add internal function to get a domain's scheduler
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1338299619 -3600 # Node ID 980a25d6ad12ba0f10fa616255b9382cc14ce69e # Parent 12537c670e9ea9e7f73747e203ca318107b82cd9 libxl: add internal function to get a domain's scheduler. This takes into account cpupools. Add a helper to get the info for a single cpu pool, refactor libxl_list_cpupool t use this. While there fix the leaks due to not disposing the partial list on realloc failure in that function. Fix the failure of sched_domain_output to free the poolinfo list. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- v2: add libxl_cpupoolinfo_list_free, use it in libxl_cpupool_list error path. Also use it in libxl_cpupool_cpuremove_node (which fixes a leak) and in libxl_name_to_cpupoolid, sched_domain_output and main_cpupoollist (which also fixes a leak). Also in libxl_cpupool_cpuremove_node use libxl_cputopology_list_free instead of open coding diff -r 12537c670e9e -r 980a25d6ad12 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue May 29 12:56:57 2012 +0100 +++ b/tools/libxl/libxl.c Tue May 29 14:53:39 2012 +0100 @@ -552,41 +552,70 @@ int libxl_domain_info(libxl_ctx *ctx, li return 0; } +static int cpupool_info(libxl__gc *gc, + libxl_cpupoolinfo *info, + uint32_t poolid, + bool exact /* exactly poolid or >= poolid */) +{ + xc_cpupoolinfo_t *xcinfo; + int rc = ERROR_FAIL; + + xcinfo = xc_cpupool_getinfo(CTX->xch, poolid); + if (xcinfo == NULL) + return ERROR_FAIL; + + if (exact && xcinfo->cpupool_id != poolid) + goto out; + + info->poolid = xcinfo->cpupool_id; + info->sched = xcinfo->sched_id; + info->n_dom = xcinfo->n_dom; + if (libxl_cpumap_alloc(CTX, &info->cpumap)) + goto out; + memcpy(info->cpumap.map, xcinfo->cpumap, info->cpumap.size); + + rc = 0; +out: + xc_cpupool_infofree(CTX->xch, xcinfo); + return rc; +} + +int libxl_cpupool_info(libxl_ctx *ctx, + libxl_cpupoolinfo *info, uint32_t poolid) +{ + GC_INIT(ctx); + int rc = cpupool_info(gc, info, poolid, true); + GC_FREE; + return rc; +} + libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx *ctx, int *nb_pool) { - libxl_cpupoolinfo *ptr, *tmp; + GC_INIT(ctx); + libxl_cpupoolinfo info, *ptr, *tmp; int i; - xc_cpupoolinfo_t *info; uint32_t poolid; ptr = NULL; poolid = 0; for (i = 0;; i++) { - info = xc_cpupool_getinfo(ctx->xch, poolid); - if (info == NULL) + if (cpupool_info(gc, &info, poolid, false)) break; tmp = realloc(ptr, (i + 1) * sizeof(libxl_cpupoolinfo)); if (!tmp) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpupool info"); - free(ptr); - xc_cpupool_infofree(ctx->xch, info); - return NULL; + libxl_cpupoolinfo_list_free(ptr, i); + goto out; } ptr = tmp; - ptr[i].poolid = info->cpupool_id; - ptr[i].sched = info->sched_id; - ptr[i].n_dom = info->n_dom; - if (libxl_cpumap_alloc(ctx, &ptr[i].cpumap)) { - xc_cpupool_infofree(ctx->xch, info); - break; - } - memcpy(ptr[i].cpumap.map, info->cpumap, ptr[i].cpumap.size); - poolid = info->cpupool_id + 1; - xc_cpupool_infofree(ctx->xch, info); + ptr[i] = info; + poolid = info.poolid + 1; } *nb_pool = i; +out: + GC_FREE; return ptr; } @@ -3932,14 +3961,10 @@ int libxl_cpupool_cpuremove_node(libxl_c } } - for (cpu = 0; cpu < nr_cpus; cpu++) - libxl_cputopology_dispose(&topology[cpu]); - free(topology); + libxl_cputopology_list_free(topology, nr_cpus); out: - for (p = 0; p < n_pools; p++) { - libxl_cpupoolinfo_dispose(poolinfo + p); - } + libxl_cpupoolinfo_list_free(poolinfo, n_pools); return ret; } diff -r 12537c670e9e -r 980a25d6ad12 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue May 29 12:56:57 2012 +0100 +++ b/tools/libxl/libxl.h Tue May 29 14:53:39 2012 +0100 @@ -576,6 +576,7 @@ int libxl_domain_info(libxl_ctx*, libxl_ libxl_dominfo * libxl_list_domain(libxl_ctx*, int *nb_domain); void libxl_dominfo_list_free(libxl_dominfo *list, int nr); libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool); +void libxl_cpupoolinfo_list_free(libxl_cpupoolinfo *list, int nr); libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm); void libxl_vminfo_list_free(libxl_vminfo *list, int nr); @@ -829,6 +830,7 @@ int libxl_cpupool_cpuadd_node(libxl_ctx int libxl_cpupool_cpuremove(libxl_ctx *ctx, uint32_t poolid, int cpu); int libxl_cpupool_cpuremove_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cpus); int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid); +int libxl_cpupool_info(libxl_ctx *ctx, libxl_cpupoolinfo *info, uint32_t poolid); int libxl_domid_valid_guest(uint32_t domid); diff -r 12537c670e9e -r 980a25d6ad12 tools/libxl/libxl_dom.c --- a/tools/libxl/libxl_dom.c Tue May 29 12:56:57 2012 +0100 +++ b/tools/libxl/libxl_dom.c Tue May 29 14:53:39 2012 +0100 @@ -93,6 +93,41 @@ int libxl__domain_shutdown_reason(libxl_ return (info.flags >> XEN_DOMINF_shutdownshift) & XEN_DOMINF_shutdownmask; } +int libxl__domain_cpupool(libxl__gc *gc, uint32_t domid) +{ + xc_domaininfo_t info; + int ret; + + ret = xc_domain_getinfolist(CTX->xch, domid, 1, &info); + if (ret != 1) + return ERROR_FAIL; + if (info.domain != domid) + return ERROR_FAIL; + + return info.cpupool; +} + +libxl_scheduler libxl__domain_scheduler(libxl__gc *gc, uint32_t domid) +{ + uint32_t cpupool = libxl__domain_cpupool(gc, domid); + libxl_cpupoolinfo poolinfo; + libxl_scheduler sched = LIBXL_SCHEDULER_UNKNOWN; + int rc; + + if (cpupool < 0) + return sched; + + rc = libxl_cpupool_info(CTX, &poolinfo, cpupool); + if (rc < 0) + goto out; + + sched = poolinfo.sched; + +out: + libxl_cpupoolinfo_dispose(&poolinfo); + return sched; +} + int libxl__build_pre(libxl__gc *gc, uint32_t domid, libxl_domain_build_info *info, libxl__domain_build_state *state) { diff -r 12537c670e9e -r 980a25d6ad12 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue May 29 12:56:57 2012 +0100 +++ b/tools/libxl/libxl_internal.h Tue May 29 14:53:39 2012 +0100 @@ -738,6 +738,8 @@ _hidden int libxl__file_reference_unmap( /* from xl_dom */ _hidden libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid); _hidden int libxl__domain_shutdown_reason(libxl__gc *gc, uint32_t domid); +_hidden int libxl__domain_cpupool(libxl__gc *gc, uint32_t domid); +_hidden libxl_scheduler libxl__domain_scheduler(libxl__gc *gc, uint32_t domid); _hidden int libxl__sched_set_params(libxl__gc *gc, uint32_t domid, libxl_sched_params *scparams); #define LIBXL__DOMAIN_IS_TYPE(gc, domid, type) \ libxl__domain_type((gc), (domid)) == LIBXL_DOMAIN_TYPE_##type diff -r 12537c670e9e -r 980a25d6ad12 tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Tue May 29 12:56:57 2012 +0100 +++ b/tools/libxl/libxl_types.idl Tue May 29 14:53:39 2012 +0100 @@ -107,7 +107,9 @@ libxl_bios_type = Enumeration("bios_type ]) # Consistent with values defined in domctl.h +# Except unknown which we have made up libxl_scheduler = Enumeration("scheduler", [ + (0, "unknown"), (4, "sedf"), (5, "credit"), (6, "credit2"), diff -r 12537c670e9e -r 980a25d6ad12 tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Tue May 29 12:56:57 2012 +0100 +++ b/tools/libxl/libxl_utils.c Tue May 29 14:53:39 2012 +0100 @@ -133,9 +133,8 @@ int libxl_name_to_cpupoolid(libxl_ctx *c } free(poolname); } - libxl_cpupoolinfo_dispose(poolinfo + i); } - free(poolinfo); + libxl_cpupoolinfo_list_free(poolinfo, nb_pools); return ret; } @@ -686,6 +685,14 @@ void libxl_vminfo_list_free(libxl_vminfo free(list); } +void libxl_cpupoolinfo_list_free(libxl_cpupoolinfo *list, int nr) +{ + int i; + for (i = 0; i < nr; i++) + libxl_cpupoolinfo_dispose(&list[i]); + free(list); +} + int libxl_domid_valid_guest(uint32_t domid) { /* returns 1 if the value _could_ be a valid guest domid, 0 otherwise diff -r 12537c670e9e -r 980a25d6ad12 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue May 29 12:56:57 2012 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue May 29 14:53:39 2012 +0100 @@ -4608,11 +4608,8 @@ static int sched_domain_output(libxl_sch break; } } - if (poolinfo) { - for (p = 0; p < n_pools; p++) { - libxl_cpupoolinfo_dispose(poolinfo + p); - } - } + if (poolinfo) + libxl_cpupoolinfo_list_free(poolinfo, n_pools); return 0; } @@ -6119,8 +6116,9 @@ int main_cpupoollist(int argc, char **ar printf("\n"); } } - libxl_cpupoolinfo_dispose(poolinfo + p); - } + } + + libxl_cpupoolinfo_list_free(poolinfo, n_pools); return ret; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |