[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH v3 01/10] xen: introduce XEN_DOMCTL_CDF_INTERNAL_directmap


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Penny Zheng <Penny.Zheng@xxxxxxx>
  • Date: Tue, 7 Dec 2021 10:00:23 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1U8HZltCjB2Dq0uzD4G48CGrv/LQ+KSpPV4spPrw7oQ=; b=ZtZNGDPwJlDPzf7h7hucC+myjYzGEJvGxu/D4m733QLXnvt/Leb8HASAuEedsSM+xtx5jghOyB/DrtV0N5yMh36e07ct5ME8DBLOAtmFNunIyLakB3WvwufuWls0lJChwSfsE9sLyggb8fBrmOvG5vwEUYkM/oJxCrs8j+9AFFCyTYbmIMHmJC5Es1jUD6tAiJRJgK08w9IVf7dJtNe218AA6jgtI09Z1GkbW9qOxI4q1Nusqi4E1OC5e2wtkKsUESVlDQGZxn+fe+g8SdJTTEUC7RWRe29jxhZfis86gj5Shck1RF9RrbexJsipWVcEKVtZoD65eM6irSI2sYJRug==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ERQ9KMKTfPYfG9XQ9K9kssW+KiQ31n2EehEhjHKjZtEcx7Kp/KxnR0qxYW/k6Xfcf3U8Gq1dFZe1XPHyw8R0zltWXkPtaECJPxDErN3wNAqS1+a2CFwHRF2cPtQPgI3vU1z0kj/52E7BtXoXajYLzZdN0PAslqlIqcEWsTM5c17fwte3inXaU/27jMeH0wvcTQM/3Uq41HtsiH3qFctdblJFajdsiI8mw9kSszNbhbEHZIRiea0zZWZeSUSeYIGJIL2ZsGAGuprHZKXhC6ZeNppCrLBEjZF94aH9FvK6avN2YvI35I7yz5NaeQ1ud1am/vr5TnHUaP6vTHOZ5HmagQ==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: Wei Chen <Wei.Chen@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Michal Orzel <Michal.Orzel@xxxxxxx>, "julien@xxxxxxx" <julien@xxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Tue, 07 Dec 2021 10:00:46 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHX2qqMLpGJ0kZySkyR2zVz1q+w86wm3QoggAAHMICAAAc0sA==
  • Thread-topic: [PATCH v3 01/10] xen: introduce XEN_DOMCTL_CDF_INTERNAL_directmap

Hi jan

> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: Tuesday, December 7, 2021 5:28 PM
> To: Penny Zheng <Penny.Zheng@xxxxxxx>
> Cc: Wei Chen <Wei.Chen@xxxxxxx>; Bertrand Marquis
> <Bertrand.Marquis@xxxxxxx>; Michal Orzel <Michal.Orzel@xxxxxxx>;
> julien@xxxxxxx; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Subject: Re: [PATCH v3 01/10] xen: introduce
> XEN_DOMCTL_CDF_INTERNAL_directmap
> 
> On 07.12.2021 10:15, Penny Zheng wrote:
> > Hi guys
> >
> >> -----Original Message-----
> >> From: Penny Zheng <penny.zheng@xxxxxxx>
> >> Sent: Tuesday, November 16, 2021 1:25 PM
> >> To: Penny Zheng <Penny.Zheng@xxxxxxx>
> >> Cc: nd <nd@xxxxxxx>
> >> Subject: [PATCH v3 01/10] xen: introduce
> >> XEN_DOMCTL_CDF_INTERNAL_directmap
> >>
> >> From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
> >>
> >> This commit introduces a new arm-specific flag
> >> XEN_DOMCTL_CDF_INTERNAL_directmap to specify that a domain should
> >> have its memory direct-map(guest physical address == physical
> >> address) at domain creation.
> >>
> >> Since this flag is only available for domain created by XEN, not
> >> exposed to the toolstack, we name it with extra "INTERNAL" to
> >> distinguish from other public XEN_DOMCTL_CDF_xxx flags, and add
> >> comments to warn developers not to accidently use its bitfield when
> introducing new XEN_DOMCTL_CDF_xxx flag.
> >>
> >> Refine is_domain_direct_mapped to check whether the flag
> >> XEN_DOMCTL_CDF_INTERNAL_directmap is set.
> >>
> >> Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> >> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
> >> ---
> >> CC: andrew.cooper3@xxxxxxxxxx
> >> CC: jbeulich@xxxxxxxx
> >> CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
> >> CC: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> >> CC: Wei Liu <wl@xxxxxxx>
> >> CC: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>
> >> ---
> >> v2 changes
> >> - remove the introduce of internal flag
> >> - remove flag direct_map since we already store this flag in
> >> d->options
> >> - Refine is_domain_direct_mapped to check whether the flag
> >> XEN_DOMCTL_CDF_directmap is set
> >> - reword "1:1 direct-map" to just "direct-map"
> >> ---
> >> v3 changes
> >> - move flag back to xen/include/xen/domain.h, to let it be only
> >> available for domain created by XEN.
> >> - name it with extra "INTERNAL" and add comments to warn developers
> >> not to accidently use its bitfield when introducing new
> XEN_DOMCTL_CDF_xxx flag.
> >> - reject this flag in x86'es arch_sanitise_domain_config()
> >> ---
> >>  xen/arch/arm/domain.c        | 3 ++-
> >>  xen/arch/arm/domain_build.c  | 4 +++-
> >>  xen/arch/x86/domain.c        | 6 ++++++
> >>  xen/common/domain.c          | 3 ++-
> >>  xen/include/asm-arm/domain.h | 4 ++--  xen/include/public/domctl.h
> >> | 4 ++++
> >>  xen/include/xen/domain.h     | 3 +++
> >>  7 files changed, 22 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index
> >> 96e1b23550..d77265c03f 100644
> >> --- a/xen/arch/arm/domain.c
> >> +++ b/xen/arch/arm/domain.c
> >> @@ -629,7 +629,8 @@ int arch_sanitise_domain_config(struct
> >> xen_domctl_createdomain *config)  {
> >>      unsigned int max_vcpus;
> >>      unsigned int flags_required = (XEN_DOMCTL_CDF_hvm |
> >> XEN_DOMCTL_CDF_hap);
> >> -    unsigned int flags_optional = (XEN_DOMCTL_CDF_iommu |
> >> XEN_DOMCTL_CDF_vpmu);
> >> +    unsigned int flags_optional = (XEN_DOMCTL_CDF_iommu |
> >> XEN_DOMCTL_CDF_vpmu |
> >> +
> >> + XEN_DOMCTL_CDF_INTERNAL_directmap);
> >>
> >>      if ( (config->flags & ~flags_optional) != flags_required )
> >>      {
> >> diff --git a/xen/arch/arm/domain_build.c
> >> b/xen/arch/arm/domain_build.c index 19487c79da..664c88ebe4 100644
> >> --- a/xen/arch/arm/domain_build.c
> >> +++ b/xen/arch/arm/domain_build.c
> >> @@ -3089,8 +3089,10 @@ static int __init construct_dom0(struct domain
> >> *d) void __init create_dom0(void)  {
> >>      struct domain *dom0;
> >> +    /* DOM0 has always its memory direct-map. */
> >>      struct xen_domctl_createdomain dom0_cfg = {
> >> -        .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap,
> >> +        .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap |
> >> +                 XEN_DOMCTL_CDF_INTERNAL_directmap,
> >>          .max_evtchn_port = -1,
> >>          .max_grant_frames = gnttab_dom0_frames(),
> >>          .max_maptrack_frames = -1,
> >> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index
> >> ef1812dc14..eba6502218 100644
> >> --- a/xen/arch/x86/domain.c
> >> +++ b/xen/arch/x86/domain.c
> >> @@ -692,6 +692,12 @@ int arch_sanitise_domain_config(struct
> >> xen_domctl_createdomain *config)
> >>          return -EINVAL;
> >>      }
> >>
> >> +    if ( config->flags & XEN_DOMCTL_CDF_INTERNAL_directmap )
> >> +    {
> >> +        dprintk(XENLOG_INFO, "direct-map cannot be enabled yet\n");
> >> +        return -EINVAL;
> >> +    }
> >> +
> >>      return 0;
> >>  }
> >>
> >> diff --git a/xen/common/domain.c b/xen/common/domain.c index
> >> 56d47dd664..13ac5950bc 100644
> >> --- a/xen/common/domain.c
> >> +++ b/xen/common/domain.c
> >> @@ -486,7 +486,8 @@ static int sanitise_domain_config(struct
> >> xen_domctl_createdomain *config)
> >>           ~(XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap |
> >>             XEN_DOMCTL_CDF_s3_integrity | XEN_DOMCTL_CDF_oos_off |
> >>             XEN_DOMCTL_CDF_xs_domain | XEN_DOMCTL_CDF_iommu |
> >> -           XEN_DOMCTL_CDF_nested_virt | XEN_DOMCTL_CDF_vpmu) )
> >> +           XEN_DOMCTL_CDF_nested_virt | XEN_DOMCTL_CDF_vpmu |
> >> +           XEN_DOMCTL_CDF_INTERNAL_directmap) )
> >>      {
> >>          dprintk(XENLOG_INFO, "Unknown CDF flags %#x\n", config->flags);
> >>          return -EINVAL;
> >> diff --git a/xen/include/asm-arm/domain.h
> >> b/xen/include/asm-arm/domain.h index 9b3647587a..4f2c3f09d4 100644
> >> --- a/xen/include/asm-arm/domain.h
> >> +++ b/xen/include/asm-arm/domain.h
> >> @@ -29,8 +29,8 @@ enum domain_type {
> >>  #define is_64bit_domain(d) (0)
> >>  #endif
> >>
> >> -/* The hardware domain has always its memory direct mapped. */
> >> -#define
> >> is_domain_direct_mapped(d) is_hardware_domain(d)
> >> +#define is_domain_direct_mapped(d) \
> >> +        (d->options & XEN_DOMCTL_CDF_INTERNAL_directmap)
> >>
> >>  struct vtimer {
> >>      struct vcpu *v;
> >> diff --git a/xen/include/public/domctl.h
> >> b/xen/include/public/domctl.h index
> >> 1c21d4dc75..054e545c97 100644
> >> --- a/xen/include/public/domctl.h
> >> +++ b/xen/include/public/domctl.h
> >> @@ -72,6 +72,10 @@ struct xen_domctl_createdomain {
> >>  #define XEN_DOMCTL_CDF_nested_virt    (1U <<
> >> _XEN_DOMCTL_CDF_nested_virt)
> >>  /* Should we expose the vPMU to the guest? */
> >>  #define XEN_DOMCTL_CDF_vpmu           (1U << 7)
> >> +/*
> >> + * Be aware that bit 8 has already been occupied by flag
> >> + * XEN_DOMCTL_CDF_INTERNAL_directmap, defined in
> >> xen/include/xen/domain.h.
> >> + */
> >>
> >>  /* Max XEN_DOMCTL_CDF_* constant.  Used for ABI checking. */
> >> #define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_vpmu diff --git
> >> a/xen/include/xen/domain.h b/xen/include/xen/domain.h index
> >> 160c8dbdab..2b9edfdcee 100644
> >> --- a/xen/include/xen/domain.h
> >> +++ b/xen/include/xen/domain.h
> >> @@ -28,6 +28,9 @@ void getdomaininfo(struct domain *d, struct
> >> xen_domctl_getdomaininfo *info);  void arch_get_domain_info(const
> >> struct domain *d,
> >>                            struct xen_domctl_getdomaininfo *info);
> >>
> >> +/* Should domain memory be directly mapped? */
> >> +#define XEN_DOMCTL_CDF_INTERNAL_directmap      (1U << 8)
> >> +
> >
> > I run into some trouble with defining this flag internal in the new serie.
> >
> > Let me explain in details here:
> >
> > 1. Currently XEN_DOMCTL_CDF_MAX is set to XEN_DOMCTL_CDF_vpmu.
> > So we can say that XEN_DOMCTL_CDF_MAX knows that there are 8 CDF
> flags(0 to 7).
> > The corresponding ocaml tool has a list of CDF flags and currently it knows
> that there are 8 CDF flags:
> > https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=tools/ocaml/libs/xc
> > /xenctrl.ml;h=7503031d8f61c2dbcd4aa803738c83e10dfb7bb8;hb=HEAD#l64
> > This tool performs a check to see if the XEN_DOMCTL_CDF_MAX is equal to
> the number of entries in domain_create_flag.
> >
> > 2. Here we are reserving bit 8 for internal flag
> > XEN_DOMCTL_CDF_INTERNAL_directmap. As this is internal flag, I do not
> want to modify XEN_DOMCTL_CDF_MAX.
> >
> > 3. Everything is perfect until someone tries to add another global CDF flag:
> >
> > #define XEN_DOMCTL_CDF_next_flag  (1<<9) #define
> XEN_DOMCTL_CDF_MAX
> > XEN_DOMCTL_CDF_next_flag
> >
> > XEN_DOMCTL_CDF_MAX shows right now that there are 10 flags but ocaml
> tool sees only 9.
> > then we are getting build error.
> >
> > Hmm, would you please help me find a way to fix this dilemma, thx.
> 
> This was already outlined, but let me do so again: You do _not_ want to
> overlay with XEN_DOMCTL_CDF_*. domain_create() already has an internal-
> only parameter. That's a "bool" right now and wants extending to an
> "unsigned int" covering both the existing "is_priv" (step 1) and your new
> "directmap" (step 2). To make visible the relationship, naming the respective
> constants CDF_* (with no XEN_DOMCTL_ prefix to represent the
> difference) might be appopriate.

Oh,  I understand finally...
We shall create another new "unsigned int" CDF_* (with no XEN_DOMCTL_ prefix) to
cover all internal flags(priv and direct-map).

> Btw, as a result (if that's not the plan already anyway) you then probably 
> also
> want to decouple is_domain_direct_mapped() from is_hardware_domain(),
> and hence create Dom0 also with the new flag set.
> 
> Jan


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.