From nobody Mon Feb 9 09:33:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1564761561; cv=none; d=zoho.com; s=zohoarc; b=P0hhF9asIPIYxZpbE3C32wz/yha4bSvA5oQTJN9pTW7dmVAHW3F9rGUOD3fu43ejqLxsb8hVF2cFrXWY84TVhso1NWOBHNwBVWDhKCP7JgMrpV8qgD1csbUawYCHRSruOeJJdUUuZvATlake1cTPj8ppHoGqfjgOU5M38qQpUfc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1564761561; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=mkKeiZAXC82nLvhtRWBWWL7gYM8BoaCMzDa3xmbpPVo=; b=DVYhBL5KQ77EHyEy5yGRF0Srgsfbb+xpxMYI/oGo/vSi8KrC6x6LQzrvErbZavwK96VhCpMVkdwKhDx2LU6GuL8KtSeT/e2T3wqukhIb1uayGGnEydTIjpPjD43RwbzPoysG7ClhPo4Pg70wiXy9RwQvhBYM8eJ+T9AkAoULqwg= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1564761561314790.8356218696197; Fri, 2 Aug 2019 08:59:21 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1htZwX-0005xT-ES; Fri, 02 Aug 2019 15:58:09 +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 1htZwV-0005vs-JV for xen-devel@lists.xenproject.org; Fri, 02 Aug 2019 15:58:07 +0000 Received: from esa6.hc3370-68.iphmx.com (unknown [216.71.155.175]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 4f42198a-b53e-11e9-9f66-bfeb907b07a4; Fri, 02 Aug 2019 15:58:03 +0000 (UTC) X-Inumbo-ID: 4f42198a-b53e-11e9-9f66-bfeb907b07a4 Authentication-Results: esa6.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 (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa6.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=esa6.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa6.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=esa6.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 (esa6.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=esa6.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: N/1+5RGIHt0R9CTfuy+zTQP3BJ3FEFis3qiIUWqOhgv6OV/26UgNFtt2Qx1NmGDoW3/TIscFWu GE92YkzOD8jPL23D/h9HuJPpGav+VZfEtzW2zLyzIg0uMNQ34Y8UlxCdXS/MokZcO2VyJBl+/L 8BRRvezczTpw6mXJUHl9LIIMPgWHzwe1nkTjQYbSRaPDcpPWd2ZbZkze7jEV+vuyfH1HNgMYm5 /aPizX/a+7u6JcjhKfZIPfPC2NTgK0xbXeRgPUISfjU2JpzaGIzM4BpqCLP1UszF016hq0p7pH Etc= X-SBRS: 2.7 X-MesageID: 3931669 X-Ironport-Server: esa6.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.64,338,1559534400"; d="scan'208";a="3931669" From: Anthony PERARD To: Date: Fri, 2 Aug 2019 16:36:00 +0100 Message-ID: <20190802153606.32061-30-anthony.perard@citrix.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190802153606.32061-1-anthony.perard@citrix.com> References: <20190802153606.32061-1-anthony.perard@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 29/35] libxl_pci: Use libxl__ao_device with pci_remove 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 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" This is in preparation of using asynchronous operation to communicate with QEMU via QMP (libxl__ev_qmp). Signed-off-by: Anthony PERARD Acked-by: Ian Jackson --- tools/libxl/libxl_domain.c | 49 ++++++-- tools/libxl/libxl_internal.h | 6 +- tools/libxl/libxl_pci.c | 221 ++++++++++++++++++++++++++--------- 3 files changed, 210 insertions(+), 66 deletions(-) diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c index f3c39fa86f..cd71900350 100644 --- a/tools/libxl/libxl_domain.c +++ b/tools/libxl/libxl_domain.c @@ -1104,6 +1104,9 @@ static void destroy_finish_check(libxl__egc *egc, } =20 /* Callbacks for libxl__destroy_domid */ +static void destroy_domid_pci_done(libxl__egc *egc, + libxl__multidev *multidev, + int rc); static void dm_destroy_cb(libxl__egc *egc, libxl__destroy_devicemodel_state *ddms, int rc); @@ -1120,8 +1123,7 @@ void libxl__destroy_domid(libxl__egc *egc, libxl__des= troy_domid_state *dis) { STATE_AO_GC(dis->ao); uint32_t domid =3D dis->domid; - int rc, dm_present; - int r; + int rc; =20 libxl__ev_child_init(&dis->destroyer); =20 @@ -1135,6 +1137,41 @@ void libxl__destroy_domid(libxl__egc *egc, libxl__de= stroy_domid_state *dis) goto out; } =20 + libxl__multidev_begin(ao, &dis->multidev); + dis->multidev.callback =3D destroy_domid_pci_done; + libxl__device_pci_destroy_all(egc, domid, &dis->multidev); + libxl__multidev_prepared(egc, &dis->multidev, 0); + return; + +out: + assert(rc); + dis->callback(egc, dis, rc); +} + +static void destroy_domid_pci_done(libxl__egc *egc, + libxl__multidev *multidev, + int rc) +{ + STATE_AO_GC(multidev->ao); + libxl__destroy_domid_state *dis =3D + CONTAINER_OF(multidev, *dis, multidev); + int dm_present; + int r; + + /* Convenience aliases */ + libxl_domid domid =3D dis->domid; + + if (rc) { + LOGD(ERROR, domid, "Pci shutdown failed"); + goto out; + } + + r =3D xc_domain_pause(CTX->xch, domid); + if (r < 0) { + LOGEVD(ERROR, r, domid, "xc_domain_pause failed"); + rc =3D ERROR_FAIL; + } + switch (libxl__domain_type(gc, domid)) { case LIBXL_DOMAIN_TYPE_HVM: if (libxl_get_stubdom_id(CTX, domid)) { @@ -1153,14 +1190,6 @@ void libxl__destroy_domid(libxl__egc *egc, libxl__de= stroy_domid_state *dis) abort(); } =20 - if (libxl__device_pci_destroy_all(gc, domid) < 0) - LOGD(ERROR, domid, "Pci shutdown failed"); - r =3D xc_domain_pause(CTX->xch, domid); - if (r < 0) { - LOGEVD(ERROR, r, domid, "xc_domain_pause failed"); - rc =3D ERROR_FAIL; - } - if (dm_present) { dis->ddms.ao =3D ao; dis->ddms.domid =3D domid; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 277e322e09..ca3d3c7090 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -199,6 +199,7 @@ typedef struct libxl__carefd libxl__carefd; typedef struct libxl__ev_lock libxl__ev_lock; typedef struct libxl__dm_resume_state libxl__dm_resume_state; typedef struct libxl__ao_device libxl__ao_device; +typedef struct libxl__multidev libxl__multidev; =20 typedef struct libxl__domain_create_state libxl__domain_create_state; typedef void libxl__domain_create_cb(struct libxl__egc *egc, @@ -1596,7 +1597,8 @@ _hidden int libxl__pci_topology_init(libxl__gc *gc, _hidden void libxl__device_pci_add(libxl__egc *egc, uint32_t domid, libxl_device_pci *pcidev, bool starting, libxl__ao_device *aodev); -_hidden int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid); +_hidden void libxl__device_pci_destroy_all(libxl__egc *egc, uint32_t domid, + libxl__multidev *); _hidden bool libxl__is_igd_vga_passthru(libxl__gc *gc, const libxl_domain_config *d_confi= g); =20 @@ -2572,7 +2574,6 @@ _hidden void libxl__kill(libxl__gc *gc, pid_t pid, in= t sig, const char *what); =20 /*----- device addition/removal -----*/ =20 -typedef struct libxl__multidev libxl__multidev; typedef void libxl__device_callback(libxl__egc*, libxl__ao_device*); =20 /* This functions sets the necessary libxl__ao_device struct values to use @@ -3919,6 +3920,7 @@ struct libxl__destroy_domid_state { libxl__destroy_devicemodel_state ddms; libxl__ev_child destroyer; bool soft_reset; + libxl__multidev multidev; }; =20 struct libxl__domain_destroy_state { diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 3477f3aba6..a5f700f0bf 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -1730,24 +1730,47 @@ static int qemu_pci_remove_xenstore(libxl__gc *gc, = uint32_t domid, return 0; } =20 -static int libxl__device_pci_remove_common(libxl__gc *gc, uint32_t domid, - libxl_device_pci *pcidev, int f= orce); - -static int do_pci_remove(libxl__gc *gc, uint32_t domid, - libxl_device_pci *pcidev, int force) +typedef struct pci_remove_state { + libxl__ao_device *aodev; + libxl_domid domid; + libxl_device_pci *pcidev; + bool force; + bool hvm; + unsigned int orig_vdev; + unsigned int pfunc_mask; + int next_func; + libxl__ao_device stubdom_aodev; +} pci_remove_state; + +static void libxl__device_pci_remove_common(libxl__egc *egc, + uint32_t domid, libxl_device_pci *pcidev, bool force, + libxl__ao_device *aodev); +static void device_pci_remove_common_next(libxl__egc *egc, + pci_remove_state *prs, int rc); +static void pci_remove_detatched(libxl__egc *egc, + pci_remove_state *prs, int rc); +static void pci_remove_stubdom_done(libxl__egc *egc, + libxl__ao_device *aodev); +static void pci_remove_done(libxl__egc *egc, + pci_remove_state *prs, int rc); + +static void do_pci_remove(libxl__egc *egc, uint32_t domid, + libxl_device_pci *pcidev, int force, + pci_remove_state *prs) { + STATE_AO_GC(prs->aodev->ao); libxl_ctx *ctx =3D libxl__gc_owner(gc); libxl_device_pci *assigned; libxl_domain_type type =3D libxl__domain_type(gc, domid); - int hvm =3D 0, rc, num; - int stubdomid =3D 0; + int rc, num; uint32_t domainid =3D domid; - bool isstubdom =3D libxl_is_stubdom(ctx, domid, &domainid); - =20 assigned =3D libxl_device_pci_list(ctx, domid, &num); - if ( assigned =3D=3D NULL ) - return ERROR_FAIL; + if (assigned =3D=3D NULL) { + rc =3D ERROR_FAIL; + goto out_fail; + } + libxl__ptr_add(gc, assigned); =20 rc =3D ERROR_INVAL; if ( !is_pcidev_in_array(assigned, num, pcidev->domain, @@ -1758,7 +1781,7 @@ static int do_pci_remove(libxl__gc *gc, uint32_t domi= d, =20 rc =3D ERROR_FAIL; if (type =3D=3D LIBXL_DOMAIN_TYPE_HVM) { - hvm =3D 1; + prs->hvm =3D true; switch (libxl__device_model_version_running(gc, domid)) { case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: if (libxl__wait_for_device_model_deprecated(gc, domid, @@ -1821,7 +1844,7 @@ static int do_pci_remove(libxl__gc *gc, uint32_t domi= d, f =3D fopen(sysfs_path, "r"); if (f =3D=3D NULL) { LOGED(ERROR, domainid, "Couldn't open %s", sysfs_path); - goto out; + goto skip_irq; } if ((fscanf(f, "%u", &irq) =3D=3D 1) && irq) { rc =3D xc_physdev_unmap_pirq(ctx->xch, domid, irq); @@ -1835,52 +1858,134 @@ static int do_pci_remove(libxl__gc *gc, uint32_t d= omid, } fclose(f); } -out: +skip_irq: + rc =3D 0; +out_fail: + pci_remove_detatched(egc, prs, rc); +} + +static void pci_remove_detatched(libxl__egc *egc, + pci_remove_state *prs, + int rc) +{ + STATE_AO_GC(prs->aodev->ao); + int stubdomid =3D 0; + uint32_t domainid =3D prs->domid; + bool isstubdom; + + /* Convenience aliases */ + libxl_device_pci *const pcidev =3D prs->pcidev; + libxl_domid domid =3D prs->domid; + + if (rc) goto out; + + isstubdom =3D libxl_is_stubdom(CTX, domid, &domainid); + /* don't do multiple resets while some functions are still passed thro= ugh */ if ( (pcidev->vdevfn & 0x7) =3D=3D 0 ) { libxl__device_pci_reset(gc, pcidev->domain, pcidev->bus, pcidev->d= ev, pcidev->func); } =20 if (!isstubdom) { - rc =3D xc_deassign_device(ctx->xch, domid, pcidev_encode_bdf(pcide= v)); - if (rc < 0 && (hvm || errno !=3D ENOSYS)) + rc =3D xc_deassign_device(CTX->xch, domid, pcidev_encode_bdf(pcide= v)); + if (rc < 0 && (prs->hvm || errno !=3D ENOSYS)) LOGED(ERROR, domainid, "xc_deassign_device failed"); } =20 - stubdomid =3D libxl_get_stubdom_id(ctx, domid); + stubdomid =3D libxl_get_stubdom_id(CTX, domid); if (stubdomid !=3D 0) { - libxl_device_pci pcidev_s =3D *pcidev; - libxl__device_pci_remove_common(gc, stubdomid, &pcidev_s, force); - } + libxl_device_pci *pcidev_s; + libxl__ao_device *const stubdom_aodev =3D &prs->stubdom_aodev; + + GCNEW(pcidev_s); + libxl_device_pci_init(pcidev_s); + libxl_device_pci_copy(CTX, pcidev_s, pcidev); =20 - libxl__device_pci_remove_xenstore(gc, domid, pcidev); + libxl__prepare_ao_device(ao, stubdom_aodev); + stubdom_aodev->action =3D LIBXL__DEVICE_ACTION_REMOVE; + stubdom_aodev->callback =3D pci_remove_stubdom_done; + stubdom_aodev->update_json =3D prs->aodev->update_json; + libxl__device_pci_remove_common(egc, stubdomid, pcidev_s, + prs->force, stubdom_aodev); + return; + } =20 rc =3D 0; -out_fail: - free(assigned); - return rc; +out: + pci_remove_done(egc, prs, rc); +} + +static void pci_remove_stubdom_done(libxl__egc *egc, + libxl__ao_device *aodev) +{ + pci_remove_state *prs =3D CONTAINER_OF(aodev, *prs, stubdom_aodev); =20 + pci_remove_done(egc, prs, 0); } =20 -static int libxl__device_pci_remove_common(libxl__gc *gc, uint32_t domid, - libxl_device_pci *pcidev, int f= orce) +static void pci_remove_done(libxl__egc *egc, + pci_remove_state *prs, + int rc) { - unsigned int orig_vdev, pfunc_mask; - int i, rc; + EGC_GC; =20 - orig_vdev =3D pcidev->vdevfn & ~7U; + if (rc) goto out; + + libxl__device_pci_remove_xenstore(gc, prs->domid, prs->pcidev); +out: + device_pci_remove_common_next(egc, prs, rc); +} + +static void libxl__device_pci_remove_common(libxl__egc *egc, + uint32_t domid, + libxl_device_pci *pcidev, + bool force, + libxl__ao_device *aodev) +{ + STATE_AO_GC(aodev->ao); + int rc; + pci_remove_state *prs; + + GCNEW(prs); + prs->aodev =3D aodev; + prs->domid =3D domid; + prs->pcidev =3D pcidev; + prs->force =3D force; + + prs->orig_vdev =3D pcidev->vdevfn & ~7U; =20 if ( pcidev->vfunc_mask =3D=3D LIBXL_PCI_FUNC_ALL ) { - if ( pci_multifunction_check(gc, pcidev, &pfunc_mask) ) { + if ( pci_multifunction_check(gc, pcidev, &prs->pfunc_mask) ) { rc =3D ERROR_FAIL; goto out; } - pcidev->vfunc_mask &=3D pfunc_mask; + pcidev->vfunc_mask &=3D prs->pfunc_mask; }else{ - pfunc_mask =3D (1 << pcidev->func); + prs->pfunc_mask =3D (1 << pcidev->func); } =20 - for(rc =3D 0, i =3D 7; i >=3D 0; --i) { + rc =3D 0; + prs->next_func =3D 7; +out: + device_pci_remove_common_next(egc, prs, rc); +} + +static void device_pci_remove_common_next(libxl__egc *egc, + pci_remove_state *prs, + int rc) +{ + /* Convenience aliases */ + libxl_domid domid =3D prs->domid; + libxl_device_pci *const pcidev =3D prs->pcidev; + libxl__ao_device *const aodev =3D prs->aodev; + const unsigned int pfunc_mask =3D prs->pfunc_mask; + const unsigned int orig_vdev =3D prs->orig_vdev; + + if (rc) goto out; + + while (prs->next_func >=3D 0) { + const int i =3D prs->next_func; + prs->next_func--; if ( (1 << i) & pfunc_mask ) { if ( pcidev->vfunc_mask =3D=3D pfunc_mask ) { pcidev->func =3D i; @@ -1888,13 +1993,15 @@ static int libxl__device_pci_remove_common(libxl__g= c *gc, uint32_t domid, }else{ pcidev->vdevfn =3D orig_vdev; } - if ( do_pci_remove(gc, domid, pcidev, force) ) - rc =3D ERROR_FAIL; + do_pci_remove(egc, domid, pcidev, prs->force, prs); + return; } } =20 + rc =3D 0; out: - return rc; + aodev->rc =3D rc; + aodev->callback(egc, aodev); } =20 int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, @@ -1903,11 +2010,14 @@ int libxl_device_pci_remove(libxl_ctx *ctx, uint32_= t domid, =20 { AO_CREATE(ctx, domid, ao_how); - int rc; - - rc =3D libxl__device_pci_remove_common(gc, domid, pcidev, 0); + libxl__ao_device *aodev; =20 - libxl__ao_complete(egc, ao, rc); + GCNEW(aodev); + libxl__prepare_ao_device(ao, aodev); + aodev->action =3D LIBXL__DEVICE_ACTION_REMOVE; + aodev->callback =3D device_addrm_aocomplete; + aodev->update_json =3D true; + libxl__device_pci_remove_common(egc, domid, pcidev, false, aodev); return AO_INPROGRESS; } =20 @@ -1916,11 +2026,14 @@ int libxl_device_pci_destroy(libxl_ctx *ctx, uint32= _t domid, const libxl_asyncop_how *ao_how) { AO_CREATE(ctx, domid, ao_how); - int rc; - - rc =3D libxl__device_pci_remove_common(gc, domid, pcidev, 1); + libxl__ao_device *aodev; =20 - libxl__ao_complete(egc, ao, rc); + GCNEW(aodev); + libxl__prepare_ao_device(ao, aodev); + aodev->action =3D LIBXL__DEVICE_ACTION_REMOVE; + aodev->callback =3D device_addrm_aocomplete; + aodev->update_json =3D true; + libxl__device_pci_remove_common(egc, domid, pcidev, true, aodev); return AO_INPROGRESS; } =20 @@ -2004,27 +2117,27 @@ libxl_device_pci *libxl_device_pci_list(libxl_ctx *= ctx, uint32_t domid, int *num return pcidevs; } =20 -int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid) +void libxl__device_pci_destroy_all(libxl__egc *egc, uint32_t domid, + libxl__multidev *multidev) { - libxl_ctx *ctx =3D libxl__gc_owner(gc); + STATE_AO_GC(multidev->ao); libxl_device_pci *pcidevs; - int num, i, rc =3D 0; + int num, i; =20 - pcidevs =3D libxl_device_pci_list(ctx, domid, &num); + pcidevs =3D libxl_device_pci_list(CTX, domid, &num); if ( pcidevs =3D=3D NULL ) - return 0; + return; + libxl__ptr_add(gc, pcidevs); =20 for (i =3D 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_common(gc, domid, pcidevs + i, 1) < 0) - rc =3D ERROR_FAIL; + libxl__ao_device *aodev =3D libxl__multidev_prepare(multidev); + libxl__device_pci_remove_common(egc, domid, pcidevs + i, true, + aodev); } - - free(pcidevs); - return rc; } =20 int libxl__grant_vga_iomem_permission(libxl__gc *gc, const uint32_t domid, --=20 Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel