[PATCH] x86/domctl: Conditionalise x86 domctl using DCE rather than ifdef

Alejandro Vallejo posted 1 patch 17 hours ago
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20260210151008.217830-1-alejandro.garciavallejo@amd.com
There is a newer version of this series
xen/arch/x86/domctl.c                  | 27 +++++++++++++++-----------
xen/arch/x86/include/asm/mem_sharing.h | 11 +++++++----
2 files changed, 23 insertions(+), 15 deletions(-)
[PATCH] x86/domctl: Conditionalise x86 domctl using DCE rather than ifdef
Posted by Alejandro Vallejo 17 hours ago
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
Re: [PATCH] x86/domctl: Conditionalise x86 domctl using DCE rather than ifdef
Posted by Alejandro Vallejo 15 hours ago
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
Re: [PATCH] x86/domctl: Conditionalise x86 domctl using DCE rather than ifdef
Posted by Jan Beulich 17 hours ago
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
Re: [PATCH] x86/domctl: Conditionalise x86 domctl using DCE rather than ifdef
Posted by Alejandro Vallejo 15 hours ago
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