From patchwork Fri Jun 14 11:24:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony PERARD X-Patchwork-Id: 10995105 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 071A11395 for ; Fri, 14 Jun 2019 11:29:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EA892285B3 for ; Fri, 14 Jun 2019 11:29:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DAEFF2848F; Fri, 14 Jun 2019 11:29:05 +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=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, 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 AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5B9212848F for ; Fri, 14 Jun 2019 11:29:05 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hbkN8-0008SQ-0u; Fri, 14 Jun 2019 11:27:54 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hbkN6-0008Rb-HF for xen-devel@lists.xenproject.org; Fri, 14 Jun 2019 11:27:52 +0000 X-Inumbo-ID: 703b6cfe-8e97-11e9-a07e-5be0cf5927e5 Received: from esa5.hc3370-68.iphmx.com (unknown [216.71.155.168]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 703b6cfe-8e97-11e9-a07e-5be0cf5927e5; Fri, 14 Jun 2019 11:27:49 +0000 (UTC) Authentication-Results: esa5.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=anthony.perard@citrix.com; spf=Pass smtp.mailfrom=anthony.perard@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa5.hc3370-68.iphmx.com: no sender authenticity information available from domain of anthony.perard@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa5.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa5.hc3370-68.iphmx.com: domain of anthony.perard@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa5.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa5.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa5.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: 4v17sPX06L0GBxB8o8zh5iKDAxoT+LV+GRHc9AD61XHVKOxA4m9E5NlPaNigXSqzmf+QBLMjJ0 HQr7lpgm8v7ZnLfRyXNthDcBCz9Za2etHpkdX55noCB8pem5ag/TNiepHcJheMZl1jv1M9Tb7a FTEsfiGqE7YY2ntTAHlhdHWoCJ+HV/gBki6lNCw9E/BZxgqZOlQQD8/K4rbV1Wvl63s/B9TrJX cL+vfYeA+yJiZks720zWchQauNS9aegAcFw6ZUhDTrVw/OsGR760SikPiax5z3ZTvMHjZ7m693 xO8= X-SBRS: 2.7 X-MesageID: 1724306 X-Ironport-Server: esa5.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.63,373,1557201600"; d="scan'208";a="1724306" From: Anthony PERARD To: Date: Fri, 14 Jun 2019 12:24:43 +0100 Message-ID: <20190614112444.29980-15-anthony.perard@citrix.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190614112444.29980-1-anthony.perard@citrix.com> References: <20190614112444.29980-1-anthony.perard@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 14/15] libxl_usb: usbctrl, make use of generic device handling functions X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Anthony PERARD , Ian Jackson , Wei Liu Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Two functions in generate `libxl_device_usbctrl' can be replaced by generic macro: - libxl_device_usbctrl_list -> LIBXL_DEFINE_DEVICE_LIST - libxl_devid_to_device_usbctrl -> LIBXL_DEFINE_DEVID_TO_DEVICE This patch only needs to define `libxl__usbctrl_devtype.from_xenstore' to makes use of them. Small change, libxl_devid_to_device_usbctrl doesn't list all usbctrl anymore before finding the right one. Signed-off-by: Anthony PERARD Acked-by: Ian Jackson --- tools/libxl/libxl_usb.c | 122 +++++++++++----------------------------- 1 file changed, 32 insertions(+), 90 deletions(-) diff --git a/tools/libxl/libxl_usb.c b/tools/libxl/libxl_usb.c index 9851fe8468..de49f8620c 100644 --- a/tools/libxl/libxl_usb.c +++ b/tools/libxl/libxl_usb.c @@ -563,81 +563,53 @@ void libxl__initiate_device_usbctrl_remove(libxl__egc *egc, return; } -libxl_device_usbctrl * -libxl_device_usbctrl_list(libxl_ctx *ctx, uint32_t domid, int *num) +static int libxl__usbctrl_from_xenstore(libxl__gc *gc, + const char *libxl_path, + libxl_devid devid, + libxl_device_usbctrl *usbctrl_r) { - GC_INIT(ctx); - libxl_device_usbctrl *usbctrls = NULL; - char *libxl_vusbs_path = NULL; - char **entry = NULL; - unsigned int nentries = 0; - - *num = 0; - - libxl_vusbs_path = GCSPRINTF("%s/device/%s", - libxl__xs_libxl_path(gc, domid), - libxl__device_kind_to_string(LIBXL__DEVICE_KIND_VUSB)); - entry = libxl__xs_directory(gc, XBT_NULL, libxl_vusbs_path, &nentries); - - if (entry && nentries) { - usbctrls = libxl__zalloc(NOGC, sizeof(*usbctrls) * nentries); - libxl_device_usbctrl *usbctrl; - libxl_device_usbctrl *end = usbctrls + nentries; - for (usbctrl = usbctrls; - usbctrl < end; - usbctrl++, entry++, (*num)++) { - const char *tmp, *be_path, *libxl_path; - int ret; - - libxl_device_usbctrl_init(usbctrl); - usbctrl->devid = atoi(*entry); + int rc; + const char *tmp; + const char *be_path; #define READ_SUBPATH(path, subpath) ({ \ - ret = libxl__xs_read_checked(gc, XBT_NULL, \ + rc = libxl__xs_read_checked(gc, XBT_NULL, \ GCSPRINTF("%s/" subpath, path), \ &tmp); \ - if (ret) goto out; \ + if (rc) goto out; \ (char *)tmp; \ }) #define READ_SUBPATH_INT(path, subpath) ({ \ - ret = libxl__xs_read_checked(gc, XBT_NULL, \ + rc = libxl__xs_read_checked(gc, XBT_NULL, \ GCSPRINTF("%s/" subpath, path), \ &tmp); \ - if (ret) goto out; \ + if (rc) goto out; \ tmp ? atoi(tmp) : -1; \ }) - libxl_path = GCSPRINTF("%s/%s", libxl_vusbs_path, *entry); - libxl_usbctrl_type_from_string(READ_SUBPATH(libxl_path, "type"), - &usbctrl->type); - if (usbctrl->type == LIBXL_USBCTRL_TYPE_DEVICEMODEL) { - be_path = libxl_path; - ret = libxl__get_domid(gc, &usbctrl->backend_domid); - } else { - be_path = READ_SUBPATH(libxl_path, "backend"); - if (!be_path) goto out; - ret = libxl__backendpath_parse_domid(gc, be_path, - &usbctrl->backend_domid); - } - if (ret) goto out; - usbctrl->version = READ_SUBPATH_INT(be_path, "usb-ver"); - usbctrl->ports = READ_SUBPATH_INT(be_path, "num-ports"); + usbctrl_r->devid = devid; + libxl_usbctrl_type_from_string(READ_SUBPATH(libxl_path, "type"), + &usbctrl_r->type); + if (usbctrl_r->type == LIBXL_USBCTRL_TYPE_DEVICEMODEL) { + be_path = libxl_path; + rc = libxl__get_domid(gc, &usbctrl_r->backend_domid); + } else { + be_path = READ_SUBPATH(libxl_path, "backend"); + if (!be_path) goto out; + rc = libxl__backendpath_parse_domid(gc, be_path, + &usbctrl_r->backend_domid); + } + if (rc) goto out; + usbctrl_r->version = READ_SUBPATH_INT(be_path, "usb-ver"); + usbctrl_r->ports = READ_SUBPATH_INT(be_path, "num-ports"); #undef READ_SUBPATH #undef READ_SUBPATH_INT - } - } - - GC_FREE; - return usbctrls; - out: - LOGD(ERROR, domid, "Unable to list USB Controllers"); - libxl_device_usbctrl_list_free(usbctrls, *num); - GC_FREE; - *num = 0; - return NULL; + if (rc) + libxl_device_usbctrl_dispose(usbctrl_r); + return rc; } int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, @@ -705,30 +677,6 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, return rc; } -int libxl_devid_to_device_usbctrl(libxl_ctx *ctx, - uint32_t domid, - int devid, - libxl_device_usbctrl *usbctrl) -{ - libxl_device_usbctrl *usbctrls; - int nb = 0; - int i, rc; - - usbctrls = libxl_device_usbctrl_list(ctx, domid, &nb); - if (!usbctrls) return ERROR_FAIL; - - rc = ERROR_FAIL; - for (i = 0; i < nb; i++) { - if (devid == usbctrls[i].devid) { - libxl_device_usbctrl_copy(ctx, usbctrl, &usbctrls[i]); - rc = 0; - break; - } - } - - libxl_device_usbctrl_list_free(usbctrls, nb); - return rc; -} static char *usbdev_busaddr_to_busid(libxl__gc *gc, int bus, int addr) { @@ -1945,15 +1893,6 @@ static int libxl_device_usbdev_compare(const libxl_device_usbdev *d1, return COMPARE_USB(d1, d2); } -void libxl_device_usbctrl_list_free(libxl_device_usbctrl *list, int nr) -{ - int i; - - for (i = 0; i < nr; i++) - libxl_device_usbctrl_dispose(&list[i]); - free(list); -} - void libxl_device_usbdev_list_free(libxl_device_usbdev *list, int nr) { int i; @@ -1965,7 +1904,10 @@ void libxl_device_usbdev_list_free(libxl_device_usbdev *list, int nr) #define libxl__device_usbctrl_update_devid NULL +LIBXL_DEFINE_DEVID_TO_DEVICE(usbctrl) +LIBXL_DEFINE_DEVICE_LIST(usbctrl) DEFINE_DEVICE_TYPE_STRUCT(usbctrl, VUSB, + .from_xenstore = (device_from_xenstore_fn_t)libxl__usbctrl_from_xenstore, .dm_needed = libxl_device_usbctrl_dm_needed );