[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: Penny Zheng <Penny.Zheng@xxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Tue, 7 Dec 2021 10:28:23 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.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=JiteJttIURtn9v2zxI5oX4XFbu5Jd/LPlFnN4ErCAAs=; b=akBFeAw7e0MinXpHAHUWzSUtA9q+HYp9jKrPrFr5pv0fJJVAa0PPs01SrhShzXU/NjYgj0NccY78y1JF6vVBcIXjkcrvwMY3SwwAuBB9xc8tN0wfpn+zJ1BX1ga9+jh4403w5oAazACPWhTknfl9iHnN5pB5PxXEwaGBrXHBx7IAnCvaxscJ2dHlBJwmq3zVc5u7C5uSJZRM6sH5/ekwzcZdRmXnqZAcBh6OpD4tEF7yT7UqIiq5XRipwin2Jh8V0bDRywOGurspzJ67U+IUtwyoIIgh4OzsK1brz0Pu7pj7GHJ3fFkipS6lwie5VzWvqN8PVLP7GiUp2c189dRUfw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RBgAwGH+erjFAl51lYAhaDXaAXIpPMgRtHxQ8HHSo7Cot4S8/4GOOAE6OA9JtzvD16i3krudw1PXnDSEYdiNoOtF5o6yRRnRJ+wyjQFzb6I2o5Lo/beiqkpvt0XXxKhUhKs/DWtDV97Jt1CnfsKYDBjsQ8F0+4nw2+MfPqERX2xrQpV6pAIGD6VKyo2XOxrpIjnioMFdPtDlCJetoIQXEeUA4M+rPfAo2knJQP3IMssBIhbRpWQ8EFelT1iqB06ezO9P8U1iLrXJHPSy7YnGZbicZkKDGgDSyAqd3IC1zXvlhbdfzhCA6jvdGzxclJ9kweMJyv4IeA/SKscVDdfAEA==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.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 09:28:58 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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.

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®.