|
[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 |