|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |