[PATCH v4 06/24] xen/domctl: consolidate domain.c with MGMT_HYPERCALLS

Penny Zheng posted 24 patches 3 weeks, 1 day ago
There is a newer version of this series
[PATCH v4 06/24] xen/domctl: consolidate domain.c with MGMT_HYPERCALLS
Posted by Penny Zheng 3 weeks, 1 day ago
The following functions, scattered in common/domain.c, and are only referenced
and responsible for domctl-op:
- domain_pause_by_systemcontroller
- domain_resume
- domain_set_node_affinity
So they shall be wrapped with CONFIG_MGMT_HYPERCALLS. Otherwise it will
become unreachable codes when MGMT_HYPERCALLS=n, and hence violating Misra
rule 2.1.
Move them together to avoid scattering #ifdef.

Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>
---
v3 - v4:
- combine commit "xen/domctl: wrap domain_pause_by_systemcontroller() with MGMT_HYPERCALLS",
"xen/domctl: wrap domain_resume() with CONFIG_MGMT_HYPERCALLS", and
"xen/domctl: wrap domain_set_node_affinity() with CONFIG_MGMT_HYPERCALLS"
---
 xen/common/domain.c | 114 ++++++++++++++++++++++----------------------
 1 file changed, 58 insertions(+), 56 deletions(-)

diff --git a/xen/common/domain.c b/xen/common/domain.c
index 6935b7d5e8..c6b0f931dc 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -1115,35 +1115,6 @@ void __init setup_system_domains(void)
 #endif
 }
 
-int domain_set_node_affinity(struct domain *d, const nodemask_t *affinity)
-{
-    /* Being disjoint with the system is just wrong. */
-    if ( !nodes_intersects(*affinity, node_online_map) )
-        return -EINVAL;
-
-    spin_lock(&d->node_affinity_lock);
-
-    /*
-     * Being/becoming explicitly affine to all nodes is not particularly
-     * useful. Let's take it as the `reset node affinity` command.
-     */
-    if ( nodes_full(*affinity) )
-    {
-        d->auto_node_affinity = 1;
-        goto out;
-    }
-
-    d->auto_node_affinity = 0;
-    d->node_affinity = *affinity;
-
-out:
-    spin_unlock(&d->node_affinity_lock);
-
-    domain_update_node_affinity(d);
-
-    return 0;
-}
-
 /* rcu_read_lock(&domlist_read_lock) must be held. */
 static struct domain *domid_to_domain(domid_t dom)
 {
@@ -1361,33 +1332,6 @@ int domain_shutdown(struct domain *d, u8 reason)
     return 0;
 }
 
-void domain_resume(struct domain *d)
-{
-    struct vcpu *v;
-
-    /*
-     * Some code paths assume that shutdown status does not get reset under
-     * their feet (e.g., some assertions make this assumption).
-     */
-    domain_pause(d);
-
-    spin_lock(&d->shutdown_lock);
-
-    d->is_shutting_down = d->is_shut_down = 0;
-    d->shutdown_code = SHUTDOWN_CODE_INVALID;
-
-    for_each_vcpu ( d, v )
-    {
-        if ( v->paused_for_shutdown )
-            vcpu_unpause(v);
-        v->paused_for_shutdown = 0;
-    }
-
-    spin_unlock(&d->shutdown_lock);
-
-    domain_unpause(d);
-}
-
 int vcpu_start_shutdown_deferral(struct vcpu *v)
 {
     if ( v->defer_shutdown )
@@ -1616,10 +1560,68 @@ static int _domain_pause_by_systemcontroller(struct domain *d, bool sync)
     return 0;
 }
 
+#ifdef CONFIG_MGMT_HYPERCALLS
+int domain_set_node_affinity(struct domain *d, const nodemask_t *affinity)
+{
+    /* Being disjoint with the system is just wrong. */
+    if ( !nodes_intersects(*affinity, node_online_map) )
+        return -EINVAL;
+
+    spin_lock(&d->node_affinity_lock);
+
+    /*
+     * Being/becoming explicitly affine to all nodes is not particularly
+     * useful. Let's take it as the `reset node affinity` command.
+     */
+    if ( nodes_full(*affinity) )
+    {
+        d->auto_node_affinity = 1;
+        goto out;
+    }
+
+    d->auto_node_affinity = 0;
+    d->node_affinity = *affinity;
+
+out:
+    spin_unlock(&d->node_affinity_lock);
+
+    domain_update_node_affinity(d);
+
+    return 0;
+}
+
+void domain_resume(struct domain *d)
+{
+    struct vcpu *v;
+
+    /*
+     * Some code paths assume that shutdown status does not get reset under
+     * their feet (e.g., some assertions make this assumption).
+     */
+    domain_pause(d);
+
+    spin_lock(&d->shutdown_lock);
+
+    d->is_shutting_down = d->is_shut_down = 0;
+    d->shutdown_code = SHUTDOWN_CODE_INVALID;
+
+    for_each_vcpu ( d, v )
+    {
+        if ( v->paused_for_shutdown )
+            vcpu_unpause(v);
+        v->paused_for_shutdown = 0;
+    }
+
+    spin_unlock(&d->shutdown_lock);
+
+    domain_unpause(d);
+}
+
 int domain_pause_by_systemcontroller(struct domain *d)
 {
     return _domain_pause_by_systemcontroller(d, true /* sync */);
 }
+#endif /* CONFIG_MGMT_HYPERCALLS */
 
 int domain_pause_by_systemcontroller_nosync(struct domain *d)
 {
-- 
2.34.1
Re: [PATCH v4 06/24] xen/domctl: consolidate domain.c with MGMT_HYPERCALLS
Posted by Jan Beulich 2 weeks, 3 days ago
On 21.11.2025 11:57, Penny Zheng wrote:
> The following functions, scattered in common/domain.c, and are only referenced
> and responsible for domctl-op:
> - domain_pause_by_systemcontroller
> - domain_resume
> - domain_set_node_affinity
> So they shall be wrapped with CONFIG_MGMT_HYPERCALLS. Otherwise it will
> become unreachable codes when MGMT_HYPERCALLS=n, and hence violating Misra
> rule 2.1.
> Move them together to avoid scattering #ifdef.
> 
> Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>

One further small request here:

> --- a/xen/common/domain.c
> +++ b/xen/common/domain.c
> @@ -1115,35 +1115,6 @@ void __init setup_system_domains(void)
>  #endif
>  }
>  
> -int domain_set_node_affinity(struct domain *d, const nodemask_t *affinity)
> -{
> -    /* Being disjoint with the system is just wrong. */
> -    if ( !nodes_intersects(*affinity, node_online_map) )
> -        return -EINVAL;
> -
> -    spin_lock(&d->node_affinity_lock);
> -
> -    /*
> -     * Being/becoming explicitly affine to all nodes is not particularly
> -     * useful. Let's take it as the `reset node affinity` command.
> -     */
> -    if ( nodes_full(*affinity) )
> -    {
> -        d->auto_node_affinity = 1;
> -        goto out;
> -    }
> -
> -    d->auto_node_affinity = 0;
> -    d->node_affinity = *affinity;
> -
> -out:

I realize you only move this, but ...

> @@ -1616,10 +1560,68 @@ static int _domain_pause_by_systemcontroller(struct domain *d, bool sync)
>      return 0;
>  }
>  
> +#ifdef CONFIG_MGMT_HYPERCALLS
> +int domain_set_node_affinity(struct domain *d, const nodemask_t *affinity)
> +{
> +    /* Being disjoint with the system is just wrong. */
> +    if ( !nodes_intersects(*affinity, node_online_map) )
> +        return -EINVAL;
> +
> +    spin_lock(&d->node_affinity_lock);
> +
> +    /*
> +     * Being/becoming explicitly affine to all nodes is not particularly
> +     * useful. Let's take it as the `reset node affinity` command.
> +     */
> +    if ( nodes_full(*affinity) )
> +    {
> +        d->auto_node_affinity = 1;
> +        goto out;
> +    }
> +
> +    d->auto_node_affinity = 0;
> +    d->node_affinity = *affinity;
> +
> +out:

... can you please add a leading blank here, to conform to ./CODING_STYLE?

Jan
Re: [PATCH v4 06/24] xen/domctl: consolidate domain.c with MGMT_HYPERCALLS
Posted by Jan Beulich 2 weeks, 4 days ago
On 21.11.2025 11:57, Penny Zheng wrote:
> The following functions, scattered in common/domain.c, and are only referenced
> and responsible for domctl-op:
> - domain_pause_by_systemcontroller
> - domain_resume
> - domain_set_node_affinity
> So they shall be wrapped with CONFIG_MGMT_HYPERCALLS. Otherwise it will
> become unreachable codes when MGMT_HYPERCALLS=n, and hence violating Misra
> rule 2.1.
> Move them together to avoid scattering #ifdef.
> 
> Signed-off-by: Penny Zheng <Penny.Zheng@amd.com>

Acked-by: Jan Beulich <jbeulich@suse.com>

I again think though that the title doesn't quite get it. While "consolidate"
may be fine here, I'd like to suggest s/with/towards/ or some such.

Jan