xen/arch/x86/domctl.c | 27 +++++++++++++++----------- xen/arch/x86/include/asm/mem_sharing.h | 11 +++++++---- 2 files changed, 23 insertions(+), 15 deletions(-)
Make them uniformly return EOPNOTSUPP when their dependent features
are absent. Otherwise the compiler loses context and they might return
ENOSYS instead.
debug_op, mem_sharing_op and psr_alloc change behaviour and return
EOPNOTSUPP when compiled out, rather than ENOSYS.
While at it, remove the public headers from mem_sharing.h (forward
declarations are fine) and add a missing xen/sched.h include (for
complete struct domain definition).
Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@amd.com>
---
xen/arch/x86/domctl.c | 27 +++++++++++++++-----------
xen/arch/x86/include/asm/mem_sharing.h | 11 +++++++----
2 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index d9521808dc..7066a18735 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -220,15 +220,15 @@ long arch_do_domctl(
{
case XEN_DOMCTL_shadow_op:
-#ifdef CONFIG_PAGING
+ ret = -EOPNOTSUPP;
+ if ( !IS_ENABLED(CONFIG_PAGING) )
+ break;
+
ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0);
if ( ret == -ERESTART )
return hypercall_create_continuation(
__HYPERVISOR_paging_domctl_cont, "h", u_domctl);
copyback = true;
-#else
- ret = -EOPNOTSUPP;
-#endif
break;
case XEN_DOMCTL_ioport_permission:
@@ -842,11 +842,14 @@ long arch_do_domctl(
}
break;
-#ifdef CONFIG_HVM
case XEN_DOMCTL_debug_op:
{
struct vcpu *v;
+ ret = -EOPNOTSUPP;
+ if ( !IS_ENABLED(CONFIG_HVM) )
+ break;
+
ret = -EINVAL;
if ( (domctl->u.debug_op.vcpu >= d->max_vcpus) ||
((v = d->vcpu[domctl->u.debug_op.vcpu]) == NULL) )
@@ -860,7 +863,6 @@ long arch_do_domctl(
ret = hvm_debug_op(v, domctl->u.debug_op.op);
break;
}
-#endif
case XEN_DOMCTL_gdbsx_guestmemio:
case XEN_DOMCTL_gdbsx_pausevcpu:
@@ -1033,11 +1035,13 @@ long arch_do_domctl(
break;
}
-#ifdef CONFIG_MEM_SHARING
case XEN_DOMCTL_mem_sharing_op:
+ ret = -EOPNOTSUPP;
+ if ( !IS_ENABLED(CONFIG_MEM_SHARING) )
+ break;
+
ret = mem_sharing_domctl(d, &domctl->u.mem_sharing_op);
break;
-#endif
#if P2M_AUDIT
case XEN_DOMCTL_audit_p2m:
@@ -1240,9 +1244,12 @@ long arch_do_domctl(
break;
case XEN_DOMCTL_psr_alloc:
+ ret = -EOPNOTSUPP;
+ if ( IS_ENABLED(CONFIG_X86_PSR) )
+ break;
+
switch ( domctl->u.psr_alloc.cmd )
{
-#ifdef CONFIG_X86_PSR
case XEN_DOMCTL_PSR_SET_L3_CBM:
ret = psr_set_val(d, domctl->u.psr_alloc.target,
domctl->u.psr_alloc.data,
@@ -1305,8 +1312,6 @@ long arch_do_domctl(
#undef domctl_psr_get_val
-#endif /* CONFIG_X86_PSR */
-
default:
ret = -EOPNOTSUPP;
break;
diff --git a/xen/arch/x86/include/asm/mem_sharing.h b/xen/arch/x86/include/asm/mem_sharing.h
index 040962f690..7ee783fde8 100644
--- a/xen/arch/x86/include/asm/mem_sharing.h
+++ b/xen/arch/x86/include/asm/mem_sharing.h
@@ -9,8 +9,13 @@
#ifndef __MEM_SHARING_H__
#define __MEM_SHARING_H__
-#include <public/domctl.h>
-#include <public/memory.h>
+#include <xen/sched.h>
+
+struct xen_domctl_mem_sharing_op;
+struct xen_mem_sharing_op;
+
+int mem_sharing_domctl(struct domain *d,
+ struct xen_domctl_mem_sharing_op *mec);
#ifdef CONFIG_MEM_SHARING
@@ -92,8 +97,6 @@ int mem_sharing_fork_reset(struct domain *d, bool reset_state,
int mem_sharing_notify_enomem(struct domain *d, unsigned long gfn,
bool allow_sleep);
int mem_sharing_memop(XEN_GUEST_HANDLE_PARAM(xen_mem_sharing_op_t) arg);
-int mem_sharing_domctl(struct domain *d,
- struct xen_domctl_mem_sharing_op *mec);
/*
* Scans the p2m and relinquishes any shared pages, destroying
base-commit: 2fa468919c39aac189623b6c580ce4ff8592d799
--
2.43.0
On Tue Feb 10, 2026 at 4:10 PM CET, Alejandro Vallejo wrote: > Make them uniformly return EOPNOTSUPP when their dependent features > are absent. Otherwise the compiler loses context and they might return > ENOSYS instead. > > debug_op, mem_sharing_op and psr_alloc change behaviour and return > EOPNOTSUPP when compiled out, rather than ENOSYS. > > While at it, remove the public headers from mem_sharing.h (forward > declarations are fine) and add a missing xen/sched.h include (for > complete struct domain definition). > > Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@amd.com> > --- > xen/arch/x86/domctl.c | 27 +++++++++++++++----------- > xen/arch/x86/include/asm/mem_sharing.h | 11 +++++++---- > 2 files changed, 23 insertions(+), 15 deletions(-) > > diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c > index d9521808dc..7066a18735 100644 > --- a/xen/arch/x86/domctl.c > +++ b/xen/arch/x86/domctl.c [snip] > case XEN_DOMCTL_psr_alloc: > + ret = -EOPNOTSUPP; > + if ( IS_ENABLED(CONFIG_X86_PSR) ) This was supposed to be !IS_ENABLED(), obviously. Cheers, Alejandro
On 10.02.2026 16:10, Alejandro Vallejo wrote: > @@ -1033,11 +1035,13 @@ long arch_do_domctl( > break; > } > > -#ifdef CONFIG_MEM_SHARING > case XEN_DOMCTL_mem_sharing_op: > + ret = -EOPNOTSUPP; > + if ( !IS_ENABLED(CONFIG_MEM_SHARING) ) > + break; > + > ret = mem_sharing_domctl(d, &domctl->u.mem_sharing_op); > break; > -#endif > > #if P2M_AUDIT > case XEN_DOMCTL_audit_p2m: What about this #if, though? > --- a/xen/arch/x86/include/asm/mem_sharing.h > +++ b/xen/arch/x86/include/asm/mem_sharing.h > @@ -9,8 +9,13 @@ > #ifndef __MEM_SHARING_H__ > #define __MEM_SHARING_H__ > > -#include <public/domctl.h> > -#include <public/memory.h> > +#include <xen/sched.h> As it looks this is for mem_sharing_is_fork(). Can this then please move ... > +struct xen_domctl_mem_sharing_op; > +struct xen_mem_sharing_op; > + > +int mem_sharing_domctl(struct domain *d, > + struct xen_domctl_mem_sharing_op *mec); > > #ifdef CONFIG_MEM_SHARING ... inside this #ifdef? The mem_sharing_domctl() decl may then want moving to the bottom of the file. Otoh I wonder whether supplying a stub wouldn't be neater for the single use site. Jan
On Tue Feb 10, 2026 at 4:39 PM CET, Jan Beulich wrote: > On 10.02.2026 16:10, Alejandro Vallejo wrote: >> @@ -1033,11 +1035,13 @@ long arch_do_domctl( >> break; >> } >> >> -#ifdef CONFIG_MEM_SHARING >> case XEN_DOMCTL_mem_sharing_op: >> + ret = -EOPNOTSUPP; >> + if ( !IS_ENABLED(CONFIG_MEM_SHARING) ) >> + break; >> + >> ret = mem_sharing_domctl(d, &domctl->u.mem_sharing_op); >> break; >> -#endif >> >> #if P2M_AUDIT >> case XEN_DOMCTL_audit_p2m: > > What about this #if, though? It missed the grep. Should've been changed too. > >> --- a/xen/arch/x86/include/asm/mem_sharing.h >> +++ b/xen/arch/x86/include/asm/mem_sharing.h >> @@ -9,8 +9,13 @@ >> #ifndef __MEM_SHARING_H__ >> #define __MEM_SHARING_H__ >> >> -#include <public/domctl.h> >> -#include <public/memory.h> >> +#include <xen/sched.h> > > As it looks this is for mem_sharing_is_fork(). Can this then please move ... > >> +struct xen_domctl_mem_sharing_op; >> +struct xen_mem_sharing_op; >> + >> +int mem_sharing_domctl(struct domain *d, >> + struct xen_domctl_mem_sharing_op *mec); >> >> #ifdef CONFIG_MEM_SHARING > > ... inside this #ifdef? The mem_sharing_domctl() decl may then want moving to > the bottom of the file. Sure. > Otoh I wonder whether supplying a stub wouldn't be > neater for the single use site. > > Jan Stubs make it really awkward to read the headers. I'd rather not make an already overcomplicated one worse. Cheers, Alejandro
© 2016 - 2026 Red Hat, Inc.