Ian Campbell
2011-Oct-18 12:54 UTC
[Xen-devel] [PATCH 00 of 27 v3] libxl: rationalise libxl_device_* APIs
The following series overhauls the libxl_device_* APIs in an attempt to make them more consistent across the types of devices and move towards something we can support as a stable API longterm. This is broadly speaking the changes I discussed in [0] One of the early patches adds a big comment describing the API. It would be useful if this got a particularly close eye with a view to supporting it long term -- especially from actual and potential consumers of the API (of who I''ve CC a few who sprang to mind). Along the way I filed some rough edges of the internal implementation of this stuff but my primary concern is to make the public facing API one that we can commit to keeping stable. One aspect which is missing is the ability to do asynchronous add/remove etc. This requires the overhaul of the libxl event system which Ian Jackson described at [1]. I did bear this in mind so hopefully I have provided the majority of the necessary moving parts internally. Changes since last time: - Correct handling of result of libxl__device_remove wait vs. not-wait. We need to indicate to the caller if they need to wait or not. - Decide it''s definitely correct to not trust the frontend dir. Changes since the time before that: - Rename type "destructor" functions to "dispose" freeing up the verb "destroy" to mean, uh, destroying things, such as a forcible remove of a device or destroying a domain. - Use this new found freedom to s/force_remove/destroy/. - Added a flags parameter to libxl_ctx_alloc. Might as well have one for future flexibility - Updated language bindings to use new scheme. [0] http://www.gossamer-threads.com/lists/xen/devel/204668 [1] http://www.gossamer-threads.com/lists/xen/devel/212580 & http://www.gossamer-threads.com/lists/xen/devel/212578 & http://www.gossamer-threads.com/lists/xen/devel/212579 & http://www.gossamer-threads.com/lists/xen/devel/212581 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:54 UTC
[Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break; " to do_pci_remove
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318930552 -3600 # Node ID e03520648d2c91210d59a90f497b356fd72eb36f # Parent 955a6c07dc5e9c55316d1678b2b7cc4313f4fd57 libxl: add missing "break;" to do_pci_remove Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the "default: abort()". (I''m sure we fixed this once already...) Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 955a6c07dc5e -r e03520648d2c tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Tue Oct 18 10:33:32 2011 +0100 +++ b/tools/libxl/libxl_pci.c Tue Oct 18 10:35:52 2011 +0100 @@ -930,6 +930,7 @@ skip1: } } fclose(f); + break; } default: abort(); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:54 UTC
[Xen-devel] [PATCH 02 of 27 v3] libxl: remove generated file testidl.c on clean
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318930555 -3600 # Node ID 450a1d48932c74e8ca24239ebe88c3f71f1b64e5 # Parent e03520648d2c91210d59a90f497b356fd72eb36f libxl: remove generated file testidl.c on clean Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r e03520648d2c -r 450a1d48932c tools/libxl/Makefile --- a/tools/libxl/Makefile Tue Oct 18 10:35:52 2011 +0100 +++ b/tools/libxl/Makefile Tue Oct 18 10:35:55 2011 +0100 @@ -150,6 +150,7 @@ install: all clean: $(RM) -f _*.h *.o *.so* *.a $(CLIENTS) $(DEPS) $(RM) -f _*.c *.pyc _libxl_paths.*.tmp + $(RM) -f testidl.c.new testidl.c # $(RM) -f $(AUTOSRCS) $(AUTOINCS) distclean: clean _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:54 UTC
[Xen-devel] [PATCH 03 of 27 v3] libxl: idl: use "dispose" rather than "destroy" for function to free IDL types
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318930555 -3600 # Node ID d71e77d3fbf19c4c986c519f4805dee113f5f622 # Parent 450a1d48932c74e8ca24239ebe88c3f71f1b64e5 libxl: idl: use "dispose" rather than "destroy" for function to free IDL types Destroy is an overloaded term which would commonly like to be used for actual destructive operations, such as destroying a domain etc. Dispose isn''t a great term but it does the job. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/gentest.py --- a/tools/libxl/gentest.py Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/gentest.py Tue Oct 18 10:35:55 2011 +0100 @@ -256,8 +256,8 @@ int main(int argc, char **argv) f.write(" printf(\"%%s: %%s\\n\", \"%s\", s);\n" % ty.typename) f.write(" if (s == NULL) abort();\n") f.write(" free(s);\n") - if ty.destructor_fn is not None: - f.write(" %s(&%s_val);\n" % (ty.destructor_fn, ty.typename)) + if ty.dispose_fn is not None: + f.write(" %s(&%s_val);\n" % (ty.dispose_fn, ty.typename)) f.write("\n") f.write(" printf(\"Testing Enumerations\\n\");\n") diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/gentypes.py --- a/tools/libxl/gentypes.py Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/gentypes.py Tue Oct 18 10:35:55 2011 +0100 @@ -74,7 +74,7 @@ def libxl_C_type_define(ty, indent = "") raise NotImplementedError("%s" % type(ty)) return s.replace("\n", "\n%s" % indent) -def libxl_C_type_destroy(ty, v, indent = " ", parent = None): +def libxl_C_type_dispose(ty, v, indent = " ", parent = None): s = "" if isinstance(ty, libxltypes.KeyedUnion): if parent is None: @@ -83,16 +83,16 @@ def libxl_C_type_destroy(ty, v, indent for f in ty.fields: (nparent,fexpr) = ty.member(v, f, parent is None) s += "case %s:\n" % f.enumname - s += libxl_C_type_destroy(f.type, fexpr, indent + " ", nparent) + s += libxl_C_type_dispose(f.type, fexpr, indent + " ", nparent) s += " break;\n" s += "}\n" - elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.destructor_fn is None): + elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.dispose_fn is None): for f in [f for f in ty.fields if not f.const]: (nparent,fexpr) = ty.member(v, f, parent is None) - s += libxl_C_type_destroy(f.type, fexpr, "", nparent) + s += libxl_C_type_dispose(f.type, fexpr, "", nparent) else: - if ty.destructor_fn is not None: - s += "%s(%s);\n" % (ty.destructor_fn, ty.pass_arg(v, parent is None)) + if ty.dispose_fn is not None: + s += "%s(%s);\n" % (ty.dispose_fn, ty.pass_arg(v, parent is None)) if s != "": s = indent + s @@ -217,8 +217,8 @@ if __name__ == ''__main__'': for ty in types: f.write(libxl_C_type_define(ty) + ";\n") - if ty.destructor_fn is not None: - f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p"))) + if ty.dispose_fn is not None: + f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p"))) if ty.json_fn is not None: f.write("char *%s_to_json(libxl_ctx *ctx, %s);\n" % (ty.typename, ty.make_arg("p"))) if isinstance(ty, libxltypes.Enumeration): @@ -277,10 +277,10 @@ if __name__ == ''__main__'': """ % " ".join(sys.argv)) - for ty in [t for t in types if t.destructor_fn is not None and t.autogenerate_destructor]: - f.write("void %s(%s)\n" % (ty.destructor_fn, ty.make_arg("p"))) + for ty in [t for t in types if t.dispose_fn is not None and t.autogenerate_dispose_fn]: + f.write("void %s(%s)\n" % (ty.dispose_fn, ty.make_arg("p"))) f.write("{\n") - f.write(libxl_C_type_destroy(ty, "p")) + f.write(libxl_C_type_dispose(ty, "p")) f.write(" memset(p, LIBXL_DTOR_POISON, sizeof(*p));\n") f.write("}\n") f.write("\n") diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/idl.txt --- a/tools/libxl/idl.txt Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/idl.txt Tue Oct 18 10:35:55 2011 +0100 @@ -39,14 +39,14 @@ Type.passby: (default: libxltypes.PASS_B libxltypes.PASS_BY_VALUE libxltypes.PASS_BY_REFERENCE -Type.destructor_fn: (default: typename + "_destroy" or None if type == None) +Type.dispose_fn: (default: typename + "_dispose" or None if type == None) The name of the C function which will free all dynamically allocated memory contained within this type (but not the type itself). -Type.autogenerate_destructor: (default: True) +Type.autogenerate_dispose_fn: (default: True) - Indicates if the above named Type.destructor_fn should be + Indicates if the above named Type.dispose_fn should be autogenerated. Type.json_fn: (default: typename + "_gen_json" or None if type == None) diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 @@ -87,12 +87,12 @@ int libxl_ctx_free(libxl_ctx *ctx) { if (!ctx) return 0; if (ctx->xch) xc_interface_close(ctx->xch); - libxl_version_info_destroy(&ctx->version_info); + libxl_version_info_dispose(&ctx->version_info); if (ctx->xsh) xs_daemon_close(ctx->xsh); return 0; } -void libxl_string_list_destroy(libxl_string_list *psl) +void libxl_string_list_dispose(libxl_string_list *psl) { int i; libxl_string_list sl = *psl; @@ -105,7 +105,7 @@ void libxl_string_list_destroy(libxl_str free(sl); } -void libxl_key_value_list_destroy(libxl_key_value_list *pkvl) +void libxl_key_value_list_dispose(libxl_key_value_list *pkvl) { int i; libxl_key_value_list kvl = *pkvl; @@ -767,7 +767,7 @@ int libxl_domain_destroy(libxl_ctx *ctx, libxl__qmp_cleanup(&gc, domid); } if (libxl__devices_destroy(&gc, domid, force) < 0) - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_destroy_devices failed for %d", domid); + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_devices_dispose failed for %d", domid); vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path)); if (vm_path) @@ -1641,7 +1641,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u } out: for (i = 0; i < num; i++) - libxl_device_disk_destroy(&disks[i]); + libxl_device_disk_dispose(&disks[i]); free(disks); return ret; } @@ -2241,7 +2241,7 @@ fail: xc_hypercall_buffer_free(ctx->xch, coremap); xc_hypercall_buffer_free(ctx->xch, socketmap); xc_hypercall_buffer_free(ctx->xch, nodemap); - libxl_topologyinfo_destroy(info); + libxl_topologyinfo_dispose(info); return ERROR_FAIL; } @@ -2722,7 +2722,7 @@ int libxl_tmem_freeable(libxl_ctx *ctx) return rc; } -void libxl_file_reference_destroy(libxl_file_reference *f) +void libxl_file_reference_dispose(libxl_file_reference *f) { libxl__file_reference_unmap(f); free(f->path); @@ -2852,7 +2852,7 @@ int libxl_destroy_cpupool(libxl_ctx *ctx rc = 0; out1: - libxl_cpumap_destroy(&cpumap); + libxl_cpumap_dispose(&cpumap); out: xc_cpupool_infofree(ctx->xch, info); libxl__free_all(&gc); @@ -2941,10 +2941,10 @@ int libxl_cpupool_cpuadd_node(libxl_ctx } } - libxl_topologyinfo_destroy(&topology); + libxl_topologyinfo_dispose(&topology); out: - libxl_cpumap_destroy(&freemap); + libxl_cpumap_dispose(&freemap); return rc; } @@ -2993,11 +2993,11 @@ int libxl_cpupool_cpuremove_node(libxl_c } } - libxl_topologyinfo_destroy(&topology); + libxl_topologyinfo_dispose(&topology); out: for (p = 0; p < n_pools; p++) { - libxl_cpupoolinfo_destroy(poolinfo + p); + libxl_cpupoolinfo_dispose(poolinfo + p); } return ret; diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 10:35:55 2011 +0100 @@ -144,10 +144,10 @@ typedef uint8_t libxl_mac[6]; #define LIBXL_MAC_BYTES(mac) mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] typedef char **libxl_string_list; -void libxl_string_list_destroy(libxl_string_list *sl); +void libxl_string_list_dispose(libxl_string_list *sl); typedef char **libxl_key_value_list; -void libxl_key_value_list_destroy(libxl_key_value_list *kvl); +void libxl_key_value_list_dispose(libxl_key_value_list *kvl); typedef uint32_t libxl_hwcap[8]; @@ -155,14 +155,14 @@ typedef struct { uint32_t size; /* number of bytes in map */ uint8_t *map; } libxl_cpumap; -void libxl_cpumap_destroy(libxl_cpumap *map); +void libxl_cpumap_dispose(libxl_cpumap *map); typedef struct { uint32_t entries; uint32_t *array; } libxl_cpuarray; #define LIBXL_CPUARRAY_INVALID_ENTRY ~0 -void libxl_cpuarray_destroy(libxl_cpuarray *array); +void libxl_cpuarray_dispose(libxl_cpuarray *array); typedef struct { /* @@ -174,7 +174,7 @@ typedef struct { void * data; size_t size; } libxl_file_reference; -void libxl_file_reference_destroy(libxl_file_reference *p); +void libxl_file_reference_dispose(libxl_file_reference *p); /* libxl_cpuid_policy_list is a dynamic array storing CPUID policies * for multiple leafs. It is terminated with an entry holding @@ -182,7 +182,7 @@ void libxl_file_reference_destroy(libxl_ */ typedef struct libxl__cpuid_policy libxl_cpuid_policy; typedef libxl_cpuid_policy * libxl_cpuid_policy_list; -void libxl_cpuid_destroy(libxl_cpuid_policy_list *cpuid_list); +void libxl_cpuid_dispose(libxl_cpuid_policy_list *cpuid_list); #define LIBXL_PCI_FUNC_ALL (~0U) @@ -261,7 +261,7 @@ int libxl_init_dm_info(libxl_ctx *ctx, typedef int (*libxl_console_ready)(libxl_ctx *ctx, uint32_t domid, void *priv); int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid); int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd); -void libxl_domain_config_destroy(libxl_domain_config *d_config); +void libxl_domain_config_dispose(libxl_domain_config *d_config); int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info, uint32_t domid, int fd); int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid); diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_cpuid.c --- a/tools/libxl/libxl_cpuid.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl_cpuid.c Tue Oct 18 10:35:55 2011 +0100 @@ -16,7 +16,7 @@ #include "libxl_osdeps.h" #include "libxl_internal.h" -void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list) +void libxl_cpuid_dispose(libxl_cpuid_policy_list *p_cpuid_list) { int i, j; libxl_cpuid_policy_list cpuid_list = *p_cpuid_list; diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_create.c --- a/tools/libxl/libxl_create.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl_create.c Tue Oct 18 10:35:55 2011 +0100 @@ -31,33 +31,33 @@ #include "libxl_internal.h" #include "flexarray.h" -void libxl_domain_config_destroy(libxl_domain_config *d_config) +void libxl_domain_config_dispose(libxl_domain_config *d_config) { int i; for (i=0; i<d_config->num_disks; i++) - libxl_device_disk_destroy(&d_config->disks[i]); + libxl_device_disk_dispose(&d_config->disks[i]); free(d_config->disks); for (i=0; i<d_config->num_vifs; i++) - libxl_device_nic_destroy(&d_config->vifs[i]); + libxl_device_nic_dispose(&d_config->vifs[i]); free(d_config->vifs); for (i=0; i<d_config->num_pcidevs; i++) - libxl_device_pci_destroy(&d_config->pcidevs[i]); + libxl_device_pci_dispose(&d_config->pcidevs[i]); free(d_config->pcidevs); for (i=0; i<d_config->num_vfbs; i++) - libxl_device_vfb_destroy(&d_config->vfbs[i]); + libxl_device_vfb_dispose(&d_config->vfbs[i]); free(d_config->vfbs); for (i=0; i<d_config->num_vkbs; i++) - libxl_device_vkb_destroy(&d_config->vkbs[i]); + libxl_device_vkb_dispose(&d_config->vkbs[i]); free(d_config->vkbs); - libxl_domain_create_info_destroy(&d_config->c_info); - libxl_domain_build_info_destroy(&d_config->b_info); - libxl_device_model_info_destroy(&d_config->dm_info); + libxl_domain_create_info_dispose(&d_config->c_info); + libxl_domain_build_info_dispose(&d_config->b_info); + libxl_device_model_info_dispose(&d_config->dm_info); } int libxl_init_create_info(libxl_ctx *ctx, libxl_domain_create_info *c_info) @@ -512,7 +512,7 @@ static int do_domain_create(libxl__gc *g if ( ret ) goto error_out; libxl__device_console_add(gc, domid, &console, &state); - libxl_device_console_destroy(&console); + libxl_device_console_dispose(&console); dm_info->domid = domid; ret = libxl__create_device_model(gc, dm_info, @@ -549,7 +549,7 @@ static int do_domain_create(libxl__gc *g console.consback = LIBXL_CONSOLE_BACKEND_IOEMU; libxl__device_console_add(gc, domid, &console, &state); - libxl_device_console_destroy(&console); + libxl_device_console_dispose(&console); if (need_qemu) { /* only copy those useful configs */ diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl_types.idl Tue Oct 18 10:35:55 2011 +0100 @@ -8,13 +8,13 @@ namespace("libxl_") 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", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE) -libxl_cpuarray = Builtin("cpuarray", destructor_fn="libxl_cpuarray_destroy", passby=PASS_BY_REFERENCE) -libxl_cpuid_policy_list = Builtin("cpuid_policy_list", destructor_fn="libxl_cpuid_destroy", passby=PASS_BY_REFERENCE) +libxl_cpumap = Builtin("cpumap", dispose_fn="libxl_cpumap_dispose", passby=PASS_BY_REFERENCE) +libxl_cpuarray = Builtin("cpuarray", dispose_fn="libxl_cpuarray_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", destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE) -libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy", passby=PASS_BY_REFERENCE) -libxl_file_reference = Builtin("file_reference", destructor_fn="libxl_file_reference_destroy", passby=PASS_BY_REFERENCE) +libxl_string_list = Builtin("string_list", dispose_fn="libxl_string_list_dispose", passby=PASS_BY_REFERENCE) +libxl_key_value_list = Builtin("key_value_list", dispose_fn="libxl_key_value_list_dispose", passby=PASS_BY_REFERENCE) +libxl_file_reference = Builtin("file_reference", dispose_fn="libxl_file_reference_dispose", passby=PASS_BY_REFERENCE) libxl_hwcap = Builtin("hwcap", passby=PASS_BY_REFERENCE) @@ -109,7 +109,7 @@ SHUTDOWN_* constant."""), ("cpu_time", uint64), ("vcpu_max_id", uint32), ("vcpu_online", uint32), - ], destructor_fn=None) + ], dispose_fn=None) libxl_cpupoolinfo = Struct("cpupoolinfo", [ ("poolid", uint32), @@ -121,7 +121,7 @@ libxl_cpupoolinfo = Struct("cpupoolinfo" libxl_vminfo = Struct("vminfo", [ ("uuid", libxl_uuid), ("domid", libxl_domid), - ], destructor_fn=None) + ], dispose_fn=None) libxl_version_info = Struct("version_info", [ ("xen_version_major", integer), @@ -362,7 +362,7 @@ libxl_physinfo = Struct("physinfo", [ ("nr_nodes", uint32), ("hw_cap", libxl_hwcap), ("phys_cap", uint32), - ], destructor_fn=None, dir=DIR_OUT) + ], dispose_fn=None, dir=DIR_OUT) libxl_topologyinfo = Struct("topologyinfo", [ ("coremap", libxl_cpuarray, False, "cpu to core map"), @@ -373,4 +373,4 @@ libxl_topologyinfo = Struct("topologyinf libxl_sched_credit = Struct("sched_credit", [ ("weight", integer), ("cap", integer), - ], destructor_fn=None) + ], dispose_fn=None) diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl_utils.c Tue Oct 18 10:35:55 2011 +0100 @@ -157,7 +157,7 @@ int libxl_name_to_cpupoolid(libxl_ctx *c } free(poolname); } - libxl_cpupoolinfo_destroy(poolinfo + i); + libxl_cpupoolinfo_dispose(poolinfo + i); } free(poolinfo); return ret; @@ -478,7 +478,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c } for (i=0; i<nb; i++) - libxl_nicinfo_destroy(&nics[i]); + libxl_nicinfo_dispose(&nics[i]); free(nics); return rc; } @@ -579,7 +579,7 @@ int libxl_cpumap_alloc(libxl_ctx *ctx, l return 0; } -void libxl_cpumap_destroy(libxl_cpumap *map) +void libxl_cpumap_dispose(libxl_cpumap *map) { free(map->map); } @@ -624,7 +624,7 @@ int libxl_cpuarray_alloc(libxl_ctx *ctx, return 0; } -void libxl_cpuarray_destroy(libxl_cpuarray *array) +void libxl_cpuarray_dispose(libxl_cpuarray *array) { free(array->array); } diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxltypes.py --- a/tools/libxl/libxltypes.py Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxltypes.py Tue Oct 18 10:35:55 2011 +0100 @@ -44,11 +44,11 @@ class Type(object): self.rawname = typename if self.typename is not None: - self.destructor_fn = kwargs.setdefault(''destructor_fn'', self.typename + "_destroy") + self.dispose_fn = kwargs.setdefault(''dispose_fn'', self.typename + "_dispose") else: - self.destructor_fn = kwargs.setdefault(''destructor_fn'', None) + self.dispose_fn = kwargs.setdefault(''dispose_fn'', None) - self.autogenerate_destructor = kwargs.setdefault(''autogenerate_destructor'', True) + self.autogenerate_dispose_fn = kwargs.setdefault(''autogenerate_dispose_fn'', True) if self.typename is not None: self.json_fn = kwargs.setdefault(''json_fn'', self.typename + "_gen_json") @@ -88,15 +88,15 @@ class Type(object): class Builtin(Type): """Builtin type""" def __init__(self, typename, **kwargs): - kwargs.setdefault(''destructor_fn'', None) - kwargs.setdefault(''autogenerate_destructor'', False) + kwargs.setdefault(''dispose_fn'', None) + kwargs.setdefault(''autogenerate_dispose_fn'', False) kwargs.setdefault(''autogenerate_json'', False) Type.__init__(self, typename, **kwargs) class Number(Builtin): def __init__(self, ctype, **kwargs): kwargs.setdefault(''namespace'', None) - kwargs.setdefault(''destructor_fn'', None) + kwargs.setdefault(''dispose_fn'', None) kwargs.setdefault(''signed'', False) kwargs.setdefault(''json_fn'', "yajl_gen_integer") self.signed = kwargs[''signed''] @@ -105,7 +105,7 @@ class Number(Builtin): class UInt(Number): def __init__(self, w, **kwargs): kwargs.setdefault(''namespace'', None) - kwargs.setdefault(''destructor_fn'', None) + kwargs.setdefault(''dispose_fn'', None) Number.__init__(self, "uint%d_t" % w, **kwargs) self.width = w @@ -122,7 +122,7 @@ class EnumerationValue(object): class Enumeration(Type): def __init__(self, typename, values, **kwargs): - kwargs.setdefault(''destructor_fn'', None) + kwargs.setdefault(''dispose_fn'', None) Type.__init__(self, typename, **kwargs) self.values = [] @@ -205,7 +205,7 @@ class Union(Aggregate): # union therefore any specific instance of this class will # need to provide an explicit destructor function. kwargs.setdefault(''passby'', PASS_BY_REFERENCE) - kwargs.setdefault(''destructor_fn'', None) + kwargs.setdefault(''dispose_fn'', None) Aggregate.__init__(self, "union", name, fields, **kwargs) class KeyedUnion(Aggregate): @@ -244,7 +244,7 @@ uint16 = UInt(16) uint32 = UInt(32) uint64 = UInt(64) -string = Builtin("char *", namespace = None, destructor_fn = "free", +string = Builtin("char *", namespace = None, dispose_fn = "free", json_fn = "libxl__string_gen_json", autogenerate_json = False) diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 10:35:55 2011 +0100 @@ -1685,7 +1685,7 @@ start: case LIBXL_EVENT_TYPE_DISK_EJECT: if (libxl_event_get_disk_eject_info(ctx, domid, &event, &disk)) { libxl_cdrom_insert(ctx, domid, &disk); - libxl_device_disk_destroy(&disk); + libxl_device_disk_dispose(&disk); } break; } @@ -1701,7 +1701,7 @@ out: if (logfile != 2) close(logfile); - libxl_domain_config_destroy(&d_config); + libxl_domain_config_dispose(&d_config); free(config_data); @@ -2047,7 +2047,7 @@ static void pcilist(const char *dom) printf("%02x.%01x %04x:%02x:%02x.%01x\n", (pcidevs[i].vdevfn >> 3) & 0x1f, pcidevs[i].vdevfn & 0x7, pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func); - libxl_device_pci_destroy(&pcidevs[i]); + libxl_device_pci_dispose(&pcidevs[i]); } free(pcidevs); } @@ -2078,7 +2078,7 @@ static void pcidetach(const char *dom, c exit(2); } libxl_device_pci_remove(ctx, domid, &pcidev, force); - libxl_device_pci_destroy(&pcidev); + libxl_device_pci_dispose(&pcidev); } int main_pcidetach(int argc, char **argv) @@ -2115,7 +2115,7 @@ static void pciattach(const char *dom, c exit(2); } libxl_device_pci_add(ctx, domid, &pcidev); - libxl_device_pci_destroy(&pcidev); + libxl_device_pci_dispose(&pcidev); } int main_pciattach(int argc, char **argv) @@ -2231,7 +2231,7 @@ static void list_domains_details(const l memset(&d_config, 0x00, sizeof(d_config)); parse_config_data(config_file, (char *)data, len, &d_config, &dm_info); printf_info(info[i].domid, &d_config, &dm_info); - libxl_domain_config_destroy(&d_config); + libxl_domain_config_dispose(&d_config); free(data); free(config_file); } @@ -3323,7 +3323,7 @@ static void print_domain_vcpuinfo(uint32 for (i = 0; i < nb_vcpu; i++) { print_vcpuinfo(domid, &vcpuinfo[i], nr_cpus); - libxl_vcpuinfo_destroy(&vcpuinfo[i]); + libxl_vcpuinfo_dispose(&vcpuinfo[i]); } free(vcpuinfo); @@ -3445,7 +3445,7 @@ static void vcpupin(const char *d, const } } vcpupin_out1: - libxl_cpumap_destroy(&cpumap); + libxl_cpumap_dispose(&cpumap); vcpupin_out: ; } @@ -3485,7 +3485,7 @@ static void vcpuset(const char *d, const 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_destroy(&cpumap); + libxl_cpumap_dispose(&cpumap); } int main_vcpuset(int argc, char **argv) @@ -3609,7 +3609,7 @@ static void output_topologyinfo(void) printf("numa_info : none\n"); - libxl_topologyinfo_destroy(&info); + libxl_topologyinfo_dispose(&info); return; } @@ -4018,7 +4018,7 @@ int main_networkattach(int argc, char ** fprintf(stderr, "libxl_device_nic_add failed.\n"); return 1; } - libxl_device_nic_destroy(&nic); + libxl_device_nic_dispose(&nic); return 0; } @@ -4051,7 +4051,7 @@ int main_networklist(int argc, char **ar printf("%6d %5d %6d %5d/%-11d %-30s\n", nics[i].devid, nics[i].state, nics[i].evtch, nics[i].rref_tx, nics[i].rref_rx, nics[i].backend); - libxl_nicinfo_destroy(&nics[i]); + libxl_nicinfo_dispose(&nics[i]); } free(nics); } @@ -4086,7 +4086,7 @@ int main_networkdetach(int argc, char ** fprintf(stderr, "libxl_device_nic_del failed.\n"); return 1; } - libxl_device_nic_destroy(&nic); + libxl_device_nic_dispose(&nic); return 0; } @@ -4152,9 +4152,9 @@ int main_blocklist(int argc, char **argv printf("%-5d %-3d %-6d %-5d %-6d %-8d %-30s\n", diskinfo.devid, diskinfo.backend_id, diskinfo.frontend_id, diskinfo.state, diskinfo.evtch, diskinfo.rref, diskinfo.backend); - libxl_diskinfo_destroy(&diskinfo); + libxl_diskinfo_dispose(&diskinfo); } - libxl_device_disk_destroy(&disks[i]); + libxl_device_disk_dispose(&disks[i]); } free(disks); } @@ -4791,7 +4791,7 @@ int main_cpupoolcreate(int argc, char ** n_nodes++; } - libxl_topologyinfo_destroy(&topology); + libxl_topologyinfo_dispose(&topology); if (n_cpus == 0) { fprintf(stderr, "no free cpu found\n"); @@ -4931,7 +4931,7 @@ int main_cpupoollist(int argc, char **ar printf("\n"); } } - libxl_cpupoolinfo_destroy(poolinfo + p); + libxl_cpupoolinfo_dispose(poolinfo + p); } return ret; @@ -5132,7 +5132,7 @@ int main_cpupoolnumasplit(int argc, char poolid = poolinfo[0].poolid; schedid = poolinfo[0].sched_id; for (p = 0; p < n_pools; p++) { - libxl_cpupoolinfo_destroy(poolinfo + p); + libxl_cpupoolinfo_dispose(poolinfo + p); } if (n_pools > 1) { fprintf(stderr, "splitting not possible, already cpupools in use\n"); @@ -5146,7 +5146,7 @@ int main_cpupoolnumasplit(int argc, char if (libxl_cpumap_alloc(ctx, &cpumap)) { fprintf(stderr, "Failed to allocate cpumap\n"); - libxl_topologyinfo_destroy(&topology); + libxl_topologyinfo_dispose(&topology); return -ERROR_FAIL; } @@ -5229,8 +5229,8 @@ int main_cpupoolnumasplit(int argc, char } out: - libxl_topologyinfo_destroy(&topology); - libxl_cpumap_destroy(&cpumap); + libxl_topologyinfo_dispose(&topology); + libxl_cpumap_dispose(&cpumap); return ret; } diff -r 450a1d48932c -r d71e77d3fbf1 tools/python/genwrap.py --- a/tools/python/genwrap.py Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/python/genwrap.py Tue Oct 18 10:35:55 2011 +0100 @@ -100,8 +100,8 @@ def py_attrib_set(ty, f): def py_object_def(ty): l = [] - if ty.destructor_fn is not None: - dtor = '' %s(&self->obj);\n''%ty.destructor_fn + if ty.dispose_fn is not None: + dtor = '' %s(&self->obj);\n''%ty.dispose_fn else: dtor = '''' diff -r 450a1d48932c -r d71e77d3fbf1 tools/python/xen/lowlevel/xl/xl.c --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 18 10:35:55 2011 +0100 @@ -246,7 +246,7 @@ int attrib__libxl_hwcap_set(PyObject *v, int attrib__libxl_key_value_list_set(PyObject *v, libxl_key_value_list *pptr) { if ( *pptr ) { - libxl_key_value_list_destroy(pptr); + libxl_key_value_list_dispose(pptr); *pptr = NULL; } if ( v == Py_None ) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:54 UTC
[Xen-devel] [PATCH 04 of 27 v3] libxl: libxl_destroy_cpumap becomes libxl_cpumap_destroy
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318930555 -3600 # Node ID 97a7eac6e0b3ee4284bfabf8ee548db47e5c8ef3 # Parent d71e77d3fbf19c4c986c519f4805dee113f5f622 libxl: libxl_destroy_cpumap becomes libxl_cpumap_destroy Now that IDL type destructors are no longer libxl_*_destroy we can use the more common libxl_NOUN_VERB structure here. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r d71e77d3fbf1 -r 97a7eac6e0b3 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 @@ -2775,7 +2775,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, if (rc) { LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "Error moving cpu to cpupool"); - libxl_destroy_cpupool(ctx, *poolid); + libxl_cpupool_destroy(ctx, *poolid); libxl__free_all(&gc); return ERROR_FAIL; } @@ -2799,7 +2799,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, } } -int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid) +int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid) { libxl__gc gc = LIBXL_INIT_GC(ctx); int rc, i; diff -r d71e77d3fbf1 -r 97a7eac6e0b3 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 10:35:55 2011 +0100 @@ -503,7 +503,7 @@ int libxl_get_freecpus(libxl_ctx *ctx, l int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid, libxl_cpumap cpumap, libxl_uuid *uuid, uint32_t *poolid); -int libxl_destroy_cpupool(libxl_ctx *ctx, 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); 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); diff -r d71e77d3fbf1 -r 97a7eac6e0b3 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 10:35:55 2011 +0100 @@ -4954,7 +4954,7 @@ int main_cpupooldestroy(int argc, char * return -ERROR_FAIL; } - return -libxl_destroy_cpupool(ctx, poolid); + return -libxl_cpupool_destroy(ctx, poolid); } int main_cpupoolrename(int argc, char **argv) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 05 of 27 v3] libxl: add a comment describing the device interfaces
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318930555 -3600 # Node ID 520855af77ed20f228d6747c1fb2a4ed8de831fd # Parent 97a7eac6e0b3ee4284bfabf8ee548db47e5c8ef3 libxl: add a comment describing the device interfaces. Subsequent patches will endevour to make reality match this defined interface. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 97a7eac6e0b3 -r 520855af77ed tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 10:35:55 2011 +0100 @@ -379,6 +379,65 @@ libxl_dominfo * libxl_list_domain(libxl_ libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool); libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm); +/* + * Devices + * ======+ * + * Each device is represented by a libxl_device_<TYPE> data structure + * which is defined via the IDL. In addition some devices have an + * additional data type libxl_device_<TYPE>_getinfo which contains + * further runtime information about the device. + * + * A common set of methods are available for each device type. These + * are described below. + * + * Querying + * -------- + * + * libxl_device_<type>_list(ctx, domid, nr): + * + * Returns an array of libxl_device_<type> length nr representing + * the devices attached to the specified domain. + * + * libxl_device_<type>_getinfo(ctx, domid, device, info): + * + * Initialises info with details of the given device which must be + * attached to the specified domain. + * + * Creation / Control + * ------------------ + * + * libxl_device_<type>_init(ctx, device): + * + * Initalises device to a default configuration. + * + * libxl_device_<type>_add(ctx, domid, device): + * + * Adds the given device to the specified domain. This can be called + * while the guest is running (hotplug) or before boot (coldplug). + * + * This function only sets up the device but does not wait for the + * domain to connect to the device and therefore cannot block on the + * guest. + * + * libxl_device_<type>_remove(ctx, domid, device): + * + * Removes the given device from the specified domain by performing + * an orderly unplug with guest co-operation. This requires that the + * guest is running. + * + * This method is currently synchronous and therefore can block + * while interacting with the guest. + * + * libxl_device_<type>_destroy(ctx, domid, device): + * + * Removes the given device from the specified domain without guest + * co-operation. It is guest specific what affect this will have on + * a running guest. + * + * This function does not interact with the guest and therefore + * cannot block on the guest. + */ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, int wait); libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 06 of 27 v3] libxl: various fixes to libxl_device_disk_list (and internals)
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318930555 -3600 # Node ID 83cc6057edeceb873c7ecd694bd2766da367ffea # Parent 520855af77ed20f228d6747c1fb2a4ed8de831fd libxl: various fixes to libxl_device_disk_list (and internals) - handle realloc errors - remove redundancy of libxl__append_disk_list_of_type return value and ndisks paramter. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 520855af77ed -r 83cc6057edec tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 @@ -1505,11 +1505,11 @@ int libxl_device_vkb_hard_shutdown(libxl return ERROR_NI; } -static unsigned int libxl__append_disk_list_of_type(libxl__gc *gc, - uint32_t domid, - const char *type, - libxl_device_disk **disks, - unsigned int *ndisks) +static int libxl__append_disk_list_of_type(libxl__gc *gc, + uint32_t domid, + const char *type, + libxl_device_disk **disks, + int *ndisks) { libxl_ctx *ctx = libxl__gc_owner(gc); char *be_path = NULL; @@ -1523,11 +1523,16 @@ static unsigned int libxl__append_disk_l dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n); if (dir) { char *removable; - *disks = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); + libxl_device_disk *tmp; + tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); + if (tmp == NULL) + return ERROR_NOMEM; + *disks = tmp; pdisk = *disks + *ndisks; *ndisks += n; pdisk_end = *disks + *ndisks; for (; pdisk < pdisk_end; pdisk++, dir++) { + memset(pdisk, 0, sizeof(*pdisk)); pdisk->backend_domid = 0; physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len); if (physpath_tmp && strchr(physpath_tmp, '':'')) { @@ -1555,22 +1560,37 @@ static unsigned int libxl__append_disk_l pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN; } } - - return n; + return 0; } libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num) { libxl__gc gc = LIBXL_INIT_GC(ctx); libxl_device_disk *disks = NULL; - unsigned int ndisks = 0; - - *num = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, &ndisks); - *num += libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, &ndisks); - *num += libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, &ndisks); + int rc; + + *num = 0; + + rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num); + if (rc) goto out_err; + + rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num); + if (rc) goto out_err; + + rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num); + if (rc) goto out_err; libxl__free_all(&gc); return disks; + +out_err: + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks"); + while (disks && *num) { + (*num)--; + libxl_device_disk_dispose(&disks[*num]); + } + free(disks); + return NULL; } int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid, _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 07 of 27 v3] libxl: refactor code to construct disk from xenstore backend
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318930556 -3600 # Node ID 0bbe2abadf82cb1bd86e1d37b860bb212255964d # Parent 83cc6057edeceb873c7ecd694bd2766da367ffea libxl: refactor code to construct disk from xenstore backend Temporarily retain unsafe behaviour of reading f.e. directory. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 83cc6057edec -r 0bbe2abadf82 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 10:35:55 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 10:35:56 2011 +0100 @@ -1505,24 +1505,69 @@ int libxl_device_vkb_hard_shutdown(libxl return ERROR_NI; } +static void libxl__device_disk_from_xs_be(libxl__gc *gc, + const char *be_path, + libxl_device_disk *disk) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + unsigned int len; + char *tmp; + const char *fe_path; /* XXX unsafe */ + + memset(disk, 0, sizeof(*disk)); + + tmp = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/params", be_path), &len); + if (tmp && strchr(tmp, '':'')) { + disk->pdev_path = strdup(strchr(tmp, '':'') + 1); + free(tmp); + } else { + disk->pdev_path = tmp; + } + libxl_string_to_backend(ctx, + libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/type", be_path)), + &(disk->backend)); + disk->vdev = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/dev", be_path), &len); + tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf + (gc, "%s/removable", be_path)); + + if (tmp) + disk->removable = atoi(tmp); + else + disk->removable = 0; + + tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path)); + if (!strcmp(tmp, "w")) + disk->readwrite = 1; + else + disk->readwrite = 0; + + fe_path = libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/frontend", be_path)); + tmp = libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/device-type", fe_path)); + disk->is_cdrom = !strcmp(tmp, "cdrom"); + + disk->format = LIBXL_DISK_FORMAT_UNKNOWN; +} + static int libxl__append_disk_list_of_type(libxl__gc *gc, uint32_t domid, const char *type, libxl_device_disk **disks, int *ndisks) { - libxl_ctx *ctx = libxl__gc_owner(gc); char *be_path = NULL; char **dir = NULL; - unsigned int n = 0, len = 0; + unsigned int n = 0; libxl_device_disk *pdisk = NULL, *pdisk_end = NULL; - char *physpath_tmp = NULL; be_path = libxl__sprintf(gc, "%s/backend/%s/%d", libxl__xs_get_dompath(gc, 0), type, domid); dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n); if (dir) { - char *removable; libxl_device_disk *tmp; tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); if (tmp == NULL) @@ -1532,32 +1577,10 @@ static int libxl__append_disk_list_of_ty *ndisks += n; pdisk_end = *disks + *ndisks; for (; pdisk < pdisk_end; pdisk++, dir++) { - memset(pdisk, 0, sizeof(*pdisk)); + const char *p; + p = libxl__sprintf(gc, "%s/%s", be_path, *dir); + libxl__device_disk_from_xs_be(gc, p, pdisk); pdisk->backend_domid = 0; - physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len); - if (physpath_tmp && strchr(physpath_tmp, '':'')) { - pdisk->pdev_path = strdup(strchr(physpath_tmp, '':'') + 1); - free(physpath_tmp); - } else { - pdisk->pdev_path = physpath_tmp; - } - libxl_string_to_backend(ctx, libxl__xs_read(gc, XBT_NULL, - libxl__sprintf(gc, "%s/%s/type", be_path, *dir)), - &(pdisk->backend)); - pdisk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/dev", be_path, *dir), &len); - removable = libxl__xs_read(gc, XBT_NULL, libxl__sprintf - (gc, "%s/%s/removable", be_path, *dir)); - if (removable) - pdisk->removable = atoi(removable); - else - pdisk->removable = 0; - if (!strcmp(libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/mode", be_path, *dir)), "w")) - pdisk->readwrite = 1; - else - pdisk->readwrite = 0; - type = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/device-type", libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/frontend", be_path, *dir)))); - pdisk->is_cdrom = !strcmp(type, "cdrom"); - pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN; } } return 0; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 08 of 27 v3] libxl: do not read f.e. xenstore dir in disk list function
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941375 -3600 # Node ID 70dc8cd5ba46742671166a603937205746248901 # Parent 0bbe2abadf82cb1bd86e1d37b860bb212255964d libxl: do not read f.e. xenstore dir in disk list function Instead store a duplicate of the "device-type" node in the backend dir and use that instead. This maintains the invariant that the list function is always "safe". Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 0bbe2abadf82 -r 70dc8cd5ba46 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 10:35:56 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:15 2011 +0100 @@ -1018,6 +1018,8 @@ int libxl_device_disk_add(libxl_ctx *ctx flexarray_append(back, libxl__device_disk_string_of_backend(disk->backend)); flexarray_append(back, "mode"); flexarray_append(back, disk->readwrite ? "w" : "r"); + flexarray_append(back, "device-type"); + flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk"); flexarray_append(front, "backend-id"); flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid)); @@ -1512,7 +1514,6 @@ static void libxl__device_disk_from_xs_b libxl_ctx *ctx = libxl__gc_owner(gc); unsigned int len; char *tmp; - const char *fe_path; /* XXX unsafe */ memset(disk, 0, sizeof(*disk)); @@ -1544,10 +1545,8 @@ static void libxl__device_disk_from_xs_b else disk->readwrite = 0; - fe_path = libxl__xs_read(gc, XBT_NULL, - libxl__sprintf(gc, "%s/frontend", be_path)); tmp = libxl__xs_read(gc, XBT_NULL, - libxl__sprintf(gc, "%s/device-type", fe_path)); + libxl__sprintf(gc, "%s/device-type", be_path)); disk->is_cdrom = !strcmp(tmp, "cdrom"); disk->format = LIBXL_DISK_FORMAT_UNKNOWN; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 09 of 27 v3] libxl: update nic list API to use common device API style
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 7799bad1a323ea5299f61cd1361833631e018fac # Parent 70dc8cd5ba46742671166a603937205746248901 libxl: update nic list API to use common device API style libxl_device_nic_list returns an array of libxl_device_nic and libxl_device_nic_getinfo retrieves further information. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:15 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1291,60 +1291,138 @@ int libxl_device_nic_del(libxl_ctx *ctx, return rc; } -libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb) +static void libxl__device_nic_from_xs_be(libxl__gc *gc, + const char *be_path, + libxl_device_nic *nic) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + unsigned int len; + char *tmp; + int rc; + + memset(nic, 0, sizeof(*nic)); + + tmp = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/handle", be_path), &len); + if ( tmp ) + nic->devid = atoi(tmp); + else + nic->devid = 0; + + /* nic->mtu = */ + + tmp = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/mac", be_path), &len); + rc = libxl__parse_mac(tmp, nic->mac); + if (rc) + memset(nic->mac, 0, sizeof(nic->mac)); + + nic->ip = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/ip", be_path), &len); + + nic->bridge = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/bridge", be_path), &len); + + nic->script = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/script", be_path), &len); + + /* XXX ioemu nics are not in xenstore at all? */ + nic->nictype = LIBXL_NIC_TYPE_VIF; + nic->model = NULL; /* XXX Only for TYPE_IOEMU */ + nic->ifname = NULL; /* XXX Only for TYPE_IOEMU */ +} + +static int libxl__append_nic_list_of_type(libxl__gc *gc, + uint32_t domid, + const char *type, + libxl_device_nic **nics, + int *nnics) +{ + char *be_path = NULL; + char **dir = NULL; + unsigned int n = 0; + libxl_device_nic *pnic = NULL, *pnic_end = NULL; + + be_path = libxl__sprintf(gc, "%s/backend/%s/%d", + libxl__xs_get_dompath(gc, 0), type, domid); + dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n); + if (dir) { + libxl_device_nic *tmp; + tmp = realloc(*nics, sizeof (libxl_device_nic) * (*nnics + n)); + if (tmp == NULL) + return ERROR_NOMEM; + *nics = tmp; + pnic = *nics + *nnics; + *nnics += n; + pnic_end = *nics + *nnics; + for (; pnic < pnic_end; pnic++, dir++) { + const char *p; + p = libxl__sprintf(gc, "%s/%s", be_path, *dir); + libxl__device_nic_from_xs_be(gc, p, pnic); + pnic->backend_domid = 0; + } + } + return 0; +} + +libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num) { libxl__gc gc = LIBXL_INIT_GC(ctx); - char *dompath, *nic_path_fe; - char **l, **list; - char *val, *tok; - unsigned int nb_nics, i; - libxl_nicinfo *res, *nics; + libxl_device_nic *nics = NULL; + int rc; + + *num = 0; + + rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num); + if (rc) goto out_err; + + libxl__free_all(&gc); + return nics; + +out_err: + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list nics"); + while (*num) { + (*num)--; + libxl_device_nic_dispose(&nics[*num]); + } + free(nics); + return NULL; +} + +int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid, + libxl_device_nic *nic, libxl_nicinfo *nicinfo) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + char *dompath, *nicpath; + char *val; dompath = libxl__xs_get_dompath(&gc, domid); - if (!dompath) - goto err; - list = l = libxl__xs_directory(&gc, XBT_NULL, - libxl__sprintf(&gc, "%s/device/vif", dompath), &nb_nics); - if (!l) - goto err; - nics = res = calloc(nb_nics, sizeof (libxl_nicinfo)); - if (!res) - goto err; - for (*nb = nb_nics; nb_nics > 0; --nb_nics, ++l, ++nics) { - nic_path_fe = libxl__sprintf(&gc, "%s/device/vif/%s", dompath, *l); - - nics->backend = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(&gc, "%s/backend", nic_path_fe), NULL); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nic_path_fe)); - nics->backend_id = val ? strtoul(val, NULL, 10) : -1; - - nics->devid = strtoul(*l, NULL, 10); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nic_path_fe)); - nics->state = val ? strtoul(val, NULL, 10) : -1; - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe)); - for (i = 0, tok = strtok(val, ":"); tok && (i < 6); - ++i, tok = strtok(NULL, ":")) { - nics->mac[i] = strtoul(tok, NULL, 16); - } - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nic_path_fe)); - nics->evtch = val ? strtol(val, NULL, 10) : -1; - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nic_path_fe)); - nics->rref_tx = val ? strtol(val, NULL, 10) : -1; - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nic_path_fe)); - nics->rref_rx = val ? strtol(val, NULL, 10) : -1; - nics->frontend = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(&gc, "%s/frontend", nics->backend), NULL); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nics->backend)); - nics->frontend_id = val ? strtoul(val, NULL, 10) : -1; - nics->script = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(&gc, "%s/script", nics->backend), NULL); + nicinfo->devid = nic->devid; + + nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid); + nicinfo->backend = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(&gc, "%s/backend", nicpath), NULL); + if (!nicinfo->backend) { + libxl__free_all(&gc); + return ERROR_FAIL; } + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath)); + nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1; + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath)); + nicinfo->state = val ? strtoul(val, NULL, 10) : -1; + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath)); + nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1; + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath)); + nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1; + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath)); + nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1; + nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL); + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend)); + nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1; libxl__free_all(&gc); - return res; -err: - libxl__free_all(&gc); - return NULL; + return 0; } /******************************************************************************/ diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:15 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100 @@ -454,7 +454,9 @@ int libxl_device_disk_local_detach(libxl int libxl_device_nic_init(libxl_device_nic *nic, int dev_num); int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic); int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, int wait); -libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb); +libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num); +int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid, + libxl_device_nic *nic, libxl_nicinfo *nicinfo); int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console); diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Tue Oct 18 13:36:15 2011 +0100 +++ b/tools/libxl/libxl_types.idl Tue Oct 18 13:36:42 2011 +0100 @@ -330,8 +330,6 @@ libxl_nicinfo = Struct("nicinfo", [ ("frontend_id", uint32), ("devid", integer), ("state", integer), - ("script", string), - ("mac", libxl_mac), ("evtch", integer), ("rref_tx", integer), ("rref_rx", integer), diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Tue Oct 18 13:36:15 2011 +0100 +++ b/tools/libxl/libxl_utils.c Tue Oct 18 13:36:42 2011 +0100 @@ -451,15 +451,15 @@ int libxl_pipe(libxl_ctx *ctx, int pipes int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid, const char *mac, libxl_device_nic *nic) { - libxl_nicinfo *nics; - unsigned int nb, rc, i; + libxl_device_nic *nics; + int nb, rc, i; libxl_mac mac_n; rc = libxl__parse_mac(mac, mac_n); if (rc) return rc; - nics = libxl_list_nics(ctx, domid, &nb); + nics = libxl_device_nic_list(ctx, domid, &nb); if (!nics) return ERROR_FAIL; @@ -468,17 +468,17 @@ int libxl_mac_to_device_nic(libxl_ctx *c rc = ERROR_INVAL; for (i = 0; i < nb; ++i) { if (!libxl__compare_macs(&mac_n, &nics[i].mac)) { - nic->backend_domid = nics[i].backend_id; - nic->devid = nics[i].devid; - memcpy(nic->mac, nics[i].mac, sizeof (nic->mac)); - nic->script = strdup(nics[i].script); + *nic = nics[i]; rc = 0; + i++; /* Do not dispose this NIC on exit path */ break; } + libxl_device_nic_dispose(&nics[i]); } - for (i=0; i<nb; i++) - libxl_nicinfo_dispose(&nics[i]); + for (; i<nb; i++) + libxl_device_nic_dispose(&nics[i]); + free(nics); return rc; } diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:15 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100 @@ -4025,8 +4025,9 @@ int main_networkattach(int argc, char ** int main_networklist(int argc, char **argv) { int opt; - libxl_nicinfo *nics; - unsigned int nb, i; + libxl_device_nic *nics; + libxl_nicinfo nicinfo; + int nb, i; if ((opt = def_getopt(argc, argv, "", "network-list", 1)) != -1) return opt; @@ -4039,19 +4040,23 @@ int main_networklist(int argc, char **ar fprintf(stderr, "%s is an invalid domain identifier\n", *argv); continue; } - if (!(nics = libxl_list_nics(ctx, domid, &nb))) { + nics = libxl_device_nic_list(ctx, domid, &nb); + if (!nics) { continue; } for (i = 0; i < nb; ++i) { - /* Idx BE */ - printf("%-3d %-2d ", nics[i].devid, nics[i].backend_id); - /* MAC */ - printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac)); - /* Hdl Sta evch txr/rxr BE-path */ - printf("%6d %5d %6d %5d/%-11d %-30s\n", - nics[i].devid, nics[i].state, nics[i].evtch, - nics[i].rref_tx, nics[i].rref_rx, nics[i].backend); - libxl_nicinfo_dispose(&nics[i]); + if (!libxl_device_nic_getinfo(ctx, domid, &nics[i], &nicinfo)) { + /* Idx BE */ + printf("%-3d %-2d ", nicinfo.devid, nicinfo.backend_id); + /* MAC */ + printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac)); + /* Hdl Sta evch txr/rxr BE-path */ + printf("%6d %5d %6d %5d/%-11d %-30s\n", + nicinfo.devid, nicinfo.state, nicinfo.evtch, + nicinfo.rref_tx, nicinfo.rref_rx, nicinfo.backend); + libxl_nicinfo_dispose(&nicinfo); + } + libxl_device_nic_dispose(&nics[i]); } free(nics); } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 10 of 27 v3] libxl: reimplement devid->nic in terms of from_xs_be function
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 88488c1c2d316b0ab025c40eeec22c4c3e8e2c3b # Parent 7799bad1a323ea5299f61cd1361833631e018fac libxl: reimplement devid->nic in terms of from_xs_be function. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 7799bad1a323 -r 88488c1c2d31 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1315,7 +1315,7 @@ static void libxl__device_nic_from_xs_be libxl__sprintf(gc, "%s/mac", be_path), &len); rc = libxl__parse_mac(tmp, nic->mac); if (rc) - memset(nic->mac, 0, sizeof(nic->mac)); + memset(nic->mac, 0, sizeof(nic->mac)); nic->ip = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/ip", be_path), &len); @@ -1332,6 +1332,32 @@ static void libxl__device_nic_from_xs_be nic->ifname = NULL; /* XXX Only for TYPE_IOEMU */ } +int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, + const char *devid, libxl_device_nic *nic) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + char *dompath, *path; + int rc = ERROR_FAIL; + + memset(nic, 0, sizeof (libxl_device_nic)); + dompath = libxl__xs_get_dompath(&gc, domid); + if (!dompath) + goto out; + + path = libxl__xs_read(&gc, XBT_NULL, + libxl__sprintf(&gc, "%s/device/vif/%s/backend", + dompath, devid)); + if (!path) + goto out; + + libxl__device_nic_from_xs_be(&gc, path, nic); + + rc = 0; +out: + libxl__free_all(&gc); + return rc; +} + static int libxl__append_nic_list_of_type(libxl__gc *gc, uint32_t domid, const char *type, diff -r 7799bad1a323 -r 88488c1c2d31 tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_utils.c Tue Oct 18 13:36:42 2011 +0100 @@ -483,41 +483,6 @@ int libxl_mac_to_device_nic(libxl_ctx *c return rc; } -int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, - const char *devid, libxl_device_nic *nic) -{ - libxl__gc gc = LIBXL_INIT_GC(ctx); - char *val; - char *dompath, *nic_path_fe, *nic_path_be; - int rc = ERROR_FAIL; - - memset(nic, 0, sizeof (libxl_device_nic)); - dompath = libxl__xs_get_dompath(&gc, domid); - if (!dompath) { - goto out; - } - nic_path_fe = libxl__sprintf(&gc, "%s/device/vif/%s", dompath, devid); - nic_path_be = libxl__xs_read(&gc, XBT_NULL, - libxl__sprintf(&gc, "%s/backend", nic_path_fe)); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nic_path_fe)); - if ( NULL == val ) { - goto out; - } - nic->backend_domid = strtoul(val, NULL, 10); - nic->devid = strtoul(devid, NULL, 10); - - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe)); - rc = libxl__parse_mac(val, nic->mac); - if (rc) - goto out; - - nic->script = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/script", nic_path_be), NULL); - rc = 0; -out: - libxl__free_all(&gc); - return rc; -} - int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, const char *devid, libxl_device_disk *disk) { _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 11 of 27 v3] libxl: reimplement devid->disk in terms of from_xs_be function
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID a736cdba5d0a091aecbb96ae3696704b492e6728 # Parent 88488c1c2d316b0ab025c40eeec22c4c3e8e2c3b libxl: reimplement devid->disk in terms of from_xs_be function. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 88488c1c2d31 -r a736cdba5d0a tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1656,6 +1656,33 @@ static void libxl__device_disk_from_xs_b disk->format = LIBXL_DISK_FORMAT_UNKNOWN; } +int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, + const char *devid, libxl_device_disk *disk) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + char *dompath, *path; + int rc = ERROR_FAIL; + + memset(disk, 0, sizeof (libxl_device_disk)); + dompath = libxl__xs_get_dompath(&gc, domid); + if (!dompath) { + goto out; + } + path = libxl__xs_read(&gc, XBT_NULL, + libxl__sprintf(&gc, "%s/device/vbd/%s/backend", + dompath, devid)); + if (!path) + goto out; + + libxl__device_disk_from_xs_be(&gc, path, disk); + + rc = 0; +out: + libxl__free_all(&gc); + return rc; +} + + static int libxl__append_disk_list_of_type(libxl__gc *gc, uint32_t domid, const char *type, diff -r 88488c1c2d31 -r a736cdba5d0a tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_utils.c Tue Oct 18 13:36:42 2011 +0100 @@ -483,50 +483,6 @@ int libxl_mac_to_device_nic(libxl_ctx *c return rc; } -int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, - const char *devid, libxl_device_disk *disk) -{ - libxl__gc gc = LIBXL_INIT_GC(ctx); - char *val; - char *dompath, *diskpath, *be_path; - unsigned int devid_n; - int rc = ERROR_INVAL; - - devid_n = libxl__device_disk_dev_number(devid, NULL, NULL); - if (devid_n < 0) { - goto out; - } - rc = ERROR_FAIL; - dompath = libxl__xs_get_dompath(&gc, domid); - diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, devid_n); - if (!diskpath) { - goto out; - } - - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath)); - if (!val) - goto out; - disk->backend_domid = strtoul(val, NULL, 10); - be_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", diskpath)); - disk->pdev_path = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(&gc, "%s/params", be_path), NULL); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/type", be_path)); - libxl_string_to_backend(ctx, val, &(disk->backend)); - disk->vdev = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(&gc, "%s/dev", be_path), NULL); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/removable", be_path)); - disk->removable = !strcmp(val, "1"); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mode", be_path)); - disk->readwrite = !!strcmp(val, "w"); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/device-type", diskpath)); - disk->is_cdrom = !strcmp(val, "cdrom"); - rc = 0; - -out: - libxl__free_all(&gc); - return rc; -} - int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap) { int max_cpus; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 12 of 27 v3] libxl: libxl_devid_to_* should take an integer device id
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID da6b91661078fcf10247f8aab06a12c2bc2b2eb1 # Parent a736cdba5d0a091aecbb96ae3696704b492e6728 libxl: libxl_devid_to_* should take an integer device id Currently takes a string. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r a736cdba5d0a -r da6b91661078 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1333,7 +1333,7 @@ static void libxl__device_nic_from_xs_be } int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, - const char *devid, libxl_device_nic *nic) + int devid, libxl_device_nic *nic) { libxl__gc gc = LIBXL_INIT_GC(ctx); char *dompath, *path; @@ -1345,7 +1345,7 @@ int libxl_devid_to_device_nic(libxl_ctx goto out; path = libxl__xs_read(&gc, XBT_NULL, - libxl__sprintf(&gc, "%s/device/vif/%s/backend", + libxl__sprintf(&gc, "%s/device/vif/%d/backend", dompath, devid)); if (!path) goto out; @@ -1657,7 +1657,7 @@ static void libxl__device_disk_from_xs_b } int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, - const char *devid, libxl_device_disk *disk) + int devid, libxl_device_disk *disk) { libxl__gc gc = LIBXL_INIT_GC(ctx); char *dompath, *path; @@ -1669,7 +1669,7 @@ int libxl_devid_to_device_disk(libxl_ctx goto out; } path = libxl__xs_read(&gc, XBT_NULL, - libxl__sprintf(&gc, "%s/device/vbd/%s/backend", + libxl__sprintf(&gc, "%s/device/vbd/%d/backend", dompath, devid)); if (!path) goto out; diff -r a736cdba5d0a -r da6b91661078 tools/libxl/libxl_utils.h --- a/tools/libxl/libxl_utils.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_utils.h Tue Oct 18 13:36:42 2011 +0100 @@ -60,11 +60,11 @@ void libxl_report_child_exitstatus(libxl int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid, const char *mac, libxl_device_nic *nic); -int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, - const char *devid, libxl_device_nic *nic); +int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, int devid, + libxl_device_nic *nic); -int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, - const char *devid, libxl_device_disk *disk); +int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, int devid, + libxl_device_disk *disk); int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap); int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu); diff -r a736cdba5d0a -r da6b91661078 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100 @@ -4077,7 +4077,7 @@ int main_networkdetach(int argc, char ** } if (!strchr(argv[optind+1], '':'')) { - if (libxl_devid_to_device_nic(ctx, domid, argv[optind+1], &nic)) { + if (libxl_devid_to_device_nic(ctx, domid, atoi(argv[optind+1]), &nic)) { fprintf(stderr, "Unknown device %s.\n", argv[optind+1]); return 1; } @@ -4178,7 +4178,7 @@ int main_blockdetach(int argc, char **ar fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]); return 1; } - if (libxl_devid_to_device_disk(ctx, domid, argv[optind+1], &disk)) { + if (libxl_devid_to_device_disk(ctx, domid, atoi(argv[optind+1]), &disk)) { fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]); return 1; } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 13 of 27 v3] libxl: separate forced and non-forced device remove
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 16805eff73bdac4758dc84a3507918e5697df30a # Parent da6b91661078fcf10247f8aab06a12c2bc2b2eb1 libxl: separate forced and non-forced device remove. The function libxl__device_destroy currently takes a force parameter however: * in the forced case we initiate a graceful shutdown and then immediately nuke the backend directory, quite likely before anyone got a chance to react. * the callers all have a "wait" variable and pass in "!wait" as the force argument which is confusing since not waiting is not really the same thing as forcing the destroy. Therefore split the function into libxl__device_remove and libxl__device_destroy. The former initiates a graceful shutdown which the latter simply nukes the backend directory. This makes some of the callers look a bit odd but that should fall out as I continue to pull this piece of string. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r da6b91661078 -r 16805eff73bd tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -365,7 +365,7 @@ int libxl__device_disk_dev_number(const return -1; } -int libxl__device_destroy(libxl__gc *gc, char *be_path, int force) +int libxl__device_remove(libxl__gc *gc, char *be_path) { libxl_ctx *ctx = libxl__gc_owner(gc); xs_transaction_t t; @@ -393,17 +393,22 @@ retry_transaction: goto out; } } - if (!force) { - xs_watch(ctx->xsh, state_path, be_path); - rc = 1; - } else { - xs_rm(ctx->xsh, XBT_NULL, be_path); - } + + xs_watch(ctx->xsh, state_path, be_path); libxl__device_destroy_tapdisk(gc, be_path); + rc = 1; out: return rc; } +int libxl__device_destroy(libxl__gc *gc, char *be_path) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + xs_rm(ctx->xsh, XBT_NULL, be_path); + libxl__device_destroy_tapdisk(gc, be_path); + return 0; +} + static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv) { libxl_ctx *ctx = libxl__gc_owner(gc); @@ -461,7 +466,9 @@ int libxl__devices_destroy(libxl__gc *gc fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]); be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); if (be_path != NULL) { - if (libxl__device_destroy(gc, be_path, force) > 0) + int rc = force ? libxl__device_destroy(gc, be_path) + : libxl__device_remove(gc, be_path); + if (rc > 0) n_watches++; } else { xs_rm(ctx->xsh, XBT_NULL, path); @@ -473,7 +480,9 @@ int libxl__devices_destroy(libxl__gc *gc fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid); be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); if (be_path && strcmp(be_path, "")) { - if (libxl__device_destroy(gc, be_path, force) > 0) + int rc = force ? libxl__device_destroy(gc, be_path) + : libxl__device_remove(gc, be_path); + if (rc > 0) n_watches++; } @@ -506,7 +515,10 @@ int libxl__device_del(libxl__gc *gc, lib backend_path = libxl__device_backend_path(gc, dev); - rc = libxl__device_destroy(gc, backend_path, !wait); + if (wait) + rc = libxl__device_remove(gc, backend_path); + else + rc = libxl__device_destroy(gc, backend_path); if (rc == -1) { rc = ERROR_FAIL; goto out; diff -r da6b91661078 -r 16805eff73bd tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 @@ -253,7 +253,8 @@ _hidden int libxl__device_generic_add(li _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device); _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait); -_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path, int force); +_hidden int libxl__device_remove(libxl__gc *gc, char *be_path); +_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path); _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force); _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state); diff -r da6b91661078 -r 16805eff73bd tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 @@ -411,8 +411,7 @@ retry_transaction2: if (num == 1) { char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path)); - libxl__device_destroy(gc, be_path, 1); - xs_rm(ctx->xsh, XBT_NULL, be_path); + libxl__device_destroy(gc, be_path); xs_rm(ctx->xsh, XBT_NULL, fe_path); return 0; } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 14 of 27 v3] libxl: split forced and non-forced uses of libxl__device_del
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 89233ed65eced3ca2ef6cc1cce7abcdd3e5439e9 # Parent 16805eff73bdac4758dc84a3507918e5697df30a libxl: split forced and non-forced uses of libxl__device_del Most forced users can now simply call libxl__device_destroy directly. libxl__devices_destroy is something of a special case, it is really just iterating over an opaque set of xenstore directories and removing them. Until this can be refactored just do the force-remove case manually, doing otherwise led to too much entanglement with the other callers of libxl__device_destroy which do know about specific device types. For the time being do the same in libxl__device_pci_remove_xenstore. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1074,7 +1074,10 @@ int libxl_device_disk_del(libxl_ctx *ctx device.domid = domid; device.devid = devid; device.kind = DEVICE_VBD; - rc = libxl__device_del(&gc, &device, wait); + if (wait) + rc = libxl__device_del(&gc, &device); + else + rc = libxl__device_destroy(&gc, &device); out_free: libxl__free_all(&gc); return rc; @@ -1286,7 +1289,11 @@ int libxl_device_nic_del(libxl_ctx *ctx, device.domid = domid; device.kind = DEVICE_VIF; - rc = libxl__device_del(&gc, &device, wait); + if (wait) + rc = libxl__device_del(&gc, &device); + else + rc = libxl__device_destroy(&gc, &device); + libxl__free_all(&gc); return rc; } diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -401,11 +401,17 @@ out: return rc; } -int libxl__device_destroy(libxl__gc *gc, char *be_path) +int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) { libxl_ctx *ctx = libxl__gc_owner(gc); + char *be_path = libxl__device_backend_path(gc, dev); + char *fe_path = libxl__device_frontend_path(gc, dev); + xs_rm(ctx->xsh, XBT_NULL, be_path); + xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device_destroy_tapdisk(gc, be_path); + return 0; } @@ -466,10 +472,14 @@ int libxl__devices_destroy(libxl__gc *gc fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]); be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); if (be_path != NULL) { - int rc = force ? libxl__device_destroy(gc, be_path) - : libxl__device_remove(gc, be_path); - if (rc > 0) - n_watches++; + if (force) { + xs_rm(ctx->xsh, XBT_NULL, be_path); + xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device_destroy_tapdisk(gc, be_path); + } else { + if (libxl__device_remove(gc, be_path) > 0) + n_watches++; + } } else { xs_rm(ctx->xsh, XBT_NULL, path); } @@ -480,10 +490,13 @@ int libxl__devices_destroy(libxl__gc *gc fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid); be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); if (be_path && strcmp(be_path, "")) { - int rc = force ? libxl__device_destroy(gc, be_path) - : libxl__device_remove(gc, be_path); - if (rc > 0) - n_watches++; + if (force) { + xs_rm(ctx->xsh, XBT_NULL, be_path); + xs_rm(ctx->xsh, XBT_NULL, fe_path); + } else { + if (libxl__device_remove(gc, be_path) > 0) + n_watches++; + } } if (!force) { @@ -507,29 +520,24 @@ out: return 0; } -int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait) +int libxl__device_del(libxl__gc *gc, libxl__device *dev) { libxl_ctx *ctx = libxl__gc_owner(gc); + struct timeval tv; char *backend_path; int rc; backend_path = libxl__device_backend_path(gc, dev); - if (wait) - rc = libxl__device_remove(gc, backend_path); - else - rc = libxl__device_destroy(gc, backend_path); + rc = libxl__device_remove(gc, backend_path); if (rc == -1) { rc = ERROR_FAIL; goto out; } - if (wait) { - struct timeval tv; - tv.tv_sec = LIBXL_DESTROY_TIMEOUT; - tv.tv_usec = 0; - (void)wait_for_dev_destroy(gc, &tv); - } + tv.tv_sec = LIBXL_DESTROY_TIMEOUT; + tv.tv_usec = 0; + (void)wait_for_dev_destroy(gc, &tv); xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev)); rc = 0; diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 @@ -252,9 +252,9 @@ _hidden int libxl__device_generic_add(li char **bents, char **fents); _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device); _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); -_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait); +_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev); _hidden int libxl__device_remove(libxl__gc *gc, char *be_path); -_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path); +_hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev); _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force); _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state); diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 @@ -411,7 +411,7 @@ retry_transaction2: if (num == 1) { char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path)); - libxl__device_destroy(gc, be_path); + xs_rm(ctx->xsh, XBT_NULL, be_path); xs_rm(ctx->xsh, XBT_NULL, fe_path); return 0; } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 15 of 27 v3] libxl: use IDL to define device front- and back-end kinds
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 7f1e0391462078ee1bf572722e958b2ed0e966ef # Parent 89233ed65eced3ca2ef6cc1cce7abcdd3e5439e9 libxl: use IDL to define device front- and back-end kinds I''d like to use the from_string functionality... Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -962,7 +962,7 @@ int libxl_device_disk_add(libxl_ctx *ctx device.backend_domid = disk->backend_domid; device.devid = devid; device.domid = domid; - device.kind = DEVICE_VBD; + device.kind = LIBXL__DEVICE_KIND_VBD; switch (disk->backend) { case LIBXL_DISK_BACKEND_PHY: @@ -975,7 +975,7 @@ int libxl_device_disk_add(libxl_ctx *ctx flexarray_append(back, "params"); flexarray_append(back, dev); - device.backend_kind = DEVICE_VBD; + device.backend_kind = LIBXL__DEVICE_KIND_VBD; break; case LIBXL_DISK_BACKEND_TAP: dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format); @@ -994,7 +994,7 @@ int libxl_device_disk_add(libxl_ctx *ctx flexarray_append(back, "params"); flexarray_append(back, libxl__sprintf(&gc, "%s:%s", libxl__device_disk_string_of_format(disk->format), disk->pdev_path)); - device.backend_kind = DEVICE_QDISK; + device.backend_kind = LIBXL__DEVICE_KIND_QDISK; break; default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend); @@ -1057,13 +1057,13 @@ int libxl_device_disk_del(libxl_ctx *ctx switch (disk->backend) { case LIBXL_DISK_BACKEND_PHY: - device.backend_kind = DEVICE_VBD; + device.backend_kind = LIBXL__DEVICE_KIND_VBD; break; case LIBXL_DISK_BACKEND_TAP: - device.backend_kind = DEVICE_VBD; + device.backend_kind = LIBXL__DEVICE_KIND_VBD; break; case LIBXL_DISK_BACKEND_QDISK: - device.backend_kind = DEVICE_QDISK; + device.backend_kind = LIBXL__DEVICE_KIND_QDISK; break; default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", @@ -1073,7 +1073,7 @@ int libxl_device_disk_del(libxl_ctx *ctx } device.domid = domid; device.devid = devid; - device.kind = DEVICE_VBD; + device.kind = LIBXL__DEVICE_KIND_VBD; if (wait) rc = libxl__device_del(&gc, &device); else @@ -1221,10 +1221,10 @@ int libxl_device_nic_add(libxl_ctx *ctx, device.backend_devid = nic->devid; device.backend_domid = nic->backend_domid; - device.backend_kind = DEVICE_VIF; + device.backend_kind = LIBXL__DEVICE_KIND_VIF; device.devid = nic->devid; device.domid = domid; - device.kind = DEVICE_VIF; + device.kind = LIBXL__DEVICE_KIND_VIF; flexarray_append(back, "frontend-id"); flexarray_append(back, libxl__sprintf(&gc, "%d", domid)); @@ -1284,10 +1284,10 @@ int libxl_device_nic_del(libxl_ctx *ctx, device.backend_devid = nic->devid; device.backend_domid = nic->backend_domid; - device.backend_kind = DEVICE_VIF; + device.backend_kind = LIBXL__DEVICE_KIND_VIF; device.devid = nic->devid; device.domid = domid; - device.kind = DEVICE_VIF; + device.kind = LIBXL__DEVICE_KIND_VIF; if (wait) rc = libxl__device_del(&gc, &device); @@ -1486,10 +1486,10 @@ int libxl__device_console_add(libxl__gc device.backend_devid = console->devid; device.backend_domid = console->backend_domid; - device.backend_kind = DEVICE_CONSOLE; + device.backend_kind = LIBXL__DEVICE_KIND_CONSOLE; device.devid = console->devid; device.domid = domid; - device.kind = DEVICE_CONSOLE; + device.kind = LIBXL__DEVICE_KIND_CONSOLE; flexarray_append(back, "frontend-id"); flexarray_append(back, libxl__sprintf(gc, "%d", domid)); @@ -1577,10 +1577,10 @@ int libxl_device_vkb_add(libxl_ctx *ctx, device.backend_devid = vkb->devid; device.backend_domid = vkb->backend_domid; - device.backend_kind = DEVICE_VKBD; + device.backend_kind = LIBXL__DEVICE_KIND_VKBD; device.devid = vkb->devid; device.domid = domid; - device.kind = DEVICE_VKBD; + device.kind = LIBXL__DEVICE_KIND_VKBD; flexarray_append(back, "frontend-id"); flexarray_append(back, libxl__sprintf(&gc, "%d", domid)); @@ -1864,10 +1864,10 @@ int libxl_device_vfb_add(libxl_ctx *ctx, device.backend_devid = vfb->devid; device.backend_domid = vfb->backend_domid; - device.backend_kind = DEVICE_VFB; + device.backend_kind = LIBXL__DEVICE_KIND_VFB; device.devid = vfb->devid; device.domid = domid; - device.kind = DEVICE_VFB; + device.kind = LIBXL__DEVICE_KIND_VFB; flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid)); flexarray_append_pair(back, "online", "1"); diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -24,30 +24,20 @@ #include <unistd.h> #include <fcntl.h> - #include "libxl.h" #include "libxl_internal.h" -static const char *string_of_kinds[] = { - [DEVICE_VIF] = "vif", - [DEVICE_VBD] = "vbd", - [DEVICE_QDISK] = "qdisk", - [DEVICE_PCI] = "pci", - [DEVICE_VFB] = "vfb", - [DEVICE_VKBD] = "vkbd", - [DEVICE_CONSOLE] = "console", -}; - char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device) { char *dom_path = libxl__xs_get_dompath(gc, device->domid); /* Console 0 is a special case */ - if (device->kind == DEVICE_CONSOLE && device->devid == 0) + if (device->kind == LIBXL__DEVICE_KIND_CONSOLE && device->devid == 0) return libxl__sprintf(gc, "%s/console", dom_path); return libxl__sprintf(gc, "%s/device/%s/%d", dom_path, - string_of_kinds[device->kind], device->devid); + libxl__device_kind_to_string(device->kind), + device->devid); } char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device) @@ -55,7 +45,7 @@ char *libxl__device_backend_path(libxl__ char *dom_path = libxl__xs_get_dompath(gc, device->backend_domid); return libxl__sprintf(gc, "%s/backend/%s/%u/%d", dom_path, - string_of_kinds[device->backend_kind], + libxl__device_kind_to_string(device->backend_kind), device->domid, device->devid); } @@ -67,12 +57,6 @@ int libxl__device_generic_add(libxl__gc xs_transaction_t t; struct xs_permissions frontend_perms[2]; struct xs_permissions backend_perms[2]; - int rc; - - if (!is_valid_device_kind(device->backend_kind) || !is_valid_device_kind(device->kind)) { - rc = ERROR_INVAL; - goto out; - } frontend_path = libxl__device_frontend_path(gc, device); backend_path = libxl__device_backend_path(gc, device); @@ -113,9 +97,8 @@ retry_transaction: else LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs transaction failed"); } - rc = 0; -out: - return rc; + + return 0; } typedef struct { diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 @@ -97,25 +97,13 @@ struct libxl__ctx { libxl_version_info version_info; }; -typedef enum { - DEVICE_VIF = 1, - DEVICE_VBD, - DEVICE_QDISK, - DEVICE_PCI, - DEVICE_VFB, - DEVICE_VKBD, - DEVICE_CONSOLE, -} libxl__device_kinds; - -#define is_valid_device_kind(kind) (((kind) >= DEVICE_VIF) && ((kind) <= DEVICE_CONSOLE)) - typedef struct { uint32_t backend_devid; uint32_t backend_domid; uint32_t devid; uint32_t domid; - libxl__device_kinds backend_kind; - libxl__device_kinds kind; + libxl__device_kind backend_kind; + libxl__device_kind kind; } libxl__device; #define XC_PCI_BDF "0x%x, 0x%x, 0x%x, 0x%x" diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 @@ -244,10 +244,10 @@ int libxl__create_pci_backend(libxl__gc /* add pci device */ device.backend_devid = 0; device.backend_domid = 0; - device.backend_kind = DEVICE_PCI; + device.backend_kind = LIBXL__DEVICE_KIND_PCI; device.devid = 0; device.domid = domid; - device.kind = DEVICE_PCI; + device.kind = LIBXL__DEVICE_KIND_PCI; flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid)); flexarray_append_pair(back, "online", "1"); diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_types_internal.idl --- a/tools/libxl/libxl_types_internal.idl Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_types_internal.idl Tue Oct 18 13:36:42 2011 +0100 @@ -1,9 +1,19 @@ namespace("libxl__") -libxl__qmp_message_type = Enumeration("qmp_message_type", [ +libxl__qmp_message_type = Enumeration("qmp_message_type", [ (1, "QMP"), (2, "return"), (3, "error"), (4, "event"), (5, "invalid"), ]) + +libxl__device_kind = Enumeration("device_kind", [ + (1, "VIF"), + (2, "VBD"), + (3, "QDISK"), + (4, "PCI"), + (5, "VFB"), + (6, "VKBD"), + (7, "CONSOLE"), + ]) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 16 of 27 v3] libxl: do not remove unidentified frontend paths in libxl__devices_destroy
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 6f8ff4990c5cf5ea9b37ee07df9cc2b118a50c16 # Parent 7f1e0391462078ee1bf572722e958b2ed0e966ef libxl: do not remove unidentified frontend paths in libxl__devices_destroy Currently this appears to only include "/local/domain/<domid>/device/suspend". Ultimately the caller will nuke the whole guest directory anyway but not having this function remove things which don''t look like devices seems less surprising. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 7f1e03914620 -r 6f8ff4990c5c tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -463,8 +463,6 @@ int libxl__devices_destroy(libxl__gc *gc if (libxl__device_remove(gc, be_path) > 0) n_watches++; } - } else { - xs_rm(ctx->xsh, XBT_NULL, path); } } } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 17 of 27 v3] libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_remove_xenstore
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 5547b8593511cb37b830f6ec73f480e607f639c2 # Parent 6f8ff4990c5cf5ea9b37ee07df9cc2b118a50c16 libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_remove_xenstore Doing this allows us to use the common functions for removing devices. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 6f8ff4990c5c -r 5547b8593511 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -49,6 +49,25 @@ char *libxl__device_backend_path(libxl__ device->domid, device->devid); } +int libxl__parse_backend_path(libxl__gc *gc, + const char *path, + libxl__device *dev) +{ + /* /local/domain/<domid>/backend/<kind>/<domid>/<devid> */ + char strkind[16]; /* Longest is actually "console" */ + uint32_t domain; + int rc = sscanf(path, "/local/domain/%d/backend/%15[^/]/%d/%d", + &dev->backend_domid, + strkind, + &domain, + &dev->backend_devid); + + if (rc != 4) + return ERROR_FAIL; + + return libxl__device_kind_from_string(strkind, &dev->backend_kind); +} + int libxl__device_generic_add(libxl__gc *gc, libxl__device *device, char **bents, char **fents) { @@ -348,10 +367,11 @@ int libxl__device_disk_dev_number(const return -1; } -int libxl__device_remove(libxl__gc *gc, char *be_path) +int libxl__device_remove(libxl__gc *gc, libxl__device *dev) { libxl_ctx *ctx = libxl__gc_owner(gc); xs_transaction_t t; + char *be_path = libxl__device_backend_path(gc, dev); char *state_path = libxl__sprintf(gc, "%s/state", be_path); char *state = libxl__xs_read(gc, XBT_NULL, state_path); int rc = 0; @@ -429,10 +449,12 @@ static int wait_for_dev_destroy(libxl__g int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force) { libxl_ctx *ctx = libxl__gc_owner(gc); - char *path, *be_path, *fe_path; + char *path; unsigned int num1, num2; char **l1 = NULL, **l2 = NULL; int i, j, n_watches = 0; + libxl__device dev; + libxl__device_kind kind; path = libxl__sprintf(gc, "/local/domain/%d/device", domid); l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1); @@ -445,22 +467,25 @@ int libxl__devices_destroy(libxl__gc *gc num1 = 0; } for (i = 0; i < num1; i++) { - if (!strcmp("vfs", l1[i])) + if (libxl__device_kind_from_string(l1[i], &kind)) continue; path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]); l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2); if (!l2) continue; for (j = 0; j < num2; j++) { - fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]); - be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); - if (be_path != NULL) { + path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend", + domid, l1[i], l2[j]); + path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path)); + if (path && libxl__parse_backend_path(gc, path, &dev) == 0) { + dev.domid = domid; + dev.kind = kind; + dev.devid = atoi(l2[j]); + if (force) { - xs_rm(ctx->xsh, XBT_NULL, be_path); - xs_rm(ctx->xsh, XBT_NULL, fe_path); - libxl__device_destroy_tapdisk(gc, be_path); + libxl__device_destroy(gc, &dev); } else { - if (libxl__device_remove(gc, be_path) > 0) + if (libxl__device_remove(gc, &dev) > 0) n_watches++; } } @@ -468,14 +493,18 @@ int libxl__devices_destroy(libxl__gc *gc } /* console 0 frontend directory is not under /local/domain/<domid>/device */ - fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid); - be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); - if (be_path && strcmp(be_path, "")) { + path = libxl__sprintf(gc, "/local/domain/%d/console/backend", domid); + path = libxl__xs_read(gc, XBT_NULL, path); + if (path && strcmp(path, "") && + libxl__parse_backend_path(gc, path, &dev) == 0) { + dev.domid = domid; + dev.kind = LIBXL__DEVICE_KIND_CONSOLE; + dev.devid = 0; + if (force) { - xs_rm(ctx->xsh, XBT_NULL, be_path); - xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device_destroy(gc, &dev); } else { - if (libxl__device_remove(gc, be_path) > 0) + if (libxl__device_remove(gc, &dev) > 0) n_watches++; } } @@ -505,12 +534,9 @@ int libxl__device_del(libxl__gc *gc, lib { libxl_ctx *ctx = libxl__gc_owner(gc); struct timeval tv; - char *backend_path; int rc; - backend_path = libxl__device_backend_path(gc, dev); - - rc = libxl__device_remove(gc, backend_path); + rc = libxl__device_remove(gc, dev); if (rc == -1) { rc = ERROR_FAIL; goto out; diff -r 6f8ff4990c5c -r 5547b8593511 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 @@ -240,8 +240,10 @@ _hidden int libxl__device_generic_add(li char **bents, char **fents); _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device); _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); +_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path, + libxl__device *dev); _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev); -_hidden int libxl__device_remove(libxl__gc *gc, char *be_path); +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev); _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev); _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force); _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state); diff -r 6f8ff4990c5c -r 5547b8593511 tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 @@ -410,9 +410,15 @@ retry_transaction2: goto retry_transaction2; if (num == 1) { - char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path)); - xs_rm(ctx->xsh, XBT_NULL, be_path); - xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device dev; + if (libxl__parse_backend_path(gc, be_path, &dev) != 0) + return ERROR_FAIL; + + dev.domid = domid; + dev.kind = LIBXL__DEVICE_KIND_PCI; + dev.devid = 0; + + libxl__device_destroy(gc, &dev); return 0; } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del into libxl__device_remove
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 4020531a53fcb1a5579de3225b99a29a7619c7df # Parent 5547b8593511cb37b830f6ec73f480e607f639c2 libxl: merge libxl__device_del into libxl__device_remove Note that the "wait" parameter added to libxl_device_remove is different to the wait paramter previously used by similar functions. In the past not-wait meant forced whereas now in means wait for a graceful shutdown, as opposed to setting off a graceful shutdown but not waiting. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1075,7 +1075,7 @@ int libxl_device_disk_del(libxl_ctx *ctx device.devid = devid; device.kind = LIBXL__DEVICE_KIND_VBD; if (wait) - rc = libxl__device_del(&gc, &device); + rc = libxl__device_remove(&gc, &device, wait); else rc = libxl__device_destroy(&gc, &device); out_free: @@ -1290,7 +1290,7 @@ int libxl_device_nic_del(libxl_ctx *ctx, device.kind = LIBXL__DEVICE_KIND_VIF; if (wait) - rc = libxl__device_del(&gc, &device); + rc = libxl__device_remove(&gc, &device, wait); else rc = libxl__device_destroy(&gc, &device); diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -367,57 +367,6 @@ int libxl__device_disk_dev_number(const return -1; } -int libxl__device_remove(libxl__gc *gc, libxl__device *dev) -{ - libxl_ctx *ctx = libxl__gc_owner(gc); - xs_transaction_t t; - char *be_path = libxl__device_backend_path(gc, dev); - char *state_path = libxl__sprintf(gc, "%s/state", be_path); - char *state = libxl__xs_read(gc, XBT_NULL, state_path); - int rc = 0; - - if (!state) - goto out; - if (atoi(state) != 4) { - libxl__device_destroy_tapdisk(gc, be_path); - xs_rm(ctx->xsh, XBT_NULL, be_path); - goto out; - } - -retry_transaction: - t = xs_transaction_start(ctx->xsh); - xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0")); - xs_write(ctx->xsh, t, state_path, "5", strlen("5")); - if (!xs_transaction_end(ctx->xsh, t, 0)) { - if (errno == EAGAIN) - goto retry_transaction; - else { - rc = -1; - goto out; - } - } - - xs_watch(ctx->xsh, state_path, be_path); - libxl__device_destroy_tapdisk(gc, be_path); - rc = 1; -out: - return rc; -} - -int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) -{ - libxl_ctx *ctx = libxl__gc_owner(gc); - char *be_path = libxl__device_backend_path(gc, dev); - char *fe_path = libxl__device_frontend_path(gc, dev); - - xs_rm(ctx->xsh, XBT_NULL, be_path); - xs_rm(ctx->xsh, XBT_NULL, fe_path); - - libxl__device_destroy_tapdisk(gc, be_path); - - return 0; -} - static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv) { libxl_ctx *ctx = libxl__gc_owner(gc); @@ -446,6 +395,71 @@ static int wait_for_dev_destroy(libxl__g return rc; } +/* + * Returns 0 (device already destroyed) or 1 (caller must + * wait_for_dev_destroy) on success, ERROR_* on fail. + */ +int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + xs_transaction_t t; + char *be_path = libxl__device_backend_path(gc, dev); + char *state_path = libxl__sprintf(gc, "%s/state", be_path); + char *state = libxl__xs_read(gc, XBT_NULL, state_path); + int rc = 0; + + if (!state) + goto out; + if (atoi(state) != 4) { + libxl__device_destroy_tapdisk(gc, be_path); + xs_rm(ctx->xsh, XBT_NULL, be_path); + goto out; + } + +retry_transaction: + t = xs_transaction_start(ctx->xsh); + xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0")); + xs_write(ctx->xsh, t, state_path, "5", strlen("5")); + if (!xs_transaction_end(ctx->xsh, t, 0)) { + if (errno == EAGAIN) + goto retry_transaction; + else { + rc = ERROR_FAIL; + goto out; + } + } + + xs_watch(ctx->xsh, state_path, be_path); + libxl__device_destroy_tapdisk(gc, be_path); + + if (wait) { + struct timeval tv; + tv.tv_sec = LIBXL_DESTROY_TIMEOUT; + tv.tv_usec = 0; + (void)wait_for_dev_destroy(gc, &tv); + xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev)); + } else { + rc = 1; /* Caller must wait_for_dev_destroy */ + } + +out: + return rc; +} + +int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + char *be_path = libxl__device_backend_path(gc, dev); + char *fe_path = libxl__device_frontend_path(gc, dev); + + xs_rm(ctx->xsh, XBT_NULL, be_path); + xs_rm(ctx->xsh, XBT_NULL, fe_path); + + libxl__device_destroy_tapdisk(gc, be_path); + + return 0; +} + int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force) { libxl_ctx *ctx = libxl__gc_owner(gc); @@ -485,8 +499,12 @@ int libxl__devices_destroy(libxl__gc *gc if (force) { libxl__device_destroy(gc, &dev); } else { - if (libxl__device_remove(gc, &dev) > 0) - n_watches++; + int rc = libxl__device_remove(gc, &dev, 0); + if (rc < 0) + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, + "cannot remove device %s\n", path); + else + n_watches += rc; } } } @@ -504,8 +522,12 @@ int libxl__devices_destroy(libxl__gc *gc if (force) { libxl__device_destroy(gc, &dev); } else { - if (libxl__device_remove(gc, &dev) > 0) - n_watches++; + int rc = libxl__device_remove(gc, &dev, 0); + if (rc < 0) + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, + "cannot remove device %s\n", path); + else + n_watches += rc; } } @@ -530,29 +552,6 @@ out: return 0; } -int libxl__device_del(libxl__gc *gc, libxl__device *dev) -{ - libxl_ctx *ctx = libxl__gc_owner(gc); - struct timeval tv; - int rc; - - rc = libxl__device_remove(gc, dev); - if (rc == -1) { - rc = ERROR_FAIL; - goto out; - } - - tv.tv_sec = LIBXL_DESTROY_TIMEOUT; - tv.tv_usec = 0; - (void)wait_for_dev_destroy(gc, &tv); - - xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev)); - rc = 0; - -out: - return rc; -} - int libxl__wait_for_device_model(libxl__gc *gc, uint32_t domid, char *state, libxl__spawn_starting *spawning, diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 @@ -242,8 +242,7 @@ _hidden char *libxl__device_backend_path _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); _hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path, libxl__device *dev); -_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev); -_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev); +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait); _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev); _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force); _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 19 of 27 v3] libxl: use more descriptive variable names in libxl__devices_destroy
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 26ef64a0ff194c7df3a5f488c1232f6041c6fc02 # Parent 4020531a53fcb1a5579de3225b99a29a7619c7df libxl: use more descriptive variable names in libxl__devices_destroy. It''s not immediately clear that "l1" iterates over device types and "l2" iterates over individual devices. Name things in a way which makes this more obvious. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 4020531a53fc -r 26ef64a0ff19 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -464,37 +464,38 @@ int libxl__devices_destroy(libxl__gc *gc { libxl_ctx *ctx = libxl__gc_owner(gc); char *path; - unsigned int num1, num2; - char **l1 = NULL, **l2 = NULL; + unsigned int num_kinds, num_devs; + char **kinds = NULL, **devs = NULL; int i, j, n_watches = 0; libxl__device dev; libxl__device_kind kind; path = libxl__sprintf(gc, "/local/domain/%d/device", domid); - l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1); - if (!l1) { + kinds = libxl__xs_directory(gc, XBT_NULL, path, &num_kinds); + if (!kinds) { if (errno != ENOENT) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unable to get xenstore" " device listing %s", path); goto out; } - num1 = 0; + num_kinds = 0; } - for (i = 0; i < num1; i++) { - if (libxl__device_kind_from_string(l1[i], &kind)) + for (i = 0; i < num_kinds; i++) { + if (libxl__device_kind_from_string(kinds[i], &kind)) continue; - path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]); - l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2); - if (!l2) + + path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, kinds[i]); + devs = libxl__xs_directory(gc, XBT_NULL, path, &num_devs); + if (!devs) continue; - for (j = 0; j < num2; j++) { + for (j = 0; j < num_devs; j++) { path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend", - domid, l1[i], l2[j]); + domid, kinds[i], devs[j]); path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path)); if (path && libxl__parse_backend_path(gc, path, &dev) == 0) { dev.domid = domid; dev.kind = kind; - dev.devid = atoi(l2[j]); + dev.devid = atoi(devs[j]); if (force) { libxl__device_destroy(gc, &dev); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 20 of 27 v3] libxl: convert disk handling to device API
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID c245f495b53be00648e2bae4911675142e72e9c8 # Parent 26ef64a0ff194c7df3a5f488c1232f6041c6fc02 libxl: convert disk handling to device API Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -916,13 +916,58 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, /******************************************************************************/ +int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk) +{ + memset(disk, 0x00, sizeof(libxl_device_disk)); + return 0; +} + +static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid, + libxl_device_disk *disk, + libxl__device *device) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + int devid; + + devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); + if (devid==-1) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported" + " virtual disk identifier %s", disk->vdev); + return ERROR_INVAL; + } + + device->backend_domid = disk->backend_domid; + device->backend_devid = devid; + + switch (disk->backend) { + case LIBXL_DISK_BACKEND_PHY: + device->backend_kind = LIBXL__DEVICE_KIND_VBD; + break; + case LIBXL_DISK_BACKEND_TAP: + device->backend_kind = LIBXL__DEVICE_KIND_VBD; + break; + case LIBXL_DISK_BACKEND_QDISK: + device->backend_kind = LIBXL__DEVICE_KIND_QDISK; + break; + default: + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", + disk->backend); + return ERROR_INVAL; + } + + device->domid = domid; + device->devid = devid; + device->kind = LIBXL__DEVICE_KIND_VBD; + + return 0; +} + int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk) { libxl__gc gc = LIBXL_INIT_GC(ctx); flexarray_t *front; flexarray_t *back; char *dev; - int devid; libxl__device device; int major, minor, rc; @@ -950,20 +995,13 @@ int libxl_device_disk_add(libxl_ctx *ctx goto out_free; } - devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); - if (devid==-1) { + rc = libxl__device_from_disk(&gc, domid, disk, &device); + if (rc != 0) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported" " virtual disk identifier %s", disk->vdev); - rc = ERROR_INVAL; goto out_free; } - device.backend_devid = devid; - device.backend_domid = disk->backend_domid; - device.devid = devid; - device.domid = domid; - device.kind = LIBXL__DEVICE_KIND_VBD; - switch (disk->backend) { case LIBXL_DISK_BACKEND_PHY: dev = disk->pdev_path; @@ -975,7 +1013,7 @@ int libxl_device_disk_add(libxl_ctx *ctx flexarray_append(back, "params"); flexarray_append(back, dev); - device.backend_kind = LIBXL__DEVICE_KIND_VBD; + assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD); break; case LIBXL_DISK_BACKEND_TAP: dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format); @@ -994,7 +1032,7 @@ int libxl_device_disk_add(libxl_ctx *ctx flexarray_append(back, "params"); flexarray_append(back, libxl__sprintf(&gc, "%s:%s", libxl__device_disk_string_of_format(disk->format), disk->pdev_path)); - device.backend_kind = LIBXL__DEVICE_KIND_QDISK; + assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK); break; default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend); @@ -1026,7 +1064,7 @@ int libxl_device_disk_add(libxl_ctx *ctx flexarray_append(front, "state"); flexarray_append(front, libxl__sprintf(&gc, "%d", 1)); flexarray_append(front, "virtual-device"); - flexarray_append(front, libxl__sprintf(&gc, "%d", devid)); + flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid)); flexarray_append(front, "device-type"); flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk"); @@ -1044,45 +1082,37 @@ out: return rc; } -int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, - libxl_device_disk *disk, int wait) +int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid, + libxl_device_disk *disk) { libxl__gc gc = LIBXL_INIT_GC(ctx); libxl__device device; - int devid, rc; - - devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); - device.backend_domid = disk->backend_domid; - device.backend_devid = devid; - - switch (disk->backend) { - case LIBXL_DISK_BACKEND_PHY: - device.backend_kind = LIBXL__DEVICE_KIND_VBD; - break; - case LIBXL_DISK_BACKEND_TAP: - device.backend_kind = LIBXL__DEVICE_KIND_VBD; - break; - case LIBXL_DISK_BACKEND_QDISK: - device.backend_kind = LIBXL__DEVICE_KIND_QDISK; - break; - default: - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", - disk->backend); - rc = ERROR_INVAL; - goto out_free; - } - device.domid = domid; - device.devid = devid; - device.kind = LIBXL__DEVICE_KIND_VBD; - if (wait) - rc = libxl__device_remove(&gc, &device, wait); - else - rc = libxl__device_destroy(&gc, &device); -out_free: + int rc; + + rc = libxl__device_from_disk(&gc, domid, disk, &device); + if (rc != 0) goto out; + + rc = libxl__device_remove(&gc, &device, 1); +out: libxl__free_all(&gc); return rc; } +int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_disk *disk) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl__device device; + int rc; + + rc = libxl__device_from_disk(&gc, domid, disk, &device); + if (rc != 0) goto out; + + rc = libxl__device_destroy(&gc, &device); +out: + libxl__free_all(&gc); + return rc; +} char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk) { libxl__gc gc = LIBXL_INIT_GC(ctx); @@ -1626,7 +1656,7 @@ static void libxl__device_disk_from_xs_b unsigned int len; char *tmp; - memset(disk, 0, sizeof(*disk)); + libxl_device_disk_init(ctx, disk); tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/params", be_path), &len); @@ -1670,7 +1700,8 @@ int libxl_devid_to_device_disk(libxl_ctx char *dompath, *path; int rc = ERROR_FAIL; - memset(disk, 0, sizeof (libxl_device_disk)); + libxl_device_disk_init(ctx, disk); + dompath = libxl__xs_get_dompath(&gc, domid); if (!dompath) { goto out; @@ -1812,11 +1843,11 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u ret = 0; - libxl_device_disk_del(ctx, domid, disks + i, 1); + libxl_device_disk_remove(ctx, domid, disks + i); libxl_device_disk_add(ctx, domid, disk); stubdomid = libxl_get_stubdom_id(ctx, domid); if (stubdomid) { - libxl_device_disk_del(ctx, stubdomid, disks + i, 1); + libxl_device_disk_remove(ctx, stubdomid, disks + i); libxl_device_disk_add(ctx, stubdomid, disk); } out: diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100 @@ -438,15 +438,27 @@ libxl_vminfo * libxl_list_vm(libxl_ctx * * This function does not interact with the guest and therefore * cannot block on the guest. */ + +/* Disks */ +int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk); int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); -int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, int wait); +int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); +int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_disk *disk); + libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num); int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, libxl_diskinfo *diskinfo); + +/* + * Insert a CD-ROM device. A device corresponding to disk must already + * be attached to the guest. + */ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); /* - * Make a disk available in this domain. Returns path to a device. + * Make a disk available in this (the control) domain. Returns path to + * a device. */ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk); int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk); diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100 @@ -494,7 +494,7 @@ static void parse_disk_config_multistrin { int e; - memset(disk, 0, sizeof(*disk)); + libxl_device_disk_init(ctx, disk); if (!*config) { *config = xlu_cfg_init(stderr, "command line"); @@ -1893,6 +1893,8 @@ static void cd_insert(const char *dom, c disk.backend_domid = 0; libxl_cdrom_insert(ctx, domid, &disk); + + libxl_device_disk_dispose(&disk); free(buf); } @@ -4182,8 +4184,8 @@ int main_blockdetach(int argc, char **ar fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]); return 1; } - if (libxl_device_disk_del(ctx, domid, &disk, 1)) { - fprintf(stderr, "libxl_device_disk_del failed.\n"); + if (libxl_device_disk_remove(ctx, domid, &disk)) { + fprintf(stderr, "libxl_device_disk_remove failed.\n"); } return 0; } diff -r 26ef64a0ff19 -r c245f495b53b tools/ocaml/libs/xl/genwrap.py --- a/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:42 2011 +0100 @@ -16,6 +16,11 @@ builtins = { "libxl_hwcap": ("int32 array", None, "Val_hwcap(&%(c)s)"), } +DEVICE_FUNCTIONS = [ ("add", ["t", "domid", "unit"]), + ("remove", ["t", "domid", "unit"]), + ("destroy", ["t", "domid", "unit"]), + ] + functions = { # ( name , [type1,type2,....] ) "device_vfb": [ ("add", ["t", "domid", "unit"]), ("clean_shutdown", ["domid", "unit"]), @@ -27,9 +32,7 @@ functions = { # ( name , [type1,type2,.. ], "device_console": [ ("add", ["t", "domid", "unit"]), ], - "device_disk": [ ("add", ["t", "domid", "unit"]), - ("del", ["t", "domid", "unit"]), - ], + "device_disk": DEVICE_FUNCTIONS, "device_nic": [ ("add", ["t", "domid", "unit"]), ("del", ["t", "domid", "unit"]), ], diff -r 26ef64a0ff19 -r c245f495b53b tools/ocaml/libs/xl/xenlight_stubs.c --- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:42 2011 +0100 @@ -247,7 +247,7 @@ value stub_xl_device_disk_del(value info device_disk_val(&gc, &lg, &c_info, info); INIT_CTX(); - ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0); + ret = libxl_device_disk_remove(ctx, Int_val(domid), &c_info); if (ret != 0) failwith_xl("disk_del", &lg); FREE_CTX(); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 21 of 27 v3] libxl: convert NIC handling to device API
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941402 -3600 # Node ID 576b80340b0e92360792399d67aa26002b2771fc # Parent c245f495b53be00648e2bae4911675142e72e9c8 libxl: convert NIC handling to device API Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r c245f495b53b -r 576b80340b0e tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1187,32 +1187,46 @@ int libxl_device_disk_local_detach(libxl } /******************************************************************************/ -int libxl_device_nic_init(libxl_device_nic *nic_info, int devnum) +int libxl_device_nic_init(libxl_ctx *ctx, libxl_device_nic *nic) { const uint8_t *r; libxl_uuid uuid; libxl_uuid_generate(&uuid); r = libxl_uuid_bytearray(&uuid); - memset(nic_info, ''\0'', sizeof(*nic_info)); - - nic_info->backend_domid = 0; - nic_info->devid = devnum; - nic_info->mtu = 1492; - nic_info->model = strdup("rtl8139"); - nic_info->mac[0] = 0x00; - nic_info->mac[1] = 0x16; - nic_info->mac[2] = 0x3e; - nic_info->mac[3] = r[0] & 0x7f; - nic_info->mac[4] = r[1]; - nic_info->mac[5] = r[2]; - nic_info->ifname = NULL; - nic_info->bridge = strdup("xenbr0"); - nic_info->ip = NULL; - if ( asprintf(&nic_info->script, "%s/vif-bridge", + memset(nic, ''\0'', sizeof(*nic)); + + nic->backend_domid = 0; + nic->devid = -1; + nic->mtu = 1492; + nic->model = strdup("rtl8139"); + nic->mac[0] = 0x00; + nic->mac[1] = 0x16; + nic->mac[2] = 0x3e; + nic->mac[3] = r[0] & 0x7f; + nic->mac[4] = r[1]; + nic->mac[5] = r[2]; + nic->ifname = NULL; + nic->bridge = strdup("xenbr0"); + nic->ip = NULL; + if ( asprintf(&nic->script, "%s/vif-bridge", libxl_xen_script_dir_path()) < 0 ) return ERROR_FAIL; - nic_info->nictype = LIBXL_NIC_TYPE_IOEMU; + nic->nictype = LIBXL_NIC_TYPE_IOEMU; + return 0; +} + +static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid, + libxl_device_nic *nic, + libxl__device *device) +{ + device->backend_devid = nic->devid; + device->backend_domid = nic->backend_domid; + device->backend_kind = LIBXL__DEVICE_KIND_VIF; + device->devid = nic->devid; + device->domid = domid; + device->kind = LIBXL__DEVICE_KIND_VIF; + return 0; } @@ -1249,12 +1263,8 @@ int libxl_device_nic_add(libxl_ctx *ctx, } } - device.backend_devid = nic->devid; - device.backend_domid = nic->backend_domid; - device.backend_kind = LIBXL__DEVICE_KIND_VIF; - device.devid = nic->devid; - device.domid = domid; - device.kind = LIBXL__DEVICE_KIND_VIF; + rc = libxl__device_from_nic(&gc, domid, nic, &device); + if ( rc != 0 ) goto out_free; flexarray_append(back, "frontend-id"); flexarray_append(back, libxl__sprintf(&gc, "%d", domid)); @@ -1305,29 +1315,37 @@ out: return rc; } -int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, - libxl_device_nic *nic, int wait) +int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid, + libxl_device_nic *nic) { libxl__gc gc = LIBXL_INIT_GC(ctx); libxl__device device; int rc; - device.backend_devid = nic->devid; - device.backend_domid = nic->backend_domid; - device.backend_kind = LIBXL__DEVICE_KIND_VIF; - device.devid = nic->devid; - device.domid = domid; - device.kind = LIBXL__DEVICE_KIND_VIF; - - if (wait) - rc = libxl__device_remove(&gc, &device, wait); - else - rc = libxl__device_destroy(&gc, &device); - + rc = libxl__device_from_nic(&gc, domid, nic, &device); + if (rc != 0) goto out; + + rc = libxl__device_remove(&gc, &device, 1); +out: libxl__free_all(&gc); return rc; } +int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_nic *nic) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl__device device; + int rc; + + rc = libxl__device_from_nic(&gc, domid, nic, &device); + if (rc != 0) goto out; + + rc = libxl__device_destroy(&gc, &device); +out: + libxl__free_all(&gc); + return rc; +} static void libxl__device_nic_from_xs_be(libxl__gc *gc, const char *be_path, libxl_device_nic *nic) diff -r c245f495b53b -r 576b80340b0e tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100 @@ -463,9 +463,12 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk); int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk); -int libxl_device_nic_init(libxl_device_nic *nic, int dev_num); +/* Network Interfaces */ +int libxl_device_nic_init(libxl_ctx *ctx, libxl_device_nic *nic); int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic); -int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, int wait); +int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic); +int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic); + libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num); int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, libxl_nicinfo *nicinfo); diff -r c245f495b53b -r 576b80340b0e tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:42 2011 +0100 @@ -762,7 +762,8 @@ static void parse_config_data(const char d_config->vifs = (libxl_device_nic *) realloc(d_config->vifs, sizeof (libxl_device_nic) * (d_config->num_vifs+1)); nic = d_config->vifs + d_config->num_vifs; - CHK_ERRNO( libxl_device_nic_init(nic, d_config->num_vifs) ); + CHK_ERRNO( libxl_device_nic_init(ctx, nic) ); + nic->devid = d_config->num_vifs; if (default_vifscript) { free(nic->script); @@ -3972,7 +3973,7 @@ int main_networkattach(int argc, char ** fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]); return 1; } - libxl_device_nic_init(&nic, -1); + libxl_device_nic_init(ctx, &nic); for (argv += optind+1, argc -= optind+1; argc > 0; ++argv, --argc) { if (MATCH_OPTION("type", *argv, oparg)) { if (!strcmp("vif", oparg)) { @@ -4089,7 +4090,7 @@ int main_networkdetach(int argc, char ** return 1; } } - if (libxl_device_nic_del(ctx, domid, &nic, 1)) { + if (libxl_device_nic_remove(ctx, domid, &nic)) { fprintf(stderr, "libxl_device_nic_del failed.\n"); return 1; } diff -r c245f495b53b -r 576b80340b0e tools/ocaml/libs/xl/genwrap.py --- a/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:42 2011 +0100 @@ -33,9 +33,7 @@ functions = { # ( name , [type1,type2,.. "device_console": [ ("add", ["t", "domid", "unit"]), ], "device_disk": DEVICE_FUNCTIONS, - "device_nic": [ ("add", ["t", "domid", "unit"]), - ("del", ["t", "domid", "unit"]), - ], + "device_nic": DEVICE_FUNCTIONS, "device_pci": [ ("add", ["t", "domid", "unit"]), ("remove", ["t", "domid", "unit"]), ("shutdown", ["domid", "unit"]), diff -r c245f495b53b -r 576b80340b0e tools/ocaml/libs/xl/xenlight_stubs.c --- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:42 2011 +0100 @@ -281,7 +281,7 @@ value stub_xl_device_nic_del(value info, device_nic_val(&gc, &lg, &c_info, info); INIT_CTX(); - ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0); + ret = libxl_device_nic_remove(ctx, Int_val(domid), &c_info); if (ret != 0) failwith_xl("nic_del", &lg); FREE_CTX(); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 22 of 27 v3] libxl: remove libxl_device_console_add
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941403 -3600 # Node ID c8eab687999d2927a0a4581a6bf09deeadcbff13 # Parent 576b80340b0e92360792399d67aa26002b2771fc libxl: remove libxl_device_console_add. It has no callers, the only code which adds consoles in internal to libxl and uses libxl__device_console_add directly. Rather than worrying about what the public API should look like in this case simply remove it, adding new APIs is much easier than fixing broken ones... Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 576b80340b0e -r c8eab687999d tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 @@ -1585,18 +1585,6 @@ out: return rc; } -int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, - libxl_device_console *console) -{ - libxl__gc gc = LIBXL_INIT_GC(ctx); - int rc = ERROR_INVAL; - - rc = libxl__device_console_add(&gc, domid, console, NULL); - - libxl__free_all(&gc); - return rc; -} - /******************************************************************************/ void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num) { diff -r 576b80340b0e -r c8eab687999d tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 @@ -473,8 +473,6 @@ libxl_device_nic *libxl_device_nic_list( int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, libxl_nicinfo *nicinfo); -int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console); - void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num); int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid); diff -r 576b80340b0e -r c8eab687999d tools/ocaml/libs/xl/genwrap.py --- a/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:43 2011 +0100 @@ -30,8 +30,6 @@ functions = { # ( name , [type1,type2,.. ("clean_shutdown", ["domid", "unit"]), ("hard_shutdown", ["domid", "unit"]), ], - "device_console": [ ("add", ["t", "domid", "unit"]), - ], "device_disk": DEVICE_FUNCTIONS, "device_nic": DEVICE_FUNCTIONS, "device_pci": [ ("add", ["t", "domid", "unit"]), diff -r 576b80340b0e -r c8eab687999d tools/ocaml/libs/xl/xenlight_stubs.c --- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 @@ -288,23 +288,6 @@ value stub_xl_device_nic_del(value info, CAMLreturn(Val_unit); } -value stub_xl_device_console_add(value info, value domid) -{ - CAMLparam2(info, domid); - libxl_device_console c_info; - int ret; - INIT_STRUCT(); - - device_console_val(&gc, &lg, &c_info, info); - - INIT_CTX(); - ret = libxl_device_console_add(ctx, Int_val(domid), &c_info); - if (ret != 0) - failwith_xl("console_add", &lg); - FREE_CTX(); - CAMLreturn(Val_unit); -} - value stub_xl_device_vkb_add(value info, value domid) { CAMLparam2(info, domid); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 23 of 27 v3] libxl: convert VKB handling to device API
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941403 -3600 # Node ID 1d28ba74b379c5ebe38b503f8f0dd06c5708b83c # Parent c8eab687999d2927a0a4581a6bf09deeadcbff13 libxl: convert VKB handling to device API Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r c8eab687999d -r 1d28ba74b379 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 @@ -1586,10 +1586,24 @@ out: } /******************************************************************************/ -void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num) +int libxl_device_vkb_init(libxl_ctx *ctx, libxl_device_vkb *vkb) { memset(vkb, 0x00, sizeof(libxl_device_vkb)); - vkb->devid = dev_num; + return 0; +} + +static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid, + libxl_device_vkb *vkb, + libxl__device *device) +{ + device->backend_devid = vkb->devid; + device->backend_domid = vkb->backend_domid; + device->backend_kind = LIBXL__DEVICE_KIND_VKBD; + device->devid = vkb->devid; + device->domid = domid; + device->kind = LIBXL__DEVICE_KIND_VKBD; + + return 0; } int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb) @@ -1611,12 +1625,8 @@ int libxl_device_vkb_add(libxl_ctx *ctx, goto out_free; } - device.backend_devid = vkb->devid; - device.backend_domid = vkb->backend_domid; - device.backend_kind = LIBXL__DEVICE_KIND_VKBD; - device.devid = vkb->devid; - device.domid = domid; - device.kind = LIBXL__DEVICE_KIND_VKBD; + rc = libxl__device_from_vkb(&gc, domid, vkb, &device); + if (rc != 0) goto out_free; flexarray_append(back, "frontend-id"); flexarray_append(back, libxl__sprintf(&gc, "%d", domid)); @@ -1644,14 +1654,36 @@ out: return rc; } -int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid) +int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, + libxl_device_vkb *vkb) { - return ERROR_NI; + libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl__device device; + int rc; + + rc = libxl__device_from_vkb(&gc, domid, vkb, &device); + if (rc != 0) goto out; + + rc = libxl__device_remove(&gc, &device, 1); +out: + libxl__free_all(&gc); + return rc; } -int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid) +int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_vkb *vkb) { - return ERROR_NI; + libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl__device device; + int rc; + + rc = libxl__device_from_vkb(&gc, domid, vkb, &device); + if (rc != 0) goto out; + + rc = libxl__device_destroy(&gc, &device); +out: + libxl__free_all(&gc); + return rc; } static void libxl__device_disk_from_xs_be(libxl__gc *gc, @@ -1939,16 +1971,6 @@ out: return rc; } -int libxl_device_vfb_clean_shutdown(libxl_ctx *ctx, uint32_t domid) -{ - return ERROR_NI; -} - -int libxl_device_vfb_hard_shutdown(libxl_ctx *ctx, uint32_t domid) -{ - return ERROR_NI; -} - /******************************************************************************/ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb) diff -r c8eab687999d -r 1d28ba74b379 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 @@ -473,10 +473,11 @@ libxl_device_nic *libxl_device_nic_list( int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, libxl_nicinfo *nicinfo); -void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num); +/* Keyboard */ +int libxl_device_vkb_init(libxl_ctx *ctx, libxl_device_vkb *vkb); int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); -int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid); -int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid); +int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); +int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num); int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); diff -r c8eab687999d -r 1d28ba74b379 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:43 2011 +0100 @@ -857,7 +857,8 @@ skip: d_config->vkbs = (libxl_device_vkb *) realloc(d_config->vkbs, sizeof(libxl_device_vkb) * (d_config->num_vkbs + 1)); vkb = d_config->vkbs + d_config->num_vkbs; - libxl_device_vkb_init(vkb, d_config->num_vkbs); + libxl_device_vkb_init(ctx, vkb); + vkb->devid = d_config->num_vkbs; p = strtok(buf2, ","); if (!p) diff -r c8eab687999d -r 1d28ba74b379 tools/ocaml/libs/xl/genwrap.py --- a/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:43 2011 +0100 @@ -26,10 +26,7 @@ functions = { # ( name , [type1,type2,.. ("clean_shutdown", ["domid", "unit"]), ("hard_shutdown", ["domid", "unit"]), ], - "device_vkb": [ ("add", ["t", "domid", "unit"]), - ("clean_shutdown", ["domid", "unit"]), - ("hard_shutdown", ["domid", "unit"]), - ], + "device_vkb": DEVICE_FUNCTIONS, "device_disk": DEVICE_FUNCTIONS, "device_nic": DEVICE_FUNCTIONS, "device_pci": [ ("add", ["t", "domid", "unit"]), diff -r c8eab687999d -r 1d28ba74b379 tools/ocaml/libs/xl/xenlight_stubs.c --- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 @@ -306,14 +306,17 @@ value stub_xl_device_vkb_add(value info, CAMLreturn(Val_unit); } -value stub_xl_device_vkb_clean_shutdown(value domid) +value stub_xl_device_vkb_remove(value info, value domid) { CAMLparam1(domid); + libxl_device_vkb c_info; int ret; INIT_STRUCT(); + device_vkb_val(&gc, &lg, &c_info, info); + INIT_CTX(); - ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid)); + ret = libxl_device_vkb_remove(ctx, Int_val(domid), &c_info); if (ret != 0) failwith_xl("vkb_clean_shutdown", &lg); FREE_CTX(); @@ -321,14 +324,17 @@ value stub_xl_device_vkb_clean_shutdown( CAMLreturn(Val_unit); } -value stub_xl_device_vkb_hard_shutdown(value domid) +value stub_xl_device_vkb_destroy(value info, value domid) { CAMLparam1(domid); + libxl_device_vkb c_info; int ret; INIT_STRUCT(); + device_vkb_val(&gc, &lg, &c_info, info); + INIT_CTX(); - ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid)); + ret = libxl_device_vkb_destroy(ctx, Int_val(domid), &c_info); if (ret != 0) failwith_xl("vkb_hard_shutdown", &lg); FREE_CTX(); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 24 of 27 v3] libxl: convert VFB handling to device API
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941403 -3600 # Node ID e619238cec59fd1439af86043fcdfc2d63f5ab10 # Parent 1d28ba74b379c5ebe38b503f8f0dd06c5708b83c libxl: convert VFB handling to device API Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 1d28ba74b379 -r e619238cec59 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 @@ -1896,10 +1896,9 @@ out: } /******************************************************************************/ -void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num) +int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb) { memset(vfb, 0x00, sizeof(libxl_device_vfb)); - vfb->devid = dev_num; vfb->display = NULL; vfb->xauthority = NULL; vfb->vnc = 1; @@ -1910,6 +1909,20 @@ void libxl_device_vfb_init(libxl_device_ vfb->keymap = NULL; vfb->sdl = 0; vfb->opengl = 0; + return 0; +} + +static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid, + libxl_device_vfb *vfb, + libxl__device *device) +{ + device->backend_devid = vfb->devid; + device->backend_domid = vfb->backend_domid; + device->backend_kind = LIBXL__DEVICE_KIND_VFB; + device->devid = vfb->devid; + device->domid = domid; + device->kind = LIBXL__DEVICE_KIND_VFB; + return 0; } int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb) @@ -1931,12 +1944,8 @@ int libxl_device_vfb_add(libxl_ctx *ctx, goto out_free; } - device.backend_devid = vfb->devid; - device.backend_domid = vfb->backend_domid; - device.backend_kind = LIBXL__DEVICE_KIND_VFB; - device.devid = vfb->devid; - device.domid = domid; - device.kind = LIBXL__DEVICE_KIND_VFB; + rc = libxl__device_from_vfb(&gc, domid, vfb, &device); + if (rc != 0) goto out_free; flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid)); flexarray_append_pair(back, "online", "1"); @@ -1971,6 +1980,38 @@ out: return rc; } +int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, + libxl_device_vfb *vfb) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl__device device; + int rc; + + rc = libxl__device_from_vfb(&gc, domid, vfb, &device); + if (rc != 0) goto out; + + rc = libxl__device_remove(&gc, &device, 1); +out: + libxl__free_all(&gc); + return rc; +} + +int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_vfb *vfb) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl__device device; + int rc; + + rc = libxl__device_from_vfb(&gc, domid, vfb, &device); + if (rc != 0) goto out; + + rc = libxl__device_destroy(&gc, &device); +out: + libxl__free_all(&gc); + return rc; +} + /******************************************************************************/ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb) diff -r 1d28ba74b379 -r e619238cec59 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 @@ -479,10 +479,11 @@ int libxl_device_vkb_add(libxl_ctx *ctx, int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); -void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num); +/* Framebuffer */ +int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb); int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); -int libxl_device_vfb_clean_shutdown(libxl_ctx *ctx, uint32_t domid); -int libxl_device_vfb_hard_shutdown(libxl_ctx *ctx, uint32_t domid); +int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); +int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int force); diff -r 1d28ba74b379 -r e619238cec59 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:43 2011 +0100 @@ -853,7 +853,8 @@ skip: d_config->vfbs = (libxl_device_vfb *) realloc(d_config->vfbs, sizeof(libxl_device_vfb) * (d_config->num_vfbs + 1)); vfb = d_config->vfbs + d_config->num_vfbs; - libxl_device_vfb_init(vfb, d_config->num_vfbs); + libxl_device_vfb_init(ctx, vfb); + vfb->devid = d_config->num_vfbs; d_config->vkbs = (libxl_device_vkb *) realloc(d_config->vkbs, sizeof(libxl_device_vkb) * (d_config->num_vkbs + 1)); vkb = d_config->vkbs + d_config->num_vkbs; diff -r 1d28ba74b379 -r e619238cec59 tools/ocaml/libs/xl/genwrap.py --- a/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:43 2011 +0100 @@ -22,10 +22,7 @@ DEVICE_FUNCTIONS = [ ("add", ] functions = { # ( name , [type1,type2,....] ) - "device_vfb": [ ("add", ["t", "domid", "unit"]), - ("clean_shutdown", ["domid", "unit"]), - ("hard_shutdown", ["domid", "unit"]), - ], + "device_vfb": DEVICE_FUNCTIONS, "device_vkb": DEVICE_FUNCTIONS, "device_disk": DEVICE_FUNCTIONS, "device_nic": DEVICE_FUNCTIONS, diff -r 1d28ba74b379 -r e619238cec59 tools/ocaml/libs/xl/xenlight_stubs.c --- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 @@ -360,14 +360,17 @@ value stub_xl_device_vfb_add(value info, CAMLreturn(Val_unit); } -value stub_xl_device_vfb_clean_shutdown(value domid) +value stub_xl_device_vfb_remove(value info, value domid) { CAMLparam1(domid); + libxl_device_vfb c_info; int ret; INIT_STRUCT(); + device_vfb_val(&gc, &lg, &c_info, info); + INIT_CTX(); - ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid)); + ret = libxl_device_vfb_remove(ctx, Int_val(domid), &c_info); if (ret != 0) failwith_xl("vfb_clean_shutdown", &lg); FREE_CTX(); @@ -375,14 +378,17 @@ value stub_xl_device_vfb_clean_shutdown( CAMLreturn(Val_unit); } -value stub_xl_device_vfb_hard_shutdown(value domid) +value stub_xl_device_vfb_destroy(value info, value domid) { CAMLparam1(domid); + libxl_device_vfb c_info; int ret; INIT_STRUCT(); + device_vfb_val(&gc, &lg, &c_info, info); + INIT_CTX(); - ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid)); + ret = libxl_device_vfb_destroy(ctx, Int_val(domid), &c_info); if (ret != 0) failwith_xl("vfb_hard_shutdown", &lg); FREE_CTX(); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 25 of 27 v3] libxl: reorder device functions to put functions for each device together
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941403 -3600 # Node ID 9a75cc1499dacfd7fc8c1430d77a14f218cd6206 # Parent e619238cec59fd1439af86043fcdfc2d63f5ab10 libxl: reorder device functions to put functions for each device together. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r e619238cec59 -r 9a75cc1499da tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 @@ -1113,6 +1113,216 @@ out: libxl__free_all(&gc); return rc; } + +static void libxl__device_disk_from_xs_be(libxl__gc *gc, + const char *be_path, + libxl_device_disk *disk) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + unsigned int len; + char *tmp; + + libxl_device_disk_init(ctx, disk); + + tmp = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/params", be_path), &len); + if (tmp && strchr(tmp, '':'')) { + disk->pdev_path = strdup(strchr(tmp, '':'') + 1); + free(tmp); + } else { + disk->pdev_path = tmp; + } + libxl_string_to_backend(ctx, + libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/type", be_path)), + &(disk->backend)); + disk->vdev = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(gc, "%s/dev", be_path), &len); + tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf + (gc, "%s/removable", be_path)); + + if (tmp) + disk->removable = atoi(tmp); + else + disk->removable = 0; + + tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path)); + if (!strcmp(tmp, "w")) + disk->readwrite = 1; + else + disk->readwrite = 0; + + tmp = libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/device-type", be_path)); + disk->is_cdrom = !strcmp(tmp, "cdrom"); + + disk->format = LIBXL_DISK_FORMAT_UNKNOWN; +} + +int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, + int devid, libxl_device_disk *disk) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + char *dompath, *path; + int rc = ERROR_FAIL; + + libxl_device_disk_init(ctx, disk); + + dompath = libxl__xs_get_dompath(&gc, domid); + if (!dompath) { + goto out; + } + path = libxl__xs_read(&gc, XBT_NULL, + libxl__sprintf(&gc, "%s/device/vbd/%d/backend", + dompath, devid)); + if (!path) + goto out; + + libxl__device_disk_from_xs_be(&gc, path, disk); + + rc = 0; +out: + libxl__free_all(&gc); + return rc; +} + + +static int libxl__append_disk_list_of_type(libxl__gc *gc, + uint32_t domid, + const char *type, + libxl_device_disk **disks, + int *ndisks) +{ + char *be_path = NULL; + char **dir = NULL; + unsigned int n = 0; + libxl_device_disk *pdisk = NULL, *pdisk_end = NULL; + + be_path = libxl__sprintf(gc, "%s/backend/%s/%d", + libxl__xs_get_dompath(gc, 0), type, domid); + dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n); + if (dir) { + libxl_device_disk *tmp; + tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); + if (tmp == NULL) + return ERROR_NOMEM; + *disks = tmp; + pdisk = *disks + *ndisks; + *ndisks += n; + pdisk_end = *disks + *ndisks; + for (; pdisk < pdisk_end; pdisk++, dir++) { + const char *p; + p = libxl__sprintf(gc, "%s/%s", be_path, *dir); + libxl__device_disk_from_xs_be(gc, p, pdisk); + pdisk->backend_domid = 0; + } + } + return 0; +} + +libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl_device_disk *disks = NULL; + int rc; + + *num = 0; + + rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num); + if (rc) goto out_err; + + rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num); + if (rc) goto out_err; + + rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num); + if (rc) goto out_err; + + libxl__free_all(&gc); + return disks; + +out_err: + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks"); + while (disks && *num) { + (*num)--; + libxl_device_disk_dispose(&disks[*num]); + } + free(disks); + return NULL; +} + +int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid, + libxl_device_disk *disk, libxl_diskinfo *diskinfo) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + char *dompath, *diskpath; + char *val; + + dompath = libxl__xs_get_dompath(&gc, domid); + diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); + + /* tap devices entries in xenstore are written as vbd devices. */ + diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid); + diskinfo->backend = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(&gc, "%s/backend", diskpath), NULL); + if (!diskinfo->backend) { + libxl__free_all(&gc); + return ERROR_FAIL; + } + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath)); + diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1; + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath)); + diskinfo->state = val ? strtoul(val, NULL, 10) : -1; + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath)); + diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1; + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath)); + diskinfo->rref = val ? strtoul(val, NULL, 10) : -1; + diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL, + libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL); + val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend)); + diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1; + + libxl__free_all(&gc); + return 0; +} + +int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk) +{ + int num, i; + uint32_t stubdomid; + libxl_device_disk *disks; + int ret = ERROR_FAIL; + + if (!disk->pdev_path) { + disk->pdev_path = strdup(""); + disk->format = LIBXL_DISK_FORMAT_EMPTY; + } + disks = libxl_device_disk_list(ctx, domid, &num); + for (i = 0; i < num; i++) { + if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev)) + /* found */ + break; + } + if (i == num) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found"); + goto out; + } + + ret = 0; + + libxl_device_disk_remove(ctx, domid, disks + i); + libxl_device_disk_add(ctx, domid, disk); + stubdomid = libxl_get_stubdom_id(ctx, domid); + if (stubdomid) { + libxl_device_disk_remove(ctx, stubdomid, disks + i); + libxl_device_disk_add(ctx, stubdomid, disk); + } +out: + for (i = 0; i < num; i++) + libxl_device_disk_dispose(&disks[i]); + free(disks); + return ret; +} + char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk) { libxl__gc gc = LIBXL_INIT_GC(ctx); @@ -1346,6 +1556,7 @@ out: libxl__free_all(&gc); return rc; } + static void libxl__device_nic_from_xs_be(libxl__gc *gc, const char *be_path, libxl_device_nic *nic) @@ -1686,215 +1897,6 @@ out: return rc; } -static void libxl__device_disk_from_xs_be(libxl__gc *gc, - const char *be_path, - libxl_device_disk *disk) -{ - libxl_ctx *ctx = libxl__gc_owner(gc); - unsigned int len; - char *tmp; - - libxl_device_disk_init(ctx, disk); - - tmp = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(gc, "%s/params", be_path), &len); - if (tmp && strchr(tmp, '':'')) { - disk->pdev_path = strdup(strchr(tmp, '':'') + 1); - free(tmp); - } else { - disk->pdev_path = tmp; - } - libxl_string_to_backend(ctx, - libxl__xs_read(gc, XBT_NULL, - libxl__sprintf(gc, "%s/type", be_path)), - &(disk->backend)); - disk->vdev = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(gc, "%s/dev", be_path), &len); - tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf - (gc, "%s/removable", be_path)); - - if (tmp) - disk->removable = atoi(tmp); - else - disk->removable = 0; - - tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path)); - if (!strcmp(tmp, "w")) - disk->readwrite = 1; - else - disk->readwrite = 0; - - tmp = libxl__xs_read(gc, XBT_NULL, - libxl__sprintf(gc, "%s/device-type", be_path)); - disk->is_cdrom = !strcmp(tmp, "cdrom"); - - disk->format = LIBXL_DISK_FORMAT_UNKNOWN; -} - -int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, - int devid, libxl_device_disk *disk) -{ - libxl__gc gc = LIBXL_INIT_GC(ctx); - char *dompath, *path; - int rc = ERROR_FAIL; - - libxl_device_disk_init(ctx, disk); - - dompath = libxl__xs_get_dompath(&gc, domid); - if (!dompath) { - goto out; - } - path = libxl__xs_read(&gc, XBT_NULL, - libxl__sprintf(&gc, "%s/device/vbd/%d/backend", - dompath, devid)); - if (!path) - goto out; - - libxl__device_disk_from_xs_be(&gc, path, disk); - - rc = 0; -out: - libxl__free_all(&gc); - return rc; -} - - -static int libxl__append_disk_list_of_type(libxl__gc *gc, - uint32_t domid, - const char *type, - libxl_device_disk **disks, - int *ndisks) -{ - char *be_path = NULL; - char **dir = NULL; - unsigned int n = 0; - libxl_device_disk *pdisk = NULL, *pdisk_end = NULL; - - be_path = libxl__sprintf(gc, "%s/backend/%s/%d", - libxl__xs_get_dompath(gc, 0), type, domid); - dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n); - if (dir) { - libxl_device_disk *tmp; - tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); - if (tmp == NULL) - return ERROR_NOMEM; - *disks = tmp; - pdisk = *disks + *ndisks; - *ndisks += n; - pdisk_end = *disks + *ndisks; - for (; pdisk < pdisk_end; pdisk++, dir++) { - const char *p; - p = libxl__sprintf(gc, "%s/%s", be_path, *dir); - libxl__device_disk_from_xs_be(gc, p, pdisk); - pdisk->backend_domid = 0; - } - } - return 0; -} - -libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num) -{ - libxl__gc gc = LIBXL_INIT_GC(ctx); - libxl_device_disk *disks = NULL; - int rc; - - *num = 0; - - rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num); - if (rc) goto out_err; - - rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num); - if (rc) goto out_err; - - rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num); - if (rc) goto out_err; - - libxl__free_all(&gc); - return disks; - -out_err: - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks"); - while (disks && *num) { - (*num)--; - libxl_device_disk_dispose(&disks[*num]); - } - free(disks); - return NULL; -} - -int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid, - libxl_device_disk *disk, libxl_diskinfo *diskinfo) -{ - libxl__gc gc = LIBXL_INIT_GC(ctx); - char *dompath, *diskpath; - char *val; - - dompath = libxl__xs_get_dompath(&gc, domid); - diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); - - /* tap devices entries in xenstore are written as vbd devices. */ - diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid); - diskinfo->backend = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(&gc, "%s/backend", diskpath), NULL); - if (!diskinfo->backend) { - libxl__free_all(&gc); - return ERROR_FAIL; - } - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath)); - diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1; - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath)); - diskinfo->state = val ? strtoul(val, NULL, 10) : -1; - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath)); - diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1; - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath)); - diskinfo->rref = val ? strtoul(val, NULL, 10) : -1; - diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL, - libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL); - val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend)); - diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1; - - libxl__free_all(&gc); - return 0; -} - -int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk) -{ - int num, i; - uint32_t stubdomid; - libxl_device_disk *disks; - int ret = ERROR_FAIL; - - if (!disk->pdev_path) { - disk->pdev_path = strdup(""); - disk->format = LIBXL_DISK_FORMAT_EMPTY; - } - disks = libxl_device_disk_list(ctx, domid, &num); - for (i = 0; i < num; i++) { - if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev)) - /* found */ - break; - } - if (i == num) { - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found"); - goto out; - } - - ret = 0; - - libxl_device_disk_remove(ctx, domid, disks + i); - libxl_device_disk_add(ctx, domid, disk); - stubdomid = libxl_get_stubdom_id(ctx, domid); - if (stubdomid) { - libxl_device_disk_remove(ctx, stubdomid, disks + i); - libxl_device_disk_add(ctx, stubdomid, disk); - } -out: - for (i = 0; i < num; i++) - libxl_device_disk_dispose(&disks[i]); - free(disks); - return ret; -} - /******************************************************************************/ int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb) { _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 26 of 27 v3] libxl: convert PCI device handling to device API
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941403 -3600 # Node ID 0bfe1face70308bbb72d5e3ce46e86f8933466f8 # Parent 9a75cc1499dacfd7fc8c1430d77a14f218cd6206 libxl: convert PCI device handling to device API Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 @@ -754,7 +754,7 @@ int libxl_domain_destroy(libxl_ctx *ctx, goto out; } - if (libxl_device_pci_shutdown(ctx, domid) < 0) + if (libxl__device_pci_destroy_all(&gc, domid) < 0) LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "pci shutdown failed for domid %d", domid); rc = xc_domain_pause(ctx->xch, domid); if (rc < 0) { diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 @@ -485,12 +485,28 @@ int libxl_device_vfb_add(libxl_ctx *ctx, int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); +/* PCI Passthrough */ +int libxl_device_pci_init(libxl_ctx *ctx, libxl_device_pci *pci); int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); -int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int force); -int libxl_device_pci_shutdown(libxl_ctx *ctx, uint32_t domid); -int libxl_device_pci_list_assigned(libxl_ctx *ctx, libxl_device_pci **list, uint32_t domid, int *num); -int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list, int *num); -int libxl_device_pci_parse_bdf(libxl_ctx *ctx, libxl_device_pci *pcidev, const char *str); +int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); +int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); +libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num); + +/* + * Parse a PCI BDF into a PCI device structure. + */ +int libxl_device_pci_parse_bdf(libxl_ctx *ctx, + libxl_device_pci *pcidev, + const char *str); + +/* + * Similar to libxl_device_pci_list but returns all devices which + * could be assigned to a domain (i.e. are bound to the backend + * driver) but are not currently. + */ +libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num); + +/* CPUID handling */ int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str); int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid, const char* str); diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:43 2011 +0100 @@ -252,6 +252,7 @@ _hidden int libxl__wait_for_backend(libx _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting); _hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num); +_hidden int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid); /* xl_exec */ diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl_pci.c Tue Oct 18 13:36:43 2011 +0100 @@ -486,7 +486,7 @@ static int is_assigned(libxl_device_pci return 0; } -int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list, int *num) +libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num) { libxl__gc gc = LIBXL_INIT_GC(ctx); libxl_device_pci *pcidevs = NULL, *new, *assigned; @@ -495,13 +495,10 @@ int libxl_device_pci_list_assignable(lib int rc, num_assigned; *num = 0; - *list = NULL; rc = get_all_assigned_devices(&gc, &assigned, &num_assigned); - if ( rc ) { - libxl__free_all(&gc); - return rc; - } + if ( rc ) + goto out; dir = opendir(SYSFS_PCIBACK_DRIVER); if ( NULL == dir ) { @@ -510,8 +507,7 @@ int libxl_device_pci_list_assignable(lib }else{ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn''t open %s", SYSFS_PCIBACK_DRIVER); } - libxl__free_all(&gc); - return ERROR_FAIL; + goto out_closedir; } while( (de = readdir(dir)) ) { @@ -534,10 +530,11 @@ int libxl_device_pci_list_assignable(lib (*num)++; } +out_closedir: closedir(dir); - *list = pcidevs; +out: libxl__free_all(&gc); - return 0; + return pcidevs; } /* @@ -846,21 +843,25 @@ static int do_pci_remove(libxl__gc *gc, int hvm = 0, rc, num; int stubdomid = 0; - if ( !libxl_device_pci_list_assigned(ctx, &assigned, domid, &num) ) { - if ( !is_assigned(assigned, num, pcidev->domain, - pcidev->bus, pcidev->dev, pcidev->func) ) { - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not attached to this domain"); - return ERROR_INVAL; - } + assigned = libxl_device_pci_list(ctx, domid, &num); + if ( assigned == NULL ) + return ERROR_FAIL; + + rc = ERROR_INVAL; + if ( !is_assigned(assigned, num, pcidev->domain, + pcidev->bus, pcidev->dev, pcidev->func) ) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not attached to this domain"); + goto out_fail; } + rc = ERROR_FAIL; switch (libxl__domain_type(gc, domid)) { case LIBXL_DOMAIN_TYPE_HVM: hvm = 1; if (libxl__wait_for_device_model(gc, domid, "running", - NULL, NULL, NULL) < 0) { - return ERROR_FAIL; - } + NULL, NULL, NULL) < 0) + goto out_fail; + path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid); state = libxl__xs_read(gc, XBT_NULL, path); path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid); @@ -879,7 +880,7 @@ static int do_pci_remove(libxl__gc *gc, * SCI, if it doesn''t respond in time then we may wish to * force the removal. */ - return ERROR_FAIL; + goto out_fail; } } path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid); @@ -955,25 +956,31 @@ out: stubdomid = libxl_get_stubdom_id(ctx, domid); if (stubdomid != 0) { libxl_device_pci pcidev_s = *pcidev; - libxl_device_pci_remove(ctx, stubdomid, &pcidev_s, force); + if (force) + libxl_device_pci_destroy(ctx, stubdomid, &pcidev_s); + else + libxl_device_pci_remove(ctx, stubdomid, &pcidev_s); } libxl__device_pci_remove_xenstore(gc, domid, pcidev); - return 0; + rc = 0; +out_fail: + free(assigned); + return rc; + } -int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, - libxl_device_pci *pcidev, int force) +static int libxl__device_pci_remove_common(libxl__gc *gc, uint32_t domid, + libxl_device_pci *pcidev, int force) { - libxl__gc gc = LIBXL_INIT_GC(ctx); unsigned int orig_vdev, pfunc_mask; int i, rc; orig_vdev = pcidev->vdevfn & ~7U; if ( pcidev->vfunc_mask == LIBXL_PCI_FUNC_ALL ) { - if ( pci_multifunction_check(&gc, pcidev, &pfunc_mask) ) { + if ( pci_multifunction_check(gc, pcidev, &pfunc_mask) ) { rc = ERROR_FAIL; goto out; } @@ -990,81 +997,118 @@ int libxl_device_pci_remove(libxl_ctx *c }else{ pcidev->vdevfn = orig_vdev; } - if ( do_pci_remove(&gc, domid, pcidev, force) ) + if ( do_pci_remove(gc, domid, pcidev, force) ) rc = ERROR_FAIL; } } out: + return rc; +} + +int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + int rc; + + rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 0); + libxl__free_all(&gc); return rc; } -int libxl_device_pci_list_assigned(libxl_ctx *ctx, libxl_device_pci **list, uint32_t domid, int *num) +int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_pci *pcidev) { libxl__gc gc = LIBXL_INIT_GC(ctx); - char *be_path, *num_devs, *xsdev, *xsvdevfn, *xsopts; + int rc; + + rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 1); + + libxl__free_all(&gc); + return rc; +} + +static void libxl__device_pci_from_xs_be(libxl__gc *gc, + const char *be_path, + libxl_device_pci *pci, + int nr) +{ + char *s; + unsigned int domain = 0, bus = 0, dev = 0, func = 0, vdevfn = 0; + + s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/dev-%d", be_path, nr)); + sscanf(s, PCI_BDF, &domain, &bus, &dev, &func); + + s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vdevfn-%d", be_path, nr)); + if (s) + vdevfn = strtol(s, (char **) NULL, 16); + + pcidev_init(pci, domain, bus, dev, func, vdevfn); + + s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/opts-%d", be_path, nr)); + if (s) { + char *saveptr; + char *p = strtok_r(s, ",=", &saveptr); + do { + while (*p == '' '') + p++; + if (!strcmp(p, "msitranslate")) { + p = strtok_r(NULL, ",=", &saveptr); + pci->msitranslate = atoi(p); + } else if (!strcmp(p, "power_mgmt")) { + p = strtok_r(NULL, ",=", &saveptr); + pci->power_mgmt = atoi(p); + } + } while ((p = strtok_r(NULL, ",=", &saveptr)) != NULL); + } +} + +libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + char *be_path, *num_devs; int n, i; - unsigned int domain = 0, bus = 0, dev = 0, func = 0, vdevfn = 0; - libxl_device_pci *pcidevs; + libxl_device_pci *pcidevs = NULL; + + *num = 0; be_path = libxl__sprintf(&gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(&gc, 0), domid); num_devs = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/num_devs", be_path)); - if (!num_devs) { - *num = 0; - *list = NULL; - libxl__free_all(&gc); - return 0; - } + if (!num_devs) + goto out; + n = atoi(num_devs); pcidevs = calloc(n, sizeof(libxl_device_pci)); + + for (i = 0; i < n; i++) + libxl__device_pci_from_xs_be(&gc, be_path, pcidevs + i, i); + *num = n; - - for (i = 0; i < n; i++) { - xsdev = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev-%d", be_path, i)); - sscanf(xsdev, PCI_BDF, &domain, &bus, &dev, &func); - xsvdevfn = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vdevfn-%d", be_path, i)); - if (xsvdevfn) - vdevfn = strtol(xsvdevfn, (char **) NULL, 16); - pcidev_init(pcidevs + i, domain, bus, dev, func, vdevfn); - xsopts = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/opts-%d", be_path, i)); - if (xsopts) { - char *saveptr; - char *p = strtok_r(xsopts, ",=", &saveptr); - do { - while (*p == '' '') - p++; - if (!strcmp(p, "msitranslate")) { - p = strtok_r(NULL, ",=", &saveptr); - pcidevs[i].msitranslate = atoi(p); - } else if (!strcmp(p, "power_mgmt")) { - p = strtok_r(NULL, ",=", &saveptr); - pcidevs[i].power_mgmt = atoi(p); - } - } while ((p = strtok_r(NULL, ",=", &saveptr)) != NULL); - } - } - *list = pcidevs; +out: libxl__free_all(&gc); - return 0; + return pcidevs; } -int libxl_device_pci_shutdown(libxl_ctx *ctx, uint32_t domid) +int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid) { + libxl_ctx *ctx = libxl__gc_owner(gc); libxl_device_pci *pcidevs; - int num, i, rc; + int num, i, rc = 0; - rc = libxl_device_pci_list_assigned(ctx, &pcidevs, domid, &num); - if ( rc ) - return rc; + pcidevs = libxl_device_pci_list(ctx, domid, &num); + if ( pcidevs == NULL ) + return ERROR_FAIL; + for (i = 0; i < num; i++) { /* Force remove on shutdown since, on HVM, qemu will not always * respond to SCI interrupt because the guest kernel has shut down the * devices by the time we even get here! */ - if (libxl_device_pci_remove(ctx, domid, pcidevs + i, 1) < 0) - return ERROR_FAIL; + if (libxl_device_pci_destroy(ctx, domid, pcidevs + i) < 0) + rc = ERROR_FAIL; } + free(pcidevs); return 0; } diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 18 13:36:43 2011 +0100 @@ -2018,11 +2018,14 @@ static void pcilist_assignable(void) libxl_device_pci *pcidevs; int num, i; - if ( libxl_device_pci_list_assignable(ctx, &pcidevs, &num) ) + pcidevs = libxl_device_pci_list_assignable(ctx, &num); + + if ( pcidevs == NULL ) return; for (i = 0; i < num; i++) { printf("%04x:%02x:%02x.%01x\n", - pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func); + pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func); + libxl_device_pci_dispose(&pcidevs[i]); } free(pcidevs); } @@ -2045,7 +2048,8 @@ static void pcilist(const char *dom) find_domain(dom); - if (libxl_device_pci_list_assigned(ctx, &pcidevs, domid, &num)) + pcidevs = libxl_device_pci_list(ctx, domid, &num); + if (pcidevs == NULL) return; printf("Vdev Device\n"); for (i = 0; i < num; i++) { @@ -2082,7 +2086,10 @@ static void pcidetach(const char *dom, c fprintf(stderr, "pci-detach: malformed BDF specification \"%s\"\n", bdf); exit(2); } - libxl_device_pci_remove(ctx, domid, &pcidev, force); + if (force) + libxl_device_pci_destroy(ctx, domid, &pcidev); + else + libxl_device_pci_remove(ctx, domid, &pcidev); libxl_device_pci_dispose(&pcidev); } diff -r 9a75cc1499da -r 0bfe1face703 tools/ocaml/libs/xl/genwrap.py --- a/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/ocaml/libs/xl/genwrap.py Tue Oct 18 13:36:43 2011 +0100 @@ -26,10 +26,7 @@ functions = { # ( name , [type1,type2,.. "device_vkb": DEVICE_FUNCTIONS, "device_disk": DEVICE_FUNCTIONS, "device_nic": DEVICE_FUNCTIONS, - "device_pci": [ ("add", ["t", "domid", "unit"]), - ("remove", ["t", "domid", "unit"]), - ("shutdown", ["domid", "unit"]), - ], + "device_pci": DEVICE_FUNCTIONS, "physinfo": [ ("get", ["unit", "t"]), ], "sched_credit": [ ("domain_get", ["domid", "t"]), diff -r 9a75cc1499da -r 0bfe1face703 tools/ocaml/libs/xl/xenlight_stubs.c --- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 @@ -424,7 +424,7 @@ value stub_xl_device_pci_remove(value in device_pci_val(&gc, &lg, &c_info, info); INIT_CTX(); - ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0); + ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info); if (ret != 0) failwith_xl("pci_remove", &lg); FREE_CTX(); @@ -432,21 +432,6 @@ value stub_xl_device_pci_remove(value in CAMLreturn(Val_unit); } -value stub_xl_device_pci_shutdown(value domid) -{ - CAMLparam1(domid); - int ret; - INIT_STRUCT(); - - INIT_CTX(); - ret = libxl_device_pci_shutdown(ctx, Int_val(domid)); - if (ret != 0) - failwith_xl("pci_shutdown", &lg); - FREE_CTX(); - - CAMLreturn(Val_unit); -} - value stub_xl_button_press(value domid, value button) { CAMLparam2(domid, button); diff -r 9a75cc1499da -r 0bfe1face703 tools/python/xen/lowlevel/xl/xl.c --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 18 13:36:43 2011 +0100 @@ -521,9 +521,16 @@ static PyObject *pyxl_pci_del(XlObject * return NULL; } pci = (Py_device_pci *)obj; - if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj, force) ) { - PyErr_SetString(xl_error_obj, "cannot remove pci device"); - return NULL; + if ( force ) { + if ( libxl_device_pci_destroy(self->ctx, domid, &pci->obj) ) { + PyErr_SetString(xl_error_obj, "cannot remove pci device"); + return NULL; + } + } else { + if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj) ) { + PyErr_SetString(xl_error_obj, "cannot remove pci device"); + return NULL; + } } Py_INCREF(Py_None); return Py_None; @@ -558,7 +565,8 @@ static PyObject *pyxl_pci_list_assignabl PyObject *list; int nr_dev, i; - if ( libxl_device_pci_list_assignable(self->ctx, &dev, &nr_dev) ) { + dev = libxl_device_pci_list_assignable(self->ctx, &nr_dev); + if ( dev == NULL ) { PyErr_SetString(xl_error_obj, "Cannot list assignable devices"); return NULL; } @@ -594,7 +602,8 @@ static PyObject *pyxl_pci_list(XlObject if ( !PyArg_ParseTuple(args, "i", &domid) ) return NULL; - if ( libxl_device_pci_list_assigned(self->ctx, &dev, domid, &nr_dev) ) { + dev = libxl_device_pci_list(self->ctx, domid, &nr_dev); + if ( dev == NULL ) { PyErr_SetString(xl_error_obj, "Cannot list assignable devices"); return NULL; } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-18 12:55 UTC
[Xen-devel] [PATCH 27 of 27 v3] libxl: add a flags argument to libxl_ctx_alloc
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1318941403 -3600 # Node ID 12ac478d1b56f0ff4d3242138b780c551a69f107 # Parent 0bfe1face70308bbb72d5e3ce46e86f8933466f8 libxl: add a flags argument to libxl_ctx_alloc. Currently unused but gives us scope for expansion in an ABI compatible manner in the future. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/gentest.py --- a/tools/libxl/gentest.py Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/gentest.py Tue Oct 18 13:36:43 2011 +0100 @@ -239,7 +239,7 @@ int main(int argc, char **argv) logger = xtl_createlogger_stdiostream(stderr, XTL_DETAIL, 0); if (!logger) exit(1); - if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) { + if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) { fprintf(stderr, "cannot init xl context\\n"); exit(1); } diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:43 2011 +0100 @@ -39,7 +39,8 @@ #define PAGE_TO_MEMKB(pages) ((pages) * 4) #define BACKEND_STRING_SIZE 5 -int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg) +int libxl_ctx_alloc(libxl_ctx **pctx, int version, + unsigned flags, xentoollog_logger * lg) { libxl_ctx *ctx; struct stat stat_buf; diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/libxl.h Tue Oct 18 13:36:43 2011 +0100 @@ -245,7 +245,9 @@ typedef struct { } libxl_domain_config; /* context functions */ -int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger *lg); +int libxl_ctx_alloc(libxl_ctx **pctx, int version, + unsigned flags /* none currently defined */, + xentoollog_logger *lg); int libxl_ctx_free(libxl_ctx *ctx /* 0 is OK */); int libxl_ctx_postfork(libxl_ctx *ctx); diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/xl.c --- a/tools/libxl/xl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/libxl/xl.c Tue Oct 18 13:36:43 2011 +0100 @@ -116,7 +116,7 @@ int main(int argc, char **argv) logger = xtl_createlogger_stdiostream(stderr, minmsglevel, 0); if (!logger) exit(1); - if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) { + if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) { fprintf(stderr, "cannot init xl context\n"); exit(1); } diff -r 0bfe1face703 -r 12ac478d1b56 tools/ocaml/libs/xl/xenlight_stubs.c --- a/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/ocaml/libs/xl/xenlight_stubs.c Tue Oct 18 13:36:43 2011 +0100 @@ -59,7 +59,7 @@ static void log_destroy(struct xentoollo lg.logger.destroy = log_destroy; \ lg.logger.progress = NULL; \ caml_enter_blocking_section(); \ - ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \ + ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (struct xentoollog_logger *) &lg); \ if (ret != 0) \ failwith_xl("cannot init context", &lg); diff -r 0bfe1face703 -r 12ac478d1b56 tools/python/xen/lowlevel/xl/xl.c --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 18 13:36:43 2011 +0100 +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 18 13:36:43 2011 +0100 @@ -687,7 +687,7 @@ PyXl_init(XlObject *self, PyObject *args return -1; } - if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION, + if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION, 0, (xentoollog_logger*)self->logger) ) { PyErr_SetString(xl_error_obj, "cannot init xl context"); return -1; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Roger Pau Monné
2011-Oct-19 10:22 UTC
Re: [Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del into libxl__device_remove
2011/10/18 Ian Campbell <ian.campbell@citrix.com>:> # HG changeset patch > # User Ian Campbell <ian.campbell@citrix.com> > # Date 1318941402 -3600 > # Node ID 4020531a53fcb1a5579de3225b99a29a7619c7df > # Parent 5547b8593511cb37b830f6ec73f480e607f639c2 > libxl: merge libxl__device_del into libxl__device_remove > > Note that the "wait" parameter added to libxl_device_remove is different to the > wait paramter previously used by similar functions. In the past not-wait meant > forced whereas now in means wait for a graceful shutdown, as opposed to setting > off a graceful shutdown but not waiting. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > > diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl.c > --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 > +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 > @@ -1075,7 +1075,7 @@ int libxl_device_disk_del(libxl_ctx *ctx > device.devid = devid; > device.kind = LIBXL__DEVICE_KIND_VBD; > if (wait) > - rc = libxl__device_del(&gc, &device); > + rc = libxl__device_remove(&gc, &device, wait); > else > rc = libxl__device_destroy(&gc, &device); > out_free: > @@ -1290,7 +1290,7 @@ int libxl_device_nic_del(libxl_ctx *ctx, > device.kind = LIBXL__DEVICE_KIND_VIF; > > if (wait) > - rc = libxl__device_del(&gc, &device); > + rc = libxl__device_remove(&gc, &device, wait); > else > rc = libxl__device_destroy(&gc, &device); > > diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_device.c > --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 > +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 > @@ -367,57 +367,6 @@ int libxl__device_disk_dev_number(const > return -1; > } > > -int libxl__device_remove(libxl__gc *gc, libxl__device *dev) > -{ > - libxl_ctx *ctx = libxl__gc_owner(gc); > - xs_transaction_t t; > - char *be_path = libxl__device_backend_path(gc, dev); > - char *state_path = libxl__sprintf(gc, "%s/state", be_path); > - char *state = libxl__xs_read(gc, XBT_NULL, state_path); > - int rc = 0; > - > - if (!state) > - goto out; > - if (atoi(state) != 4) { > - libxl__device_destroy_tapdisk(gc, be_path); > - xs_rm(ctx->xsh, XBT_NULL, be_path); > - goto out; > - } > - > -retry_transaction: > - t = xs_transaction_start(ctx->xsh); > - xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0")); > - xs_write(ctx->xsh, t, state_path, "5", strlen("5")); > - if (!xs_transaction_end(ctx->xsh, t, 0)) { > - if (errno == EAGAIN) > - goto retry_transaction; > - else { > - rc = -1; > - goto out; > - } > - } > - > - xs_watch(ctx->xsh, state_path, be_path); > - libxl__device_destroy_tapdisk(gc, be_path); > - rc = 1; > -out: > - return rc; > -} > - > -int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) > -{ > - libxl_ctx *ctx = libxl__gc_owner(gc); > - char *be_path = libxl__device_backend_path(gc, dev); > - char *fe_path = libxl__device_frontend_path(gc, dev); > - > - xs_rm(ctx->xsh, XBT_NULL, be_path); > - xs_rm(ctx->xsh, XBT_NULL, fe_path); > - > - libxl__device_destroy_tapdisk(gc, be_path); > - > - return 0; > -} > - > static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv) > { > libxl_ctx *ctx = libxl__gc_owner(gc); > @@ -446,6 +395,71 @@ static int wait_for_dev_destroy(libxl__g > return rc; > } > > +/* > + * Returns 0 (device already destroyed) or 1 (caller must > + * wait_for_dev_destroy) on success, ERROR_* on fail. > + */ > +int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait) > +{ > + libxl_ctx *ctx = libxl__gc_owner(gc); > + xs_transaction_t t; > + char *be_path = libxl__device_backend_path(gc, dev); > + char *state_path = libxl__sprintf(gc, "%s/state", be_path); > + char *state = libxl__xs_read(gc, XBT_NULL, state_path); > + int rc = 0; > + > + if (!state) > + goto out; > + if (atoi(state) != 4) { > + libxl__device_destroy_tapdisk(gc, be_path); > + xs_rm(ctx->xsh, XBT_NULL, be_path); > + goto out; > + } > + > +retry_transaction: > + t = xs_transaction_start(ctx->xsh); > + xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0")); > + xs_write(ctx->xsh, t, state_path, "5", strlen("5")); > + if (!xs_transaction_end(ctx->xsh, t, 0)) { > + if (errno == EAGAIN) > + goto retry_transaction; > + else { > + rc = ERROR_FAIL; > + goto out; > + } > + } > + > + xs_watch(ctx->xsh, state_path, be_path); > + libxl__device_destroy_tapdisk(gc, be_path); > + > + if (wait) { > + struct timeval tv; > + tv.tv_sec = LIBXL_DESTROY_TIMEOUT; > + tv.tv_usec = 0; > + (void)wait_for_dev_destroy(gc, &tv);I think we should check the return value of wait_for_dev_destroy here, since it might timeout, and the device is not removed then, so libxl__device_remove should return 1 in that case (whereas it always returns 0 now in that case, even when the device is still being watched).> + xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev)); > + } else { > + rc = 1; /* Caller must wait_for_dev_destroy */ > + } > + > +out: > + return rc; > +} > + > +int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) > +{ > + libxl_ctx *ctx = libxl__gc_owner(gc); > + char *be_path = libxl__device_backend_path(gc, dev); > + char *fe_path = libxl__device_frontend_path(gc, dev); > + > + xs_rm(ctx->xsh, XBT_NULL, be_path); > + xs_rm(ctx->xsh, XBT_NULL, fe_path); > + > + libxl__device_destroy_tapdisk(gc, be_path); > + > + return 0; > +} > + > int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force) > { > libxl_ctx *ctx = libxl__gc_owner(gc); > @@ -485,8 +499,12 @@ int libxl__devices_destroy(libxl__gc *gc > if (force) { > libxl__device_destroy(gc, &dev); > } else { > - if (libxl__device_remove(gc, &dev) > 0) > - n_watches++; > + int rc = libxl__device_remove(gc, &dev, 0); > + if (rc < 0) > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, > + "cannot remove device %s\n", path); > + else > + n_watches += rc; > } > } > } > @@ -504,8 +522,12 @@ int libxl__devices_destroy(libxl__gc *gc > if (force) { > libxl__device_destroy(gc, &dev); > } else { > - if (libxl__device_remove(gc, &dev) > 0) > - n_watches++; > + int rc = libxl__device_remove(gc, &dev, 0); > + if (rc < 0) > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, > + "cannot remove device %s\n", path); > + else > + n_watches += rc; > } > } > > @@ -530,29 +552,6 @@ out: > return 0; > } > > -int libxl__device_del(libxl__gc *gc, libxl__device *dev) > -{ > - libxl_ctx *ctx = libxl__gc_owner(gc); > - struct timeval tv; > - int rc; > - > - rc = libxl__device_remove(gc, dev); > - if (rc == -1) { > - rc = ERROR_FAIL; > - goto out; > - } > - > - tv.tv_sec = LIBXL_DESTROY_TIMEOUT; > - tv.tv_usec = 0; > - (void)wait_for_dev_destroy(gc, &tv); > - > - xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev)); > - rc = 0; > - > -out: > - return rc; > -} > - > int libxl__wait_for_device_model(libxl__gc *gc, > uint32_t domid, char *state, > libxl__spawn_starting *spawning, > diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_internal.h > --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 > +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 > @@ -242,8 +242,7 @@ _hidden char *libxl__device_backend_path > _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); > _hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path, > libxl__device *dev); > -_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev); > -_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev); > +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait); > _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev); > _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force); > _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state); > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-19 10:36 UTC
Re: [Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del into libxl__device_remove
On Wed, 2011-10-19 at 11:22 +0100, Roger Pau Monné wrote:> > + xs_watch(ctx->xsh, state_path, be_path); > > + libxl__device_destroy_tapdisk(gc, be_path); > > + > > + if (wait) { > > + struct timeval tv; > > + tv.tv_sec = LIBXL_DESTROY_TIMEOUT; > > + tv.tv_usec = 0; > > + (void)wait_for_dev_destroy(gc, &tv); > > I think we should check the return value of wait_for_dev_destroy here, > since it might timeout, and the device is not removed then, so > libxl__device_remove should return 1 in that case (whereas it always > returns 0 now in that case, even when the device is still being > watched).Sure, didn''t you post such a patch recently? Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Roger Pau Monné
2011-Oct-19 10:42 UTC
Re: [Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del into libxl__device_remove
2011/10/19 Ian Campbell <Ian.Campbell@citrix.com>:> On Wed, 2011-10-19 at 11:22 +0100, Roger Pau Monné wrote: >> > + xs_watch(ctx->xsh, state_path, be_path); >> > + libxl__device_destroy_tapdisk(gc, be_path); >> > + >> > + if (wait) { >> > + struct timeval tv; >> > + tv.tv_sec = LIBXL_DESTROY_TIMEOUT; >> > + tv.tv_usec = 0; >> > + (void)wait_for_dev_destroy(gc, &tv); >> >> I think we should check the return value of wait_for_dev_destroy here, >> since it might timeout, and the device is not removed then, so >> libxl__device_remove should return 1 in that case (whereas it always >> returns 0 now in that case, even when the device is still being >> watched). > > Sure, didn''t you post such a patch recently?Yes, it was for the old version of your series and also included the fix for libxl__device_remove always returning 0, I will modify it to strip the now unnecessary parts and repost.> Ian. > > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Dario Faggioli
2011-Oct-19 16:14 UTC
Re: [Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break; " to do_pci_remove
On Tue, Oct 18, 2011 at 2:54 PM, Ian Campbell <ian.campbell@citrix.com> wrote:> # HG changeset patch > # User Ian Campbell <ian.campbell@citrix.com> > # Date 1318930552 -3600 > # Node ID e03520648d2c91210d59a90f497b356fd72eb36f > # Parent 955a6c07dc5e9c55316d1678b2b7cc4313f4fd57 > libxl: add missing "break;" to do_pci_remove > > Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the > "default: abort()". > > (I''m sure we fixed this once already...) > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> >Tested-by: Dario Faggioli <dario.faggioli@citrix.com> -- <<This happens because I choose it to happen!>> (Raistlin Majere) ---------------------------------------------------------------------- Dario Faggioli, <http://retis.sssup.it/people/faggioli> PhD Candidate, ReTiS Lab, Scuola Superiore Sant''Anna, Pisa (Italy) Senior Software Engineer, Citrix Systems R&D, Cambridge (UK) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2011-Oct-25 16:04 UTC
Re: [Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break; " to do_pci_remove
Dario Faggioli writes ("Re: [Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break; " to do_pci_remove"):> On Tue, Oct 18, 2011 at 2:54 PM, Ian Campbell <ian.campbell@citrix.com> wrote: > > libxl: add missing "break;" to do_pci_remove...> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > > > Tested-by: Dario Faggioli <dario.faggioli@citrix.com>Committed-by: Ian Jackson <ian.jackson@eu.citrix.com> _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2011-Nov-01 17:10 UTC
Re: [Xen-devel] [PATCH 00 of 27 v3] libxl: rationalise libxl_device_* APIs
Ian Campbell writes ("[Xen-devel] [PATCH 00 of 27 v3] libxl: rationalise libxl_device_* APIs"):> The following series overhauls the libxl_device_* APIs in an attempt > to make them more consistent across the types of devices and move > towards something we can support as a stable API longterm.I have applied all 27 of these (1 earlier, and 26 just now). I did notice a few of the lines of C code were >80 columns but I guess we can fix that up later and now isn''t really the right time. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel