From patchwork Wed Jul 6 14:55:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 9216477 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 36B9960467 for ; Wed, 6 Jul 2016 14:58:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 27F4324B5B for ; Wed, 6 Jul 2016 14:58:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1BA0824DA1; Wed, 6 Jul 2016 14:58:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6B97424B5B for ; Wed, 6 Jul 2016 14:58:16 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bKoEm-00030h-SH; Wed, 06 Jul 2016 14:55:40 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bKoEl-0002ze-4z for xen-devel@lists.xen.org; Wed, 06 Jul 2016 14:55:39 +0000 Received: from [85.158.143.35] by server-3.bemta-6.messagelabs.com id EF/73-22092-AEB1D775; Wed, 06 Jul 2016 14:55:38 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKLMWRWlGSWpSXmKPExsVyuP0Ov+5L6dp wgxenDC2WfFzM4sDocXT3b6YAxijWzLyk/IoE1oy/ay6xFGzwrGhef5itgfGBeRcjJ4eEgJHE 24n/mLoYuTiEBBYyStz+OJ0NJMEmoCqx4fopVhBbREBa4trny4wgNrNAqMTJd/eYQWxhAVuJ5 /0n2EFsFqD6P0ueg9XwCthJ3Nv/ng1igZzE9ZnTmUBsTgF7iWc3WsDqhYBqzr2fyjqBkXsBI8 MqRvXi1KKy1CJdY72kosz0jJLcxMwcXUMDM73c1OLixPTUnMSkYr3k/NxNjEDvMgDBDsaOf06 HGCU5mJREeVm+VYcL8SXlp1RmJBZnxBeV5qQWH2KU4eBQkuCdJVUbLiRYlJqeWpGWmQMMM5i0 BAePkgivOUiat7ggMbc4Mx0idYpRUUqc9xxIQgAkkVGaB9cGC+1LjLJSwryMQIcI8RSkFuVml qDKv2IU52BUEuadBjKFJzOvBG76K6DFTECLf7pUgywuSURISTUwKq6/rbkzU+2z6Kzb/6Rf7H 34dKP67Ned72U/8NQVb7zNbjVVOZqrN8Jv9Wf/5tPSvIH9c213/w07tujLVkf5WS/EnOZmcCp LXfBTcWic/PbZCV1J/adbLRcJCq68sYRRd63G+dWWB4pDrjAvqVTUU43Mtfc6PV3u49Xoh17v F5kKXrFb2yR3SYmlOCPRUIu5qDgRADHuFX9oAgAA X-Env-Sender: jgross@suse.com X-Msg-Ref: server-8.tower-21.messagelabs.com!1467816937!22547594!1 X-Originating-IP: [195.135.220.15] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 51716 invoked from network); 6 Jul 2016 14:55:37 -0000 Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by server-8.tower-21.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 6 Jul 2016 14:55:37 -0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 3904AAC80; Wed, 6 Jul 2016 14:55:37 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xen.org Date: Wed, 6 Jul 2016 16:55:31 +0200 Message-Id: <1467816934-7183-2-git-send-email-jgross@suse.com> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1467816934-7183-1-git-send-email-jgross@suse.com> References: <1467816934-7183-1-git-send-email-jgross@suse.com> Cc: Juergen Gross , wei.liu2@citrix.com, ian.jackson@eu.citrix.com Subject: [Xen-devel] [PATCH v2 1/4] libxl: add framework for device types X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Instead of duplicate coding for each device type (vtpms, usbctrls, ...) especially on domain creation introduce a framework for that purpose. Signed-off-by: Juergen Gross Acked-by: Ian Jackson --- V2: - add macro to fill struct libxl__device_type as suggested by Ian Jackson - make struct libxl__device_type variables const as requested by Ian Jackson --- tools/libxl/libxl.c | 3 + tools/libxl/libxl_create.c | 163 +++++++++++++------------------------------ tools/libxl/libxl_internal.h | 20 ++++++ tools/libxl/libxl_pvusb.c | 4 ++ 4 files changed, 76 insertions(+), 114 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 1c81239..b3deef0 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -7434,6 +7434,9 @@ out: return rc; } +DEFINE_DEVICE_TYPE_STRUCT(nic); +DEFINE_DEVICE_TYPE_STRUCT(vtpm); + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 1b99472..5e05f6f 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -742,12 +742,6 @@ static void domcreate_bootloader_done(libxl__egc *egc, static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *aodevs, int ret); -static void domcreate_attach_vtpms(libxl__egc *egc, libxl__multidev *multidev, - int ret); -static void domcreate_attach_usbctrls(libxl__egc *egc, - libxl__multidev *multidev, int ret); -static void domcreate_attach_usbdevs(libxl__egc *egc, libxl__multidev *multidev, - int ret); static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *aodevs, int ret); static void domcreate_attach_dtdev(libxl__egc *egc, @@ -1407,6 +1401,53 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev, domcreate_complete(egc, dcs, ret); } +static const struct libxl_device_type *device_type_tbl[] = { + &libxl__nic_devtype, + &libxl__vtpm_devtype, + &libxl__usbctrl_devtype, + &libxl__usbdev_devtype, +}; + +static void domcreate_attach_devices(libxl__egc *egc, + libxl__multidev *multidev, + int ret) +{ + libxl__domain_create_state *dcs = CONTAINER_OF(multidev, *dcs, multidev); + STATE_AO_GC(dcs->ao); + int domid = dcs->guest_domid; + libxl_domain_config *const d_config = dcs->guest_config; + const struct libxl_device_type *dt; + + if (ret) { + LOG(ERROR, "unable to add %s devices", + device_type_tbl[dcs->device_type_idx]->type); + goto error_out; + } + + dcs->device_type_idx++; + if (dcs->device_type_idx < ARRAY_SIZE(device_type_tbl)) { + dt = device_type_tbl[dcs->device_type_idx]; + if (*(int *)((void *)d_config + dt->num_offset) > 0) { + /* Attach devices */ + libxl__multidev_begin(ao, &dcs->multidev); + dcs->multidev.callback = domcreate_attach_devices; + dt->add(egc, ao, domid, d_config, &dcs->multidev); + libxl__multidev_prepared(egc, &dcs->multidev, 0); + return; + } + + domcreate_attach_devices(egc, &dcs->multidev, 0); + return; + } + + domcreate_attach_pci(egc, multidev, 0); + return; + +error_out: + assert(ret); + domcreate_complete(egc, dcs, ret); +} + static void domcreate_devmodel_started(libxl__egc *egc, libxl__dm_spawn_state *dmss, int ret) @@ -1430,113 +1471,8 @@ static void domcreate_devmodel_started(libxl__egc *egc, } } - /* Plug nic interfaces */ - if (d_config->num_nics > 0) { - /* Attach nics */ - libxl__multidev_begin(ao, &dcs->multidev); - dcs->multidev.callback = domcreate_attach_vtpms; - libxl__add_nics(egc, ao, domid, d_config, &dcs->multidev); - libxl__multidev_prepared(egc, &dcs->multidev, 0); - return; - } - - domcreate_attach_vtpms(egc, &dcs->multidev, 0); - return; - -error_out: - assert(ret); - domcreate_complete(egc, dcs, ret); -} - -static void domcreate_attach_vtpms(libxl__egc *egc, - libxl__multidev *multidev, - int ret) -{ - libxl__domain_create_state *dcs = CONTAINER_OF(multidev, *dcs, multidev); - STATE_AO_GC(dcs->ao); - int domid = dcs->guest_domid; - - libxl_domain_config* const d_config = dcs->guest_config; - - if(ret) { - LOG(ERROR, "unable to add nic devices"); - goto error_out; - } - - /* Plug vtpm devices */ - if (d_config->num_vtpms > 0) { - /* Attach vtpms */ - libxl__multidev_begin(ao, &dcs->multidev); - dcs->multidev.callback = domcreate_attach_usbctrls; - libxl__add_vtpms(egc, ao, domid, d_config, &dcs->multidev); - libxl__multidev_prepared(egc, &dcs->multidev, 0); - return; - } - - domcreate_attach_usbctrls(egc, multidev, 0); - return; - -error_out: - assert(ret); - domcreate_complete(egc, dcs, ret); -} - -static void domcreate_attach_usbctrls(libxl__egc *egc, - libxl__multidev *multidev, int ret) -{ - libxl__domain_create_state *dcs = CONTAINER_OF(multidev, *dcs, multidev); - STATE_AO_GC(dcs->ao); - int domid = dcs->guest_domid; - - libxl_domain_config *const d_config = dcs->guest_config; - - if (ret) { - LOG(ERROR, "unable to add vtpm devices"); - goto error_out; - } - - if (d_config->num_usbctrls > 0) { - /* Attach usbctrls */ - libxl__multidev_begin(ao, &dcs->multidev); - dcs->multidev.callback = domcreate_attach_usbdevs; - libxl__add_usbctrls(egc, ao, domid, d_config, &dcs->multidev); - libxl__multidev_prepared(egc, &dcs->multidev, 0); - return; - } - - domcreate_attach_usbdevs(egc, multidev, 0); - return; - -error_out: - assert(ret); - domcreate_complete(egc, dcs, ret); -} - - -static void domcreate_attach_usbdevs(libxl__egc *egc, libxl__multidev *multidev, - int ret) -{ - libxl__domain_create_state *dcs = CONTAINER_OF(multidev, *dcs, multidev); - STATE_AO_GC(dcs->ao); - int domid = dcs->guest_domid; - - libxl_domain_config *const d_config = dcs->guest_config; - - if (ret) { - LOG(ERROR, "unable to add usbctrl devices"); - goto error_out; - } - - if (d_config->num_usbdevs > 0) { - /* Attach usbctrls */ - libxl__multidev_begin(ao, &dcs->multidev); - dcs->multidev.callback = domcreate_attach_pci; - libxl__add_usbdevs(egc, ao, domid, d_config, &dcs->multidev); - libxl__multidev_prepared(egc, &dcs->multidev, 0); - return; - } - - domcreate_attach_pci(egc, multidev, 0); + dcs->device_type_idx = -1; + domcreate_attach_devices(egc, &dcs->multidev, 0); return; error_out: @@ -1556,7 +1492,6 @@ static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *multidev, libxl_domain_config *const d_config = dcs->guest_config; if (ret) { - LOG(ERROR, "unable to add usb devices"); goto error_out; } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index e7ab85d..d16161a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3389,6 +3389,25 @@ _hidden void libxl__bootloader_init(libxl__bootloader_state *bl); * If callback is passed rc==0, will have updated st->info appropriately */ _hidden void libxl__bootloader_run(libxl__egc*, libxl__bootloader_state *st); +/*----- Generic Device Handling -----*/ +struct libxl_device_type { + char *type; + int num_offset; /* Offset of # of devices in libxl_domain_config */ + void (*add)(libxl__egc *, libxl__ao *, uint32_t, libxl_domain_config *, + libxl__multidev *); +}; + +#define DEFINE_DEVICE_TYPE_STRUCT(name) \ + const struct libxl_device_type libxl__ ## name ## _devtype = { \ + .type = #name, \ + .num_offset = offsetof(libxl_domain_config, num_ ## name ## s), \ + .add = libxl__add_ ## name ## s, \ + } + +extern const struct libxl_device_type libxl__nic_devtype; +extern const struct libxl_device_type libxl__vtpm_devtype; +extern const struct libxl_device_type libxl__usbctrl_devtype; +extern const struct libxl_device_type libxl__usbdev_devtype; /*----- Domain destruction -----*/ /* Domain destruction has been split into two functions: @@ -3565,6 +3584,7 @@ struct libxl__domain_create_state { libxl_asyncprogress_how aop_console_how; /* private to domain_create */ int guest_domid; + int device_type_idx; const char *colo_proxy_script; libxl__domain_build_state build_state; libxl__colo_restore_state crs; diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index 885f0d4..5edd206 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -1667,6 +1667,10 @@ out: GC_FREE; return rc; } + +DEFINE_DEVICE_TYPE_STRUCT(usbctrl); +DEFINE_DEVICE_TYPE_STRUCT(usbdev); + /* * Local variables: * mode: C