From nobody Mon Feb 9 13:38:43 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=1569850460; cv=none; d=zoho.com; s=zohoarc; b=geyNLaE3sa2bXyW7LixTT1BwS+I6n6R1Z+Zn1fS/ufTHkMxsIjZmVanw8YNEljfxXJV+oajNZi7sx0vBoZrd5b6sBuF9ifCAFNLwObQo+XkTqq0OlbjIlT/XjW/tE9EiTHEpq2e5mIyBSjI9/OIFEBnrADPnAG3XEiN58j+Ztvs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569850460; 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=gUdR08xIZCJFdRiatt80efqgXoZqeTwFv1qwdr9XcwY=; b=MQ4ajhAs++A+xoXzIGbiD1X176CWoHxJHFjldaGKc8ZyevjrxqDMJf96WG6PjEEzbiVRxEO/p8S+65SgWyNjeZsNMdWtN6NV9boqYmF9D8IDy+EaNuW7ONyp4tviU+KB3+EZ+oNs88KyLSoWl1FAdADAWAvNwUQ1ILsicko84pg= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; 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 1569850460195186.485566711018; Mon, 30 Sep 2019 06:34:20 -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 1iEvnj-0005Q8-8J; Mon, 30 Sep 2019 13:33:19 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iEvni-0005Px-6h for xen-devel@lists.xenproject.org; Mon, 30 Sep 2019 13:33:18 +0000 Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by localhost (Halon) with ESMTPS id db3b0bf6-e386-11e9-bf31-bc764e2007e4; Mon, 30 Sep 2019 13:33:15 +0000 (UTC) X-Inumbo-ID: db3b0bf6-e386-11e9-bf31-bc764e2007e4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1569850396; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9Blv00RFTQvzGYHBzr0vl7Y+GF0UID2L5jPkblmPtck=; b=hJpyaeQwYp1GA392OpRSNg/1Ha6kEaHPV6eLYuh47Nn9AqTWaRkYMNO2 BDkow3hDvIMoG5nv3cstX2a5g+LVHGbsKUOKAf2SWeR+1dSI1w5WxMqCe 522ymJT9uptIRGOzvJJ1xqmomehCYZjkC/JuHaFOoWTQ8NfY435U8irfd c=; Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=roger.pau@citrix.com; spf=Pass smtp.mailfrom=roger.pau@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 (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of roger.pau@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of roger.pau@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@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 (esa3.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=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: QxLVRtxr/fZKnqYWwdKUl1EiSI+thFKDHJBMAb6ogSusr6s8mzli6G7/cQ5W1NMB8hIq4Y84cr kOYf+rpw/ppNJalxdHgxYXDVfgZl4ik+y1HSv8v5DmQMvfr+sb4/0y3b652I6IvintQ015lg5Y LIqufaqrEeICZe2BZ9vY9MS2ynSv5fiqcXm34yONvowqVPdMiXE40MRoLmOXiYD6jve/Ranzws qRJ1G0atToZ9bK3HW/dF4ofXHT2bxUUnsOO8Aqod/v1jwJjDLj2K6jQ0kkMP5Qh0EiLeNUVfRk LOI= X-SBRS: 2.7 X-MesageID: 6256429 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.64,567,1559534400"; d="scan'208";a="6256429" From: Roger Pau Monne To: Date: Mon, 30 Sep 2019 15:32:32 +0200 Message-ID: <20190930133238.49868-5-roger.pau@citrix.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190930133238.49868-1-roger.pau@citrix.com> References: <20190930133238.49868-1-roger.pau@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v3 04/10] ioreq: add internal ioreq initialization support 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: Andrew Cooper , Paul Durrant , Wei Liu , Jan Beulich , Roger Pau Monne Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Add support for internal ioreq servers to initialization and deinitialization routines, prevent some functions from being executed against internal ioreq servers and add guards to only allow internal callers to modify internal ioreq servers. External callers (ie: from hypercalls) are only allowed to deal with external ioreq servers. Signed-off-by: Roger Pau Monn=C3=A9 --- Changes since v2: - Return early from hvm_ioreq_server_init and hvm_ioreq_server_deinit if server is internal. - hvm_destroy_ioreq_server, hvm_get_ioreq_server_info and hvm_map_mem_type_to_ioreq_server can only be used against external servers, hence add an assert to that effect. - Simplify ASSERT in hvm_create_ioreq_server. Changes since v1: - Do not pass an 'internal' parameter to most functions, and instead use the id to key whether an ioreq server is internal or external. - Prevent enabling an internal server without a handler. --- xen/arch/x86/hvm/dm.c | 17 ++++- xen/arch/x86/hvm/ioreq.c | 119 ++++++++++++++++++++----------- xen/include/asm-x86/hvm/domain.h | 5 +- xen/include/asm-x86/hvm/ioreq.h | 8 ++- 4 files changed, 105 insertions(+), 44 deletions(-) diff --git a/xen/arch/x86/hvm/dm.c b/xen/arch/x86/hvm/dm.c index c2fca9f729..6a3682e58c 100644 --- a/xen/arch/x86/hvm/dm.c +++ b/xen/arch/x86/hvm/dm.c @@ -417,7 +417,7 @@ static int dm_op(const struct dmop_args *op_args) break; =20 rc =3D hvm_create_ioreq_server(d, data->handle_bufioreq, - &data->id); + &data->id, false); break; } =20 @@ -450,6 +450,9 @@ static int dm_op(const struct dmop_args *op_args) rc =3D -EINVAL; if ( data->pad ) break; + rc =3D -EPERM; + if ( hvm_ioreq_is_internal(data->id) ) + break; =20 rc =3D hvm_map_io_range_to_ioreq_server(d, data->id, data->type, data->start, data->end); @@ -464,6 +467,9 @@ static int dm_op(const struct dmop_args *op_args) rc =3D -EINVAL; if ( data->pad ) break; + rc =3D -EPERM; + if ( hvm_ioreq_is_internal(data->id) ) + break; =20 rc =3D hvm_unmap_io_range_from_ioreq_server(d, data->id, data->typ= e, data->start, data->end); @@ -481,6 +487,9 @@ static int dm_op(const struct dmop_args *op_args) rc =3D -EOPNOTSUPP; if ( !hap_enabled(d) ) break; + rc =3D -EPERM; + if ( hvm_ioreq_is_internal(data->id) ) + break; =20 if ( first_gfn =3D=3D 0 ) rc =3D hvm_map_mem_type_to_ioreq_server(d, data->id, @@ -528,6 +537,9 @@ static int dm_op(const struct dmop_args *op_args) rc =3D -EINVAL; if ( data->pad ) break; + rc =3D -EPERM; + if ( hvm_ioreq_is_internal(data->id) ) + break; =20 rc =3D hvm_set_ioreq_server_state(d, data->id, !!data->enabled); break; @@ -541,6 +553,9 @@ static int dm_op(const struct dmop_args *op_args) rc =3D -EINVAL; if ( data->pad ) break; + rc =3D -EPERM; + if ( hvm_ioreq_is_internal(data->id) ) + break; =20 rc =3D hvm_destroy_ioreq_server(d, data->id); break; diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c index ed0142c4e1..cdbd4244a4 100644 --- a/xen/arch/x86/hvm/ioreq.c +++ b/xen/arch/x86/hvm/ioreq.c @@ -59,10 +59,11 @@ static struct hvm_ioreq_server *get_ioreq_server(const = struct domain *d, /* * Iterate over all possible ioreq servers. * - * NOTE: The iteration is backwards such that more recently created - * ioreq servers are favoured in hvm_select_ioreq_server(). - * This is a semantic that previously existed when ioreq servers - * were held in a linked list. + * NOTE: The iteration is backwards such that internal and more recently + * created external ioreq servers are favoured in + * hvm_select_ioreq_server(). + * This is a semantic that previously existed for external servers w= hen + * ioreq servers were held in a linked list. */ #define FOR_EACH_IOREQ_SERVER(d, id, s) \ for ( (id) =3D MAX_NR_IOREQ_SERVERS; (id) !=3D 0; ) \ @@ -70,6 +71,12 @@ static struct hvm_ioreq_server *get_ioreq_server(const s= truct domain *d, continue; \ else =20 +#define FOR_EACH_EXTERNAL_IOREQ_SERVER(d, id, s) \ + for ( (id) =3D MAX_NR_EXTERNAL_IOREQ_SERVERS; (id) !=3D 0; ) \ + if ( !(s =3D GET_IOREQ_SERVER(d, --(id))) ) \ + continue; \ + else + static ioreq_t *get_ioreq(struct hvm_ioreq_server *s, struct vcpu *v) { shared_iopage_t *p =3D s->ioreq.va; @@ -86,7 +93,7 @@ bool hvm_io_pending(struct vcpu *v) struct hvm_ioreq_server *s; unsigned int id; =20 - FOR_EACH_IOREQ_SERVER(d, id, s) + FOR_EACH_EXTERNAL_IOREQ_SERVER(d, id, s) { struct hvm_ioreq_vcpu *sv; =20 @@ -190,7 +197,7 @@ bool handle_hvm_io_completion(struct vcpu *v) return false; } =20 - FOR_EACH_IOREQ_SERVER(d, id, s) + FOR_EACH_EXTERNAL_IOREQ_SERVER(d, id, s) { struct hvm_ioreq_vcpu *sv; =20 @@ -430,7 +437,7 @@ bool is_ioreq_server_page(struct domain *d, const struc= t page_info *page) =20 spin_lock_recursive(&d->arch.hvm.ioreq_server.lock); =20 - FOR_EACH_IOREQ_SERVER(d, id, s) + FOR_EACH_EXTERNAL_IOREQ_SERVER(d, id, s) { if ( (s->ioreq.page =3D=3D page) || (s->bufioreq.page =3D=3D page)= ) { @@ -688,7 +695,7 @@ static int hvm_ioreq_server_alloc_rangesets(struct hvm_= ioreq_server *s, return rc; } =20 -static void hvm_ioreq_server_enable(struct hvm_ioreq_server *s) +static void hvm_ioreq_server_enable(struct hvm_ioreq_server *s, bool inter= nal) { struct hvm_ioreq_vcpu *sv; =20 @@ -697,29 +704,40 @@ static void hvm_ioreq_server_enable(struct hvm_ioreq_= server *s) if ( s->enabled ) goto done; =20 - hvm_remove_ioreq_gfn(s, false); - hvm_remove_ioreq_gfn(s, true); + if ( !internal ) + { + hvm_remove_ioreq_gfn(s, false); + hvm_remove_ioreq_gfn(s, true); =20 - s->enabled =3D true; + list_for_each_entry ( sv, + &s->ioreq_vcpu_list, + list_entry ) + hvm_update_ioreq_evtchn(s, sv); + } + else if ( !s->handler ) + { + ASSERT_UNREACHABLE(); + goto done; + } =20 - list_for_each_entry ( sv, - &s->ioreq_vcpu_list, - list_entry ) - hvm_update_ioreq_evtchn(s, sv); + s->enabled =3D true; =20 done: spin_unlock(&s->lock); } =20 -static void hvm_ioreq_server_disable(struct hvm_ioreq_server *s) +static void hvm_ioreq_server_disable(struct hvm_ioreq_server *s, bool inte= rnal) { spin_lock(&s->lock); =20 if ( !s->enabled ) goto done; =20 - hvm_add_ioreq_gfn(s, true); - hvm_add_ioreq_gfn(s, false); + if ( !internal ) + { + hvm_add_ioreq_gfn(s, true); + hvm_add_ioreq_gfn(s, false); + } =20 s->enabled =3D false; =20 @@ -736,21 +754,21 @@ static int hvm_ioreq_server_init(struct hvm_ioreq_ser= ver *s, int rc; =20 s->target =3D d; + spin_lock_init(&s->lock); + + rc =3D hvm_ioreq_server_alloc_rangesets(s, id); + if ( hvm_ioreq_is_internal(id) || rc ) + return rc; =20 get_knownalive_domain(currd); - s->emulator =3D currd; =20 - spin_lock_init(&s->lock); + s->emulator =3D currd; INIT_LIST_HEAD(&s->ioreq_vcpu_list); spin_lock_init(&s->bufioreq_lock); =20 s->ioreq.gfn =3D INVALID_GFN; s->bufioreq.gfn =3D INVALID_GFN; =20 - rc =3D hvm_ioreq_server_alloc_rangesets(s, id); - if ( rc ) - return rc; - s->bufioreq_handling =3D bufioreq_handling; =20 for_each_vcpu ( d, v ) @@ -763,6 +781,7 @@ static int hvm_ioreq_server_init(struct hvm_ioreq_serve= r *s, return 0; =20 fail_add: + ASSERT(!hvm_ioreq_is_internal(id)); hvm_ioreq_server_remove_all_vcpus(s); hvm_ioreq_server_unmap_pages(s); =20 @@ -772,9 +791,15 @@ static int hvm_ioreq_server_init(struct hvm_ioreq_serv= er *s, return rc; } =20 -static void hvm_ioreq_server_deinit(struct hvm_ioreq_server *s) +static void hvm_ioreq_server_deinit(struct hvm_ioreq_server *s, bool inter= nal) { ASSERT(!s->enabled); + + hvm_ioreq_server_free_rangesets(s); + + if ( internal ) + return; + hvm_ioreq_server_remove_all_vcpus(s); =20 /* @@ -789,13 +814,11 @@ static void hvm_ioreq_server_deinit(struct hvm_ioreq_= server *s) hvm_ioreq_server_unmap_pages(s); hvm_ioreq_server_free_pages(s); =20 - hvm_ioreq_server_free_rangesets(s); - put_domain(s->emulator); } =20 int hvm_create_ioreq_server(struct domain *d, int bufioreq_handling, - ioservid_t *id) + ioservid_t *id, bool internal) { struct hvm_ioreq_server *s; unsigned int i; @@ -811,7 +834,9 @@ int hvm_create_ioreq_server(struct domain *d, int bufio= req_handling, domain_pause(d); spin_lock_recursive(&d->arch.hvm.ioreq_server.lock); =20 - for ( i =3D 0; i < MAX_NR_IOREQ_SERVERS; i++ ) + for ( i =3D (internal ? MAX_NR_EXTERNAL_IOREQ_SERVERS : 0); + i < (internal ? MAX_NR_IOREQ_SERVERS : MAX_NR_EXTERNAL_IOREQ_SER= VERS); + i++ ) { if ( !GET_IOREQ_SERVER(d, i) ) break; @@ -821,6 +846,10 @@ int hvm_create_ioreq_server(struct domain *d, int bufi= oreq_handling, if ( i >=3D MAX_NR_IOREQ_SERVERS ) goto fail; =20 + ASSERT(i < MAX_NR_EXTERNAL_IOREQ_SERVERS + ? !internal + : internal && i < MAX_NR_IOREQ_SERVERS); + /* * It is safe to call set_ioreq_server() prior to * hvm_ioreq_server_init() since the target domain is paused. @@ -855,6 +884,8 @@ int hvm_destroy_ioreq_server(struct domain *d, ioservid= _t id) struct hvm_ioreq_server *s; int rc; =20 + ASSERT(!hvm_ioreq_is_internal(id)); + spin_lock_recursive(&d->arch.hvm.ioreq_server.lock); =20 s =3D get_ioreq_server(d, id); @@ -864,6 +895,7 @@ int hvm_destroy_ioreq_server(struct domain *d, ioservid= _t id) goto out; =20 rc =3D -EPERM; + /* NB: internal servers cannot be destroyed. */ if ( s->emulator !=3D current->domain ) goto out; =20 @@ -871,13 +903,13 @@ int hvm_destroy_ioreq_server(struct domain *d, ioserv= id_t id) =20 p2m_set_ioreq_server(d, 0, id); =20 - hvm_ioreq_server_disable(s); + hvm_ioreq_server_disable(s, hvm_ioreq_is_internal(id)); =20 /* * It is safe to call hvm_ioreq_server_deinit() prior to * set_ioreq_server() since the target domain is paused. */ - hvm_ioreq_server_deinit(s); + hvm_ioreq_server_deinit(s, false); set_ioreq_server(d, id, NULL); =20 domain_unpause(d); @@ -900,6 +932,8 @@ int hvm_get_ioreq_server_info(struct domain *d, ioservi= d_t id, struct hvm_ioreq_server *s; int rc; =20 + ASSERT(!hvm_ioreq_is_internal(id)); + spin_lock_recursive(&d->arch.hvm.ioreq_server.lock); =20 s =3D get_ioreq_server(d, id); @@ -909,6 +943,7 @@ int hvm_get_ioreq_server_info(struct domain *d, ioservi= d_t id, goto out; =20 rc =3D -EPERM; + /* NB: don't allow fetching information from internal ioreq servers. */ if ( s->emulator !=3D current->domain ) goto out; =20 @@ -956,7 +991,7 @@ int hvm_get_ioreq_server_frame(struct domain *d, ioserv= id_t id, goto out; =20 rc =3D -EPERM; - if ( s->emulator !=3D current->domain ) + if ( hvm_ioreq_is_internal(id) || s->emulator !=3D current->domain ) goto out; =20 rc =3D hvm_ioreq_server_alloc_pages(s); @@ -1010,7 +1045,7 @@ int hvm_map_io_range_to_ioreq_server(struct domain *d= , ioservid_t id, goto out; =20 rc =3D -EPERM; - if ( s->emulator !=3D current->domain ) + if ( !hvm_ioreq_is_internal(id) && s->emulator !=3D current->domain ) goto out; =20 switch ( type ) @@ -1062,7 +1097,7 @@ int hvm_unmap_io_range_from_ioreq_server(struct domai= n *d, ioservid_t id, goto out; =20 rc =3D -EPERM; - if ( s->emulator !=3D current->domain ) + if ( !hvm_ioreq_is_internal(id) && s->emulator !=3D current->domain ) goto out; =20 switch ( type ) @@ -1108,6 +1143,8 @@ int hvm_map_mem_type_to_ioreq_server(struct domain *d= , ioservid_t id, struct hvm_ioreq_server *s; int rc; =20 + ASSERT(!hvm_ioreq_is_internal(id)); + if ( type !=3D HVMMEM_ioreq_server ) return -EINVAL; =20 @@ -1157,15 +1194,15 @@ int hvm_set_ioreq_server_state(struct domain *d, io= servid_t id, goto out; =20 rc =3D -EPERM; - if ( s->emulator !=3D current->domain ) + if ( !hvm_ioreq_is_internal(id) && s->emulator !=3D current->domain ) goto out; =20 domain_pause(d); =20 if ( enabled ) - hvm_ioreq_server_enable(s); + hvm_ioreq_server_enable(s, hvm_ioreq_is_internal(id)); else - hvm_ioreq_server_disable(s); + hvm_ioreq_server_disable(s, hvm_ioreq_is_internal(id)); =20 domain_unpause(d); =20 @@ -1184,7 +1221,7 @@ int hvm_all_ioreq_servers_add_vcpu(struct domain *d, = struct vcpu *v) =20 spin_lock_recursive(&d->arch.hvm.ioreq_server.lock); =20 - FOR_EACH_IOREQ_SERVER(d, id, s) + FOR_EACH_EXTERNAL_IOREQ_SERVER(d, id, s) { rc =3D hvm_ioreq_server_add_vcpu(s, v); if ( rc ) @@ -1218,7 +1255,7 @@ void hvm_all_ioreq_servers_remove_vcpu(struct domain = *d, struct vcpu *v) =20 spin_lock_recursive(&d->arch.hvm.ioreq_server.lock); =20 - FOR_EACH_IOREQ_SERVER(d, id, s) + FOR_EACH_EXTERNAL_IOREQ_SERVER(d, id, s) hvm_ioreq_server_remove_vcpu(s, v); =20 spin_unlock_recursive(&d->arch.hvm.ioreq_server.lock); @@ -1235,13 +1272,13 @@ void hvm_destroy_all_ioreq_servers(struct domain *d) =20 FOR_EACH_IOREQ_SERVER(d, id, s) { - hvm_ioreq_server_disable(s); + hvm_ioreq_server_disable(s, hvm_ioreq_is_internal(id)); =20 /* * It is safe to call hvm_ioreq_server_deinit() prior to * set_ioreq_server() since the target domain is being destroyed. */ - hvm_ioreq_server_deinit(s); + hvm_ioreq_server_deinit(s, hvm_ioreq_is_internal(id)); set_ioreq_server(d, id, NULL); =20 xfree(s); diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/dom= ain.h index 56a32e3e35..f09ce9b417 100644 --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -97,7 +97,10 @@ struct hvm_pi_ops { void (*vcpu_block)(struct vcpu *); }; =20 -#define MAX_NR_IOREQ_SERVERS 8 +#define MAX_NR_EXTERNAL_IOREQ_SERVERS 8 +#define MAX_NR_INTERNAL_IOREQ_SERVERS 1 +#define MAX_NR_IOREQ_SERVERS \ + (MAX_NR_EXTERNAL_IOREQ_SERVERS + MAX_NR_INTERNAL_IOREQ_SERVERS) =20 struct hvm_domain { /* Guest page range used for non-default ioreq servers */ diff --git a/xen/include/asm-x86/hvm/ioreq.h b/xen/include/asm-x86/hvm/iore= q.h index 65491c48d2..c3917aa74d 100644 --- a/xen/include/asm-x86/hvm/ioreq.h +++ b/xen/include/asm-x86/hvm/ioreq.h @@ -24,7 +24,7 @@ bool handle_hvm_io_completion(struct vcpu *v); bool is_ioreq_server_page(struct domain *d, const struct page_info *page); =20 int hvm_create_ioreq_server(struct domain *d, int bufioreq_handling, - ioservid_t *id); + ioservid_t *id, bool internal); int hvm_destroy_ioreq_server(struct domain *d, ioservid_t id); int hvm_get_ioreq_server_info(struct domain *d, ioservid_t id, unsigned long *ioreq_gfn, @@ -54,6 +54,12 @@ unsigned int hvm_broadcast_ioreq(ioreq_t *p, bool buffer= ed); =20 void hvm_ioreq_init(struct domain *d); =20 +static inline bool hvm_ioreq_is_internal(unsigned int id) +{ + ASSERT(id < MAX_NR_IOREQ_SERVERS); + return id >=3D MAX_NR_EXTERNAL_IOREQ_SERVERS; +} + #endif /* __ASM_X86_HVM_IOREQ_H__ */ =20 /* --=20 2.23.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel