[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5] x86: make Viridian support optional
On Tue, Oct 14, 2025 at 04:24:53PM +0300, Grygorii Strashko wrote: > On 13.10.25 15:17, Roger Pau Monné wrote: > > On Tue, Sep 30, 2025 at 12:52:16PM +0000, Grygorii Strashko wrote: > > > From: Sergiy Kibrik <Sergiy_Kibrik@xxxxxxxx> > > > + > > > + If unsure, say Y. > > > + > > > config MEM_PAGING > > > bool "Xen memory paging support (UNSUPPORTED)" if UNSUPPORTED > > > depends on VM_EVENT > > > diff --git a/xen/arch/x86/hvm/Makefile b/xen/arch/x86/hvm/Makefile > > > index 6ec2c8f2db56..736eb3f966e9 100644 > > > --- a/xen/arch/x86/hvm/Makefile > > > +++ b/xen/arch/x86/hvm/Makefile > > > @@ -1,6 +1,6 @@ > > > obj-$(CONFIG_AMD_SVM) += svm/ > > > obj-$(CONFIG_INTEL_VMX) += vmx/ > > > -obj-y += viridian/ > > > +obj-$(CONFIG_VIRIDIAN) += viridian/ > > > obj-y += asid.o > > > obj-y += dm.o > > > diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c > > > index 23bd7f078a1d..95a80369b9b8 100644 > > > --- a/xen/arch/x86/hvm/hvm.c > > > +++ b/xen/arch/x86/hvm/hvm.c > > > @@ -701,9 +701,12 @@ int hvm_domain_initialise(struct domain *d, > > > if ( hvm_tsc_scaling_supported ) > > > d->arch.hvm.tsc_scaling_ratio = hvm_default_tsc_scaling_ratio; > > > - rc = viridian_domain_init(d); > > > - if ( rc ) > > > - goto fail2; > > > + if ( is_viridian_domain(d) ) > > > + { > > > + rc = viridian_domain_init(d); > > > + if ( rc ) > > > + goto fail2; > > > + } > > > > Are you sure this works as expected? > > > > The viridian_feature_mask() check is implemented using an HVM param, > > and hence can only be possibly set after the domain object is created. > > AFAICT is_viridian_domain(d) will unconditionally return false when > > called from domain_create() context, because the HVM params cannot > > possibly be set ahead of the domain being created. > > You are right. Thanks for the this catch. > > Taking above into account above, it seems Jan's proposal to convert below > viridian APIs into wrappers for VIRIDIAN=n case is right way to move forward: > > int viridian_vcpu_init(struct vcpu *v); > int viridian_domain_init(struct domain *d); > void viridian_vcpu_deinit(struct vcpu *v); > void viridian_domain_deinit(struct domain *d); > > Right? Possibly. If you don't want to introduce a XEN_DOMCTL_createdomain flag you need to exclusively use the Kconfig option to decide whether the Viridian related structs must be allocated. IOW: you could also solve it by using IS_ENABLED(CONFIG_VIRIDIAN) instead of is_viridian_domain() for most of the calls here. The wrapper option might be better IMO, rather than adding IS_ENABLED(CONFIG_VIRIDIAN) around. > [1] https://patchwork.kernel.org/comment/26595213/ > > > > > If you want to do anything like this you will possibly need to > > introduce a new flag to XEN_DOMCTL_createdomain to signal whether the > > domain has Viridian extensions are enabled or not, so that it's know > > in the context where domain_create() gets called. > > In my opinion, it might be good not to go so far within this submission. > - It's not intended to change existing behavior of neither Xen nor toolstack > for VIRIDIAN=y (default) > - just optout Viridian support when not needed. OK, that's fine. On further request though: if Viridian is build-time disabled in Kconfig, setting or fetching HVM_PARAM_VIRIDIAN should return -ENODEV or similar error. I don't think this is done as part of this patch. > > > > Given that HyperV is available on arm64 also it should be a global > > flag, as opposed to a per-arch one in xen_arch_domainconfig IMO. > > > rc = alternative_call(hvm_funcs.domain_initialise, d); > > > if ( rc != 0 ) > > > @@ -739,7 +742,8 @@ void hvm_domain_relinquish_resources(struct domain *d) > > > if ( hvm_funcs.nhvm_domain_relinquish_resources ) > > > alternative_vcall(hvm_funcs.nhvm_domain_relinquish_resources, > > > d); > > > - viridian_domain_deinit(d); > > > + if ( is_viridian_domain(d) ) > > > + viridian_domain_deinit(d); > > > ioreq_server_destroy_all(d); > > > @@ -1643,9 +1647,12 @@ int hvm_vcpu_initialise(struct vcpu *v) > > > && (rc = nestedhvm_vcpu_initialise(v)) < 0 ) /* teardown: > > > nestedhvm_vcpu_destroy */ > > > goto fail5; > > > - rc = viridian_vcpu_init(v); > > > - if ( rc ) > > > - goto fail6; > > > + if ( is_viridian_domain(d) ) > > > + { > > > + rc = viridian_vcpu_init(v); > > > + if ( rc ) > > > + goto fail6; > > > + } > > > rc = ioreq_server_add_vcpu_all(d, v); > > > if ( rc != 0 ) > > > @@ -1675,13 +1682,15 @@ int hvm_vcpu_initialise(struct vcpu *v) > > > fail2: > > > hvm_vcpu_cacheattr_destroy(v); > > > fail1: > > > - viridian_vcpu_deinit(v); > > > + if ( is_viridian_domain(d) ) > > > + viridian_vcpu_deinit(v); > > > return rc; > > > } > > > void hvm_vcpu_destroy(struct vcpu *v) > > > { > > > - viridian_vcpu_deinit(v); > > > + if ( is_viridian_domain(v->domain) ) > > > + viridian_vcpu_deinit(v); > > > ioreq_server_remove_vcpu_all(v->domain, v); > > > diff --git a/xen/arch/x86/hvm/viridian/viridian.c > > > b/xen/arch/x86/hvm/viridian/viridian.c > > > index c0be24bd2210..1212cc418728 100644 > > > --- a/xen/arch/x86/hvm/viridian/viridian.c > > > +++ b/xen/arch/x86/hvm/viridian/viridian.c > > > @@ -1116,14 +1116,14 @@ static int cf_check viridian_save_domain_ctxt( > > > { > > > const struct domain *d = v->domain; > > > const struct viridian_domain *vd = d->arch.hvm.viridian; > > > - struct hvm_viridian_domain_context ctxt = { > > > - .hypercall_gpa = vd->hypercall_gpa.raw, > > > - .guest_os_id = vd->guest_os_id.raw, > > > - }; > > > + struct hvm_viridian_domain_context ctxt = {}; > > > if ( !is_viridian_domain(d) ) > > > return 0; > > > + ctxt.hypercall_gpa = vd->hypercall_gpa.raw; > > > + ctxt.guest_os_id = vd->guest_os_id.raw, > > > + > > > viridian_time_save_domain_ctxt(d, &ctxt); > > > viridian_synic_save_domain_ctxt(d, &ctxt); > > > @@ -1136,6 +1136,9 @@ static int cf_check viridian_load_domain_ctxt( > > > struct viridian_domain *vd = d->arch.hvm.viridian; > > > struct hvm_viridian_domain_context ctxt; > > > + if ( !is_viridian_domain(d) ) > > > + return -EILSEQ; > > > + > > > if ( hvm_load_entry_zeroextend(VIRIDIAN_DOMAIN, h, &ctxt) != 0 ) > > > return -EINVAL; > > > @@ -1172,6 +1175,9 @@ static int cf_check viridian_load_vcpu_ctxt( > > > struct vcpu *v; > > > struct hvm_viridian_vcpu_context ctxt; > > > + if ( !is_viridian_domain(d) ) > > > + return -EILSEQ; > > > > Nit: we usually use EILSEQ for unreachable conditions, but here it's a > > toolstack controlled input. Maybe we could instead use ENODEV here? > > > > As it's not really an illegal restore stream, but the selected guest > > configuration doesn't match what's then loaded. > > I'm a "working bee" here and can change it once again her to -ENODEV here. > But It will be really cool if it will be agreed on Maintainers level somehow. > > EILSEQ was used as per [2] Didn't know it was explicitly requested, then leave it like that and ignore this comment. Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |