diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2012-01-31 16:34:39 +0000 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2012-01-31 16:34:39 +0000 |
commit | 8137e3ea1a0ea66181680b9bc4f1865c0edb81b5 (patch) | |
tree | 2eea6138d1c7551622242d160b76009a41624398 /tools | |
parent | e0dfff8c14c05594d1a0c2216f906653fcf225de (diff) | |
download | xen-8137e3ea1a0ea66181680b9bc4f1865c0edb81b5.tar.gz xen-8137e3ea1a0ea66181680b9bc4f1865c0edb81b5.tar.bz2 xen-8137e3ea1a0ea66181680b9bc4f1865c0edb81b5.zip |
libxl: expose cpu topology as a single list of cpu->{node,core,socket} maps.
Rather than the previous tripple list which is more complicated to work with
and harder for language bindings.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Committed-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libxl/gentest.py | 2 | ||||
-rw-r--r-- | tools/libxl/libxl.c | 100 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 4 | ||||
-rw-r--r-- | tools/libxl/libxl_types.idl | 8 | ||||
-rw-r--r-- | tools/libxl/libxl_utils.c | 8 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 61 | ||||
-rw-r--r-- | tools/ocaml/libs/xl/genwrap.py | 3 | ||||
-rw-r--r-- | tools/ocaml/libs/xl/xenlight.ml.in | 11 | ||||
-rw-r--r-- | tools/ocaml/libs/xl/xenlight.mli.in | 10 | ||||
-rw-r--r-- | tools/ocaml/libs/xl/xenlight_stubs.c | 49 |
10 files changed, 128 insertions, 128 deletions
diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py index 06d35369cf..be05bfb49d 100644 --- a/tools/libxl/gentest.py +++ b/tools/libxl/gentest.py @@ -195,6 +195,7 @@ static void libxl_string_list_rand_init(libxl_string_list *p) *p = l; } +#if 0 /* To be remove in a subsequent patch */ static void libxl_cpuarray_rand_init(libxl_cpuarray *p) { int i; @@ -209,6 +210,7 @@ static void libxl_cpuarray_rand_init(libxl_cpuarray *p) p->array[i] = r; } } +#endif """) for ty in builtins + types: if ty.typename not in handcoded: diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index a5d87c7cc3..6fcd319b58 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2755,57 +2755,68 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo) return 0; } -int libxl_get_topologyinfo(libxl_ctx *ctx, libxl_topologyinfo *info) +libxl_cputopology *libxl_get_cpu_topology(libxl_ctx *ctx, int *nr) { xc_topologyinfo_t tinfo; DECLARE_HYPERCALL_BUFFER(xc_cpu_to_core_t, coremap); DECLARE_HYPERCALL_BUFFER(xc_cpu_to_socket_t, socketmap); DECLARE_HYPERCALL_BUFFER(xc_cpu_to_node_t, nodemap); + libxl_cputopology *ret = NULL; int i; - int rc = 0; + int max_cpus; - rc += libxl_cpuarray_alloc(ctx, &info->coremap); - rc += libxl_cpuarray_alloc(ctx, &info->socketmap); - rc += libxl_cpuarray_alloc(ctx, &info->nodemap); - if (rc) - goto fail; + max_cpus = libxl_get_max_cpus(ctx); + if (max_cpus == 0) + { + LIBXL__LOG(ctx, XTL_ERROR, "Unable to determine number of CPUS"); + return NULL; + } - coremap = xc_hypercall_buffer_alloc(ctx->xch, coremap, sizeof(*coremap) * info->coremap.entries); - socketmap = xc_hypercall_buffer_alloc(ctx->xch, socketmap, sizeof(*socketmap) * info->socketmap.entries); - nodemap = xc_hypercall_buffer_alloc(ctx->xch, nodemap, sizeof(*nodemap) * info->nodemap.entries); - if ((coremap == NULL) || (socketmap == NULL) || (nodemap == NULL)) + coremap = xc_hypercall_buffer_alloc + (ctx->xch, coremap, sizeof(*coremap) * max_cpus); + socketmap = xc_hypercall_buffer_alloc + (ctx->xch, socketmap, sizeof(*socketmap) * max_cpus); + nodemap = xc_hypercall_buffer_alloc + (ctx->xch, nodemap, sizeof(*nodemap) * max_cpus); + if ((coremap == NULL) || (socketmap == NULL) || (nodemap == NULL)) { + LIBXL__LOG_ERRNOVAL(ctx, XTL_ERROR, ENOMEM, + "Unable to allocate hypercall arguments"); goto fail; + } set_xen_guest_handle(tinfo.cpu_to_core, coremap); set_xen_guest_handle(tinfo.cpu_to_socket, socketmap); set_xen_guest_handle(tinfo.cpu_to_node, nodemap); - tinfo.max_cpu_index = info->coremap.entries - 1; - if (xc_topologyinfo(ctx->xch, &tinfo) != 0) + tinfo.max_cpu_index = max_cpus - 1; + if (xc_topologyinfo(ctx->xch, &tinfo) != 0) { + LIBXL__LOG_ERRNO(ctx, XTL_ERROR, "Topology info hypercall failed"); goto fail; + } - for (i = 0; i <= tinfo.max_cpu_index; i++) { - if (i < info->coremap.entries) - info->coremap.array[i] = (coremap[i] == INVALID_TOPOLOGY_ID) ? - LIBXL_CPUARRAY_INVALID_ENTRY : coremap[i]; - if (i < info->socketmap.entries) - info->socketmap.array[i] = (socketmap[i] == INVALID_TOPOLOGY_ID) ? - LIBXL_CPUARRAY_INVALID_ENTRY : socketmap[i]; - if (i < info->nodemap.entries) - info->nodemap.array[i] = (nodemap[i] == INVALID_TOPOLOGY_ID) ? - LIBXL_CPUARRAY_INVALID_ENTRY : nodemap[i]; + ret = malloc(sizeof(libxl_cputopology) * max_cpus); + if (ret == NULL) { + LIBXL__LOG_ERRNOVAL(ctx, XTL_ERROR, ENOMEM, + "Unable to allocate return value"); + goto fail; } - xc_hypercall_buffer_free(ctx->xch, coremap); - xc_hypercall_buffer_free(ctx->xch, socketmap); - xc_hypercall_buffer_free(ctx->xch, nodemap); - return 0; + for (i = 0; i <= max_cpus; i++) { +#define V(map, i) (map[i] == INVALID_TOPOLOGY_ID) ? \ + LIBXL_CPUTOPOLOGY_INVALID_ENTRY : map[i] + ret[i].core = V(coremap, i); + ret[i].socket = V(socketmap, i); + ret[i].node = V(nodemap, i); +#undef V + } fail: xc_hypercall_buffer_free(ctx->xch, coremap); xc_hypercall_buffer_free(ctx->xch, socketmap); xc_hypercall_buffer_free(ctx->xch, nodemap); - libxl_topologyinfo_dispose(info); - return ERROR_FAIL; + + if (ret) + *nr = max_cpus; + return ret; } const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx) @@ -3604,30 +3615,30 @@ int libxl_cpupool_cpuadd(libxl_ctx *ctx, uint32_t poolid, int cpu) int libxl_cpupool_cpuadd_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cpus) { int rc = 0; - int cpu; + int cpu, nr; libxl_cpumap freemap; - libxl_topologyinfo topology; + libxl_cputopology *topology; if (libxl_get_freecpus(ctx, &freemap)) { return ERROR_FAIL; } - if (libxl_get_topologyinfo(ctx, &topology)) { + topology = libxl_get_cpu_topology(ctx, &nr); + if (!topology) { rc = ERROR_FAIL; goto out; } *cpus = 0; - for (cpu = 0; cpu < topology.nodemap.entries; cpu++) { - if (libxl_cpumap_test(&freemap, cpu) && - (topology.nodemap.array[cpu] == node) && + for (cpu = 0; cpu < nr; cpu++) { + if (libxl_cpumap_test(&freemap, cpu) && (topology[cpu].node == node) && !libxl_cpupool_cpuadd(ctx, poolid, cpu)) { (*cpus)++; } + libxl_cputopology_dispose(&topology[cpu]); } - libxl_topologyinfo_dispose(&topology); - + free(topology); out: libxl_cpumap_dispose(&freemap); return rc; @@ -3651,8 +3662,8 @@ int libxl_cpupool_cpuremove_node(libxl_ctx *ctx, uint32_t poolid, int node, int int ret = 0; int n_pools; int p; - int cpu; - libxl_topologyinfo topology; + int cpu, nr_cpus; + libxl_cputopology *topology; libxl_cpupoolinfo *poolinfo; poolinfo = libxl_list_cpupool(ctx, &n_pools); @@ -3660,7 +3671,8 @@ int libxl_cpupool_cpuremove_node(libxl_ctx *ctx, uint32_t poolid, int node, int return ERROR_NOMEM; } - if (libxl_get_topologyinfo(ctx, &topology)) { + topology = libxl_get_cpu_topology(ctx, &nr_cpus); + if (!topology) { ret = ERROR_FAIL; goto out; } @@ -3668,8 +3680,8 @@ int libxl_cpupool_cpuremove_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cpus = 0; for (p = 0; p < n_pools; p++) { if (poolinfo[p].poolid == poolid) { - for (cpu = 0; cpu < topology.nodemap.entries; cpu++) { - if ((topology.nodemap.array[cpu] == node) && + for (cpu = 0; cpu < nr_cpus; cpu++) { + if ((topology[cpu].node == node) && libxl_cpumap_test(&poolinfo[p].cpumap, cpu) && !libxl_cpupool_cpuremove(ctx, poolid, cpu)) { (*cpus)++; @@ -3678,7 +3690,9 @@ int libxl_cpupool_cpuremove_node(libxl_ctx *ctx, uint32_t poolid, int node, int } } - libxl_topologyinfo_dispose(&topology); + for (cpu = 0; cpu < nr_cpus; cpu++) + libxl_cputopology_dispose(&topology[cpu]); + free(topology); out: for (p = 0; p < n_pools; p++) { diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index ea5997be04..fd1a8048b3 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -576,7 +576,9 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid, */ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo); -int libxl_get_topologyinfo(libxl_ctx *ctx, libxl_topologyinfo *info); +#define LIBXL_CPUTOPOLOGY_INVALID_ENTRY (~(uint32_t)0) +libxl_cputopology *libxl_get_cpu_topology(libxl_ctx *ctx, int *nr); +void libxl_cputopology_list_free(libxl_cputopology *, int nr); libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid, int *nb_vcpu, int *nrcpus); int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 617dad6374..0cd6678a0b 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -376,10 +376,10 @@ libxl_physinfo = Struct("physinfo", [ ("phys_cap", uint32), ], dispose_fn=None, dir=DIR_OUT) -libxl_topologyinfo = Struct("topologyinfo", [ - ("coremap", libxl_cpuarray), # cpu to core map - ("socketmap", libxl_cpuarray), # cpu to socket map - ("nodemap", libxl_cpuarray), # cpu to node map +libxl_cputopology = Struct("cputopology", [ + ("core", uint32), + ("socket", uint32), + ("node", uint32), ]) libxl_sched_credit = Struct("sched_credit", [ diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index dbe8891ee9..c92151abc1 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -557,6 +557,14 @@ int libxl__enum_from_string(const libxl_enum_string_table *t, return ERROR_FAIL; } +void libxl_cputopology_list_free(libxl_cputopology *list, int nr) +{ + int i; + for (i = 0; i < nr; i++) + libxl_cputopology_dispose(&list[i]); + free(list); +} + /* * Local variables: * mode: C diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index faa69f2da1..7ea31635a1 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3833,10 +3833,11 @@ static void output_physinfo(void) static void output_topologyinfo(void) { - libxl_topologyinfo info; - int i; + libxl_cputopology *info; + int i, nr; - if (libxl_get_topologyinfo(ctx, &info)) { + info = libxl_get_cpu_topology(ctx, &nr); + if (info == NULL) { fprintf(stderr, "libxl_get_topologyinfo failed.\n"); return; } @@ -3844,15 +3845,15 @@ static void output_topologyinfo(void) printf("cpu_topology :\n"); printf("cpu: core socket node\n"); - for (i = 0; i < info.coremap.entries; i++) { - if (info.coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) - printf("%3d: %4d %4d %4d\n", i, info.coremap.array[i], - info.socketmap.array[i], info.nodemap.array[i]); + for (i = 0; i < nr; i++) { + if (info[i].core != LIBXL_CPUTOPOLOGY_INVALID_ENTRY) + printf("%3d: %4d %4d %4d\n", i, + info[i].core, info[i].socket, info[i].node); } - printf("numa_info : none\n"); + libxl_cputopology_list_free(info, nr); - libxl_topologyinfo_dispose(&info); + printf("numa_info : none\n"); return; } @@ -5350,7 +5351,7 @@ int main_cpupoolcreate(int argc, char **argv) libxl_cpumap freemap; libxl_cpumap cpumap; libxl_uuid uuid; - libxl_topologyinfo topology; + libxl_cputopology *topology; while (1) { opt = getopt_long(argc, argv, "hnf:", long_options, &option_index); @@ -5459,16 +5460,18 @@ int main_cpupoolcreate(int argc, char **argv) return -ERROR_FAIL; } if (!xlu_cfg_get_list(config, "nodes", &nodes, 0, 0)) { + int nr; n_cpus = 0; n_nodes = 0; - if (libxl_get_topologyinfo(ctx, &topology)) { + topology = libxl_get_cpu_topology(ctx, &nr); + if (topology == NULL) { fprintf(stderr, "libxl_get_topologyinfo failed\n"); return -ERROR_FAIL; } while ((buf = xlu_cfg_get_listitem(nodes, n_nodes)) != NULL) { n = atoi(buf); - for (i = 0; i < topology.nodemap.entries; i++) { - if ((topology.nodemap.array[i] == n) && + for (i = 0; i < nr; i++) { + if ((topology[i].node == n) && libxl_cpumap_test(&freemap, i)) { libxl_cpumap_set(&cpumap, i); n_cpus++; @@ -5477,7 +5480,7 @@ int main_cpupoolcreate(int argc, char **argv) n_nodes++; } - libxl_topologyinfo_dispose(&topology); + libxl_cputopology_list_free(topology, nr); if (n_cpus == 0) { fprintf(stderr, "no free cpu found\n"); @@ -5799,11 +5802,12 @@ int main_cpupoolnumasplit(int argc, char **argv) int schedid; int n_pools; int node; + int n_cpus; char name[16]; libxl_uuid uuid; libxl_cpumap cpumap; libxl_cpupoolinfo *poolinfo; - libxl_topologyinfo topology; + libxl_cputopology *topology; libxl_dominfo info; if ((opt = def_getopt(argc, argv, "", "cpupool-numa-split", 0)) != -1) @@ -5825,21 +5829,22 @@ int main_cpupoolnumasplit(int argc, char **argv) return -ERROR_FAIL; } - if (libxl_get_topologyinfo(ctx, &topology)) { + topology = libxl_get_cpu_topology(ctx, &n_cpus); + if (topology == NULL) { fprintf(stderr, "libxl_get_topologyinfo failed\n"); return -ERROR_FAIL; } if (libxl_cpumap_alloc(ctx, &cpumap)) { fprintf(stderr, "Failed to allocate cpumap\n"); - libxl_topologyinfo_dispose(&topology); + libxl_cputopology_list_free(topology, n_cpus); return -ERROR_FAIL; } /* Reset Pool-0 to 1st node: first add cpus, then remove cpus to avoid a cpupool without cpus in between */ - node = topology.nodemap.array[0]; + node = topology[0].node; if (libxl_cpupool_cpuadd_node(ctx, 0, node, &n)) { fprintf(stderr, "error on adding cpu to Pool 0\n"); return -ERROR_FAIL; @@ -5853,9 +5858,9 @@ int main_cpupoolnumasplit(int argc, char **argv) } n = 0; - for (c = 0; c < topology.nodemap.entries; c++) { - if (topology.nodemap.array[c] == node) { - topology.nodemap.array[c] = LIBXL_CPUARRAY_INVALID_ENTRY; + for (c = 0; c < n_cpus; c++) { + if (topology[c].node == node) { + topology[c].node = LIBXL_CPUTOPOLOGY_INVALID_ENTRY; libxl_cpumap_set(&cpumap, n); n++; } @@ -5880,12 +5885,12 @@ int main_cpupoolnumasplit(int argc, char **argv) } memset(cpumap.map, 0, cpumap.size); - for (c = 0; c < topology.nodemap.entries; c++) { - if (topology.nodemap.array[c] == LIBXL_CPUARRAY_INVALID_ENTRY) { + for (c = 0; c < n_cpus; c++) { + if (topology[c].node == LIBXL_CPUTOPOLOGY_INVALID_ENTRY) { continue; } - node = topology.nodemap.array[c]; + node = topology[c].node; ret = -libxl_cpupool_cpuremove_node(ctx, 0, node, &n); if (ret) { fprintf(stderr, "error on removing cpu from Pool 0\n"); @@ -5907,15 +5912,15 @@ int main_cpupoolnumasplit(int argc, char **argv) goto out; } - for (p = c; p < topology.nodemap.entries; p++) { - if (topology.nodemap.array[p] == node) { - topology.nodemap.array[p] = LIBXL_CPUARRAY_INVALID_ENTRY; + for (p = c; p < n_cpus; p++) { + if (topology[p].node == node) { + topology[p].node = LIBXL_CPUTOPOLOGY_INVALID_ENTRY; } } } out: - libxl_topologyinfo_dispose(&topology); + libxl_cputopology_list_free(topology, n_cpus); libxl_cpumap_dispose(&cpumap); return ret; diff --git a/tools/ocaml/libs/xl/genwrap.py b/tools/ocaml/libs/xl/genwrap.py index f83581848b..22cca80bcb 100644 --- a/tools/ocaml/libs/xl/genwrap.py +++ b/tools/ocaml/libs/xl/genwrap.py @@ -29,6 +29,8 @@ functions = { # ( name , [type1,type2,....] ) "device_pci": DEVICE_FUNCTIONS, "physinfo": [ ("get", ["unit", "t"]), ], + "cputopology": [ ("get", ["unit", "t array"]), + ], "sched_credit": [ ("domain_get", ["domid", "t"]), ("domain_set", ["domid", "t", "unit"]), ], @@ -266,7 +268,6 @@ if __name__ == '__main__': "domain_create_info", "domain_build_info", "vcpuinfo", - "topologyinfo", "event", ] diff --git a/tools/ocaml/libs/xl/xenlight.ml.in b/tools/ocaml/libs/xl/xenlight.ml.in index 162b4a96bb..c47623c3fc 100644 --- a/tools/ocaml/libs/xl/xenlight.ml.in +++ b/tools/ocaml/libs/xl/xenlight.ml.in @@ -19,17 +19,6 @@ type domid = int (* @@LIBXL_TYPES@@ *) -module Topologyinfo = struct - type t = - { - core : int; - socket : int; - node : int; - } - external get : unit -> t array = "stub_xl_topologyinfo" -end - - external send_trigger : domid -> trigger -> int -> unit = "stub_xl_send_trigger" external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys" diff --git a/tools/ocaml/libs/xl/xenlight.mli.in b/tools/ocaml/libs/xl/xenlight.mli.in index ea919a7a00..4717bac3f7 100644 --- a/tools/ocaml/libs/xl/xenlight.mli.in +++ b/tools/ocaml/libs/xl/xenlight.mli.in @@ -19,16 +19,6 @@ type domid = int (* @@LIBXL_TYPES@@ *) -module Topologyinfo : sig - type t = - { - core : int; - socket : int; - node : int; - } - external get : unit -> t array = "stub_xl_topologyinfo" -end - external send_trigger : domid -> trigger -> int -> unit = "stub_xl_send_trigger" external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys" diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c index d3e4751a36..38977b5122 100644 --- a/tools/ocaml/libs/xl/xenlight_stubs.c +++ b/tools/ocaml/libs/xl/xenlight_stubs.c @@ -210,28 +210,6 @@ static value Val_hwcap(libxl_hwcap *c_val) #include "_libxl_types.inc" -static value Val_topologyinfo(libxl_topologyinfo *c_val) -{ - CAMLparam0(); - CAMLlocal3(v, topology, topologyinfo); - int i; - - topologyinfo = caml_alloc_tuple(c_val->coremap.entries); - for (i = 0; i < c_val->coremap.entries; i++) { - v = Val_none; - if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) { - topology = caml_alloc_tuple(3); - Store_field(topology, 0, Val_int(c_val->coremap.array[i])); - Store_field(topology, 1, Val_int(c_val->socketmap.array[i])); - Store_field(topology, 2, Val_int(c_val->nodemap.array[i])); - v = Val_some(topology); - } - Store_field(topologyinfo, i, v); - } - - CAMLreturn(topologyinfo); -} - value stub_xl_device_disk_add(value info, value domid) { CAMLparam2(info, domid); @@ -462,22 +440,33 @@ value stub_xl_physinfo_get(value unit) CAMLreturn(physinfo); } -value stub_xl_topologyinfo(value unit) +value stub_xl_cputopology_get(value unit) { CAMLparam1(unit); - CAMLlocal1(topologyinfo); - libxl_topologyinfo c_topologyinfo; - int ret; + CAMLlocal2(topology, v); + libxl_cputopology *c_topology; + int i, nr, ret; INIT_STRUCT(); INIT_CTX(); - ret = libxl_get_topologyinfo(ctx, &c_topologyinfo); + + c_topology = libxl_get_cpu_topology(ctx, &nr); if (ret != 0) failwith_xl("topologyinfo", &lg); - FREE_CTX(); - topologyinfo = Val_topologyinfo(&c_topologyinfo); - CAMLreturn(topologyinfo); + topology = caml_alloc_tuple(nr); + for (i = 0; i < nr; i++) { + if (c_topology[i].core != LIBXL_CPUTOPOLOGY_INVALID_ENTRY) + v = Val_some(Val_cputopology(&gc, &lg, &c_topology[i])); + else + v = Val_none; + Store_field(topology, i, v); + } + + libxl_cputopology_list_free(c_topology, nr); + + FREE_CTX(); + CAMLreturn(topology); } value stub_xl_sched_credit_domain_get(value domid) |