[PATCH v3] xen/domain: introduce DOMID_ANY

dmukhin@xen.org posted 1 patch 4 months, 2 weeks ago
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20250924030630.122229-2-dmukhin@ford.com
There is a newer version of this series
tools/tests/domid/harness.h             |  1 +
tools/tests/domid/test-domid.c          | 12 ++++++------
xen/common/device-tree/dom0less-build.c |  2 +-
xen/common/domctl.c                     |  2 +-
xen/common/domid.c                      |  2 +-
xen/include/public/xen.h                |  5 +++++
6 files changed, 15 insertions(+), 9 deletions(-)
[PATCH v3] xen/domain: introduce DOMID_ANY
Posted by dmukhin@xen.org 4 months, 2 weeks ago
From: Denis Mukhin <dmukhin@ford.com> 

Add a new symbol DOMID_ANY aliasing DOMID_INVALID to improve the readability
of the code.

Update all relevant domid_alloc() call sites.

Amends: 2d5065060710 ("xen/domain: unify domain ID allocation")
Signed-off-by: Denis Mukhin <dmukhin@ford.com>
---
Changes since v2:
- move DOMID_ANY back to the public header; add proper guards
- CI: https://gitlab.com/xen-project/people/dmukhin/xen/-/pipelines/2056319227
- Link to v2: https://lore.kernel.org/xen-devel/20250920174732.1207847-2-dmukhin@ford.com/
---
 tools/tests/domid/harness.h             |  1 +
 tools/tests/domid/test-domid.c          | 12 ++++++------
 xen/common/device-tree/dom0less-build.c |  2 +-
 xen/common/domctl.c                     |  2 +-
 xen/common/domid.c                      |  2 +-
 xen/include/public/xen.h                |  5 +++++
 6 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/tools/tests/domid/harness.h b/tools/tests/domid/harness.h
index 17eb22a9a854..610b564d4061 100644
--- a/tools/tests/domid/harness.h
+++ b/tools/tests/domid/harness.h
@@ -41,6 +41,7 @@ extern unsigned long find_next_zero_bit(const unsigned long *addr,
 
 #define DOMID_FIRST_RESERVED            (100)
 #define DOMID_INVALID                   (101)
+#define DOMID_ANY                       DOMID_INVALID
 
 #endif /* _TEST_HARNESS_ */
 
diff --git a/tools/tests/domid/test-domid.c b/tools/tests/domid/test-domid.c
index 5915c4699a5c..71cc4e7fd86d 100644
--- a/tools/tests/domid/test-domid.c
+++ b/tools/tests/domid/test-domid.c
@@ -41,20 +41,20 @@ int main(int argc, char **argv)
         domid_free(expected);
 
     /*
-     * Test that that two consecutive calls of domid_alloc(DOMID_INVALID)
+     * Test that that two consecutive calls of domid_alloc(DOMID_ANY)
      * will never return the same ID.
      * NB: ID#0 is reserved and shall not be allocated by
-     * domid_alloc(DOMID_INVALID).
+     * domid_alloc(DOMID_ANY).
      */
     for ( expected = 1; expected < DOMID_FIRST_RESERVED; expected++ )
     {
-        allocated = domid_alloc(DOMID_INVALID);
+        allocated = domid_alloc(DOMID_ANY);
         verify(allocated == expected,
                "TEST 3: expected %u allocated %u\n", expected, allocated);
     }
     for ( expected = 1; expected < DOMID_FIRST_RESERVED; expected++ )
     {
-        allocated = domid_alloc(DOMID_INVALID);
+        allocated = domid_alloc(DOMID_ANY);
         verify(allocated == DOMID_INVALID,
                "TEST 4: expected %u allocated %u\n", DOMID_INVALID, allocated);
     }
@@ -64,7 +64,7 @@ int main(int argc, char **argv)
         domid_free(expected);
     for ( expected = 1; expected < DOMID_FIRST_RESERVED / 2; expected++ )
     {
-        allocated = domid_alloc(DOMID_INVALID);
+        allocated = domid_alloc(DOMID_ANY);
         verify(allocated == expected,
                "TEST 5: expected %u allocated %u\n", expected, allocated);
     }
@@ -72,7 +72,7 @@ int main(int argc, char **argv)
     /* Re-allocate last ID from [1..DOMID_FIRST_RESERVED - 1]. */
     expected = DOMID_FIRST_RESERVED - 1;
     domid_free(DOMID_FIRST_RESERVED - 1);
-    allocated = domid_alloc(DOMID_INVALID);
+    allocated = domid_alloc(DOMID_ANY);
     verify(allocated == expected,
            "TEST 6: expected %u allocated %u\n", expected, allocated);
 
diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c
index 9fd004c42af7..e2764768c983 100644
--- a/xen/common/device-tree/dom0less-build.c
+++ b/xen/common/device-tree/dom0less-build.c
@@ -848,7 +848,7 @@ void __init create_domUs(void)
         if ( (max_init_domid + 1) >= DOMID_FIRST_RESERVED )
             panic("No more domain IDs available\n");
 
-        domid = domid_alloc(DOMID_INVALID);
+        domid = domid_alloc(DOMID_ANY);
         if ( domid == DOMID_INVALID )
             panic("Error allocating ID for domain %s\n", dt_node_name(node));
 
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index 954d79022645..ca91686a03d8 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -410,7 +410,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
     case XEN_DOMCTL_createdomain:
     {
         /* NB: ID#0 is reserved, find the first suitable ID instead. */
-        domid_t domid = domid_alloc(op->domain ?: DOMID_INVALID);
+        domid_t domid = domid_alloc(op->domain ?: DOMID_ANY);
 
         if ( domid == DOMID_INVALID )
         {
diff --git a/xen/common/domid.c b/xen/common/domid.c
index 2387ddb08300..76b7f3e7ae6e 100644
--- a/xen/common/domid.c
+++ b/xen/common/domid.c
@@ -19,7 +19,7 @@ static DECLARE_BITMAP(domid_bitmap, DOMID_FIRST_RESERVED);
  * @param domid Domain ID hint:
  * - If an explicit domain ID is provided, verify its availability and use it
  *   if ID is not used;
- * - If DOMID_INVALID is provided, search [1..DOMID_FIRST_RESERVED-1] range,
+ * - If DOMID_ANY is provided, search [1..DOMID_FIRST_RESERVED-1] range,
  *   starting from the last used ID. Implementation guarantees that two
  *   consecutive calls will never return the same ID. ID#0 is reserved for
  *   the first boot domain (currently, dom0) and excluded from the allocation
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index 82b9c05a76b7..29b7c81ba1bb 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -608,6 +608,11 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
 /* DOMID_INVALID is used to identify pages with unknown owner. */
 #define DOMID_INVALID        xen_mk_uint(0x7FF4)
 
+#if defined(__XEN__) || defined(__XEN_TOOLS__)
+/* Domain ID allocator: search [1..DOMID_FIRST_RESERVED-1] range. */
+#define DOMID_ANY            DOMID_INVALID
+#endif
+
 /* Idle domain. */
 #define DOMID_IDLE           xen_mk_uint(0x7FFF)
 
-- 
2.51.0
Re: [PATCH v3] xen/domain: introduce DOMID_ANY
Posted by Stefano Stabellini 2 months ago
On Tue, 23 Sep 2025, dmukhin@xen.org wrote:
> From: Denis Mukhin <dmukhin@ford.com> 
> 
> Add a new symbol DOMID_ANY aliasing DOMID_INVALID to improve the readability
> of the code.
> 
> Update all relevant domid_alloc() call sites.
> 
> Amends: 2d5065060710 ("xen/domain: unify domain ID allocation")
> Signed-off-by: Denis Mukhin <dmukhin@ford.com>

Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>

> ---
> Changes since v2:
> - move DOMID_ANY back to the public header; add proper guards
> - CI: https://gitlab.com/xen-project/people/dmukhin/xen/-/pipelines/2056319227
> - Link to v2: https://lore.kernel.org/xen-devel/20250920174732.1207847-2-dmukhin@ford.com/
> ---
>  tools/tests/domid/harness.h             |  1 +
>  tools/tests/domid/test-domid.c          | 12 ++++++------
>  xen/common/device-tree/dom0less-build.c |  2 +-
>  xen/common/domctl.c                     |  2 +-
>  xen/common/domid.c                      |  2 +-
>  xen/include/public/xen.h                |  5 +++++
>  6 files changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/tests/domid/harness.h b/tools/tests/domid/harness.h
> index 17eb22a9a854..610b564d4061 100644
> --- a/tools/tests/domid/harness.h
> +++ b/tools/tests/domid/harness.h
> @@ -41,6 +41,7 @@ extern unsigned long find_next_zero_bit(const unsigned long *addr,
>  
>  #define DOMID_FIRST_RESERVED            (100)
>  #define DOMID_INVALID                   (101)
> +#define DOMID_ANY                       DOMID_INVALID
>  
>  #endif /* _TEST_HARNESS_ */
>  
> diff --git a/tools/tests/domid/test-domid.c b/tools/tests/domid/test-domid.c
> index 5915c4699a5c..71cc4e7fd86d 100644
> --- a/tools/tests/domid/test-domid.c
> +++ b/tools/tests/domid/test-domid.c
> @@ -41,20 +41,20 @@ int main(int argc, char **argv)
>          domid_free(expected);
>  
>      /*
> -     * Test that that two consecutive calls of domid_alloc(DOMID_INVALID)
> +     * Test that that two consecutive calls of domid_alloc(DOMID_ANY)
>       * will never return the same ID.
>       * NB: ID#0 is reserved and shall not be allocated by
> -     * domid_alloc(DOMID_INVALID).
> +     * domid_alloc(DOMID_ANY).
>       */
>      for ( expected = 1; expected < DOMID_FIRST_RESERVED; expected++ )
>      {
> -        allocated = domid_alloc(DOMID_INVALID);
> +        allocated = domid_alloc(DOMID_ANY);
>          verify(allocated == expected,
>                 "TEST 3: expected %u allocated %u\n", expected, allocated);
>      }
>      for ( expected = 1; expected < DOMID_FIRST_RESERVED; expected++ )
>      {
> -        allocated = domid_alloc(DOMID_INVALID);
> +        allocated = domid_alloc(DOMID_ANY);
>          verify(allocated == DOMID_INVALID,
>                 "TEST 4: expected %u allocated %u\n", DOMID_INVALID, allocated);
>      }
> @@ -64,7 +64,7 @@ int main(int argc, char **argv)
>          domid_free(expected);
>      for ( expected = 1; expected < DOMID_FIRST_RESERVED / 2; expected++ )
>      {
> -        allocated = domid_alloc(DOMID_INVALID);
> +        allocated = domid_alloc(DOMID_ANY);
>          verify(allocated == expected,
>                 "TEST 5: expected %u allocated %u\n", expected, allocated);
>      }
> @@ -72,7 +72,7 @@ int main(int argc, char **argv)
>      /* Re-allocate last ID from [1..DOMID_FIRST_RESERVED - 1]. */
>      expected = DOMID_FIRST_RESERVED - 1;
>      domid_free(DOMID_FIRST_RESERVED - 1);
> -    allocated = domid_alloc(DOMID_INVALID);
> +    allocated = domid_alloc(DOMID_ANY);
>      verify(allocated == expected,
>             "TEST 6: expected %u allocated %u\n", expected, allocated);
>  
> diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c
> index 9fd004c42af7..e2764768c983 100644
> --- a/xen/common/device-tree/dom0less-build.c
> +++ b/xen/common/device-tree/dom0less-build.c
> @@ -848,7 +848,7 @@ void __init create_domUs(void)
>          if ( (max_init_domid + 1) >= DOMID_FIRST_RESERVED )
>              panic("No more domain IDs available\n");
>  
> -        domid = domid_alloc(DOMID_INVALID);
> +        domid = domid_alloc(DOMID_ANY);
>          if ( domid == DOMID_INVALID )
>              panic("Error allocating ID for domain %s\n", dt_node_name(node));
>  
> diff --git a/xen/common/domctl.c b/xen/common/domctl.c
> index 954d79022645..ca91686a03d8 100644
> --- a/xen/common/domctl.c
> +++ b/xen/common/domctl.c
> @@ -410,7 +410,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
>      case XEN_DOMCTL_createdomain:
>      {
>          /* NB: ID#0 is reserved, find the first suitable ID instead. */
> -        domid_t domid = domid_alloc(op->domain ?: DOMID_INVALID);
> +        domid_t domid = domid_alloc(op->domain ?: DOMID_ANY);
>  
>          if ( domid == DOMID_INVALID )
>          {
> diff --git a/xen/common/domid.c b/xen/common/domid.c
> index 2387ddb08300..76b7f3e7ae6e 100644
> --- a/xen/common/domid.c
> +++ b/xen/common/domid.c
> @@ -19,7 +19,7 @@ static DECLARE_BITMAP(domid_bitmap, DOMID_FIRST_RESERVED);
>   * @param domid Domain ID hint:
>   * - If an explicit domain ID is provided, verify its availability and use it
>   *   if ID is not used;
> - * - If DOMID_INVALID is provided, search [1..DOMID_FIRST_RESERVED-1] range,
> + * - If DOMID_ANY is provided, search [1..DOMID_FIRST_RESERVED-1] range,
>   *   starting from the last used ID. Implementation guarantees that two
>   *   consecutive calls will never return the same ID. ID#0 is reserved for
>   *   the first boot domain (currently, dom0) and excluded from the allocation
> diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
> index 82b9c05a76b7..29b7c81ba1bb 100644
> --- a/xen/include/public/xen.h
> +++ b/xen/include/public/xen.h
> @@ -608,6 +608,11 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
>  /* DOMID_INVALID is used to identify pages with unknown owner. */
>  #define DOMID_INVALID        xen_mk_uint(0x7FF4)
>  
> +#if defined(__XEN__) || defined(__XEN_TOOLS__)
> +/* Domain ID allocator: search [1..DOMID_FIRST_RESERVED-1] range. */
> +#define DOMID_ANY            DOMID_INVALID
> +#endif
> +
>  /* Idle domain. */
>  #define DOMID_IDLE           xen_mk_uint(0x7FFF)
>  
> -- 
> 2.51.0
>
Re: [PATCH v3] xen/domain: introduce DOMID_ANY
Posted by Jan Beulich 2 months ago
On 10.12.2025 02:04, Stefano Stabellini wrote:
> On Tue, 23 Sep 2025, dmukhin@xen.org wrote:
>> From: Denis Mukhin <dmukhin@ford.com> 
>>
>> Add a new symbol DOMID_ANY aliasing DOMID_INVALID to improve the readability
>> of the code.
>>
>> Update all relevant domid_alloc() call sites.
>>
>> Amends: 2d5065060710 ("xen/domain: unify domain ID allocation")
>> Signed-off-by: Denis Mukhin <dmukhin@ford.com>
> 
> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>

The other day concern was voiced over aliasing DOMID_ANY with DOMID_INVALID.
I don't recall though who it was or where.

Jan
Re: [PATCH v3] xen/domain: introduce DOMID_ANY
Posted by Roger Pau Monné 2 months ago
On Wed, Dec 10, 2025 at 08:36:37AM +0100, Jan Beulich wrote:
> On 10.12.2025 02:04, Stefano Stabellini wrote:
> > On Tue, 23 Sep 2025, dmukhin@xen.org wrote:
> >> From: Denis Mukhin <dmukhin@ford.com> 
> >>
> >> Add a new symbol DOMID_ANY aliasing DOMID_INVALID to improve the readability
> >> of the code.
> >>
> >> Update all relevant domid_alloc() call sites.
> >>
> >> Amends: 2d5065060710 ("xen/domain: unify domain ID allocation")
> >> Signed-off-by: Denis Mukhin <dmukhin@ford.com>
> > 
> > Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> 
> The other day concern was voiced over aliasing DOMID_ANY with DOMID_INVALID.
> I don't recall though who it was or where.

I'm afraid it was me (at least) that voiced such concern.  But then I
completely forgot to reply to the patch.  I don't think this is a good
idea, aliasing DOMID_ANY with DOMID_INVALID is likely to be dangerous
in the long run.  In the example here it's fine, because the function
itself doesn't use DOMID_INVALID (iow: all usages of DOMID_INVALID are
replaced with DOMID_ANY).

However I could see a function wanting to use both DOMID_INVALID and
DOMID_ANY for different purposes.  Having both aliased to the same
value is not going to work as expected.  If we have to introduce
DOMID_ANY it must use a different value than DOMID_INVALID.  And given
the context here I would be fine leaving domid_alloc() to handle
getting passed DOMID_INVALID as a signal to search for an empty domid
to use, I don't see a compelling reason to introduce DOMID_ANY.

Thanks, Roger.
Re: [PATCH v3] xen/domain: introduce DOMID_ANY
Posted by dmukhin@xen.org 1 month ago
On Wed, Dec 10, 2025 at 10:56:50AM +0100, Roger Pau Monné wrote:
> On Wed, Dec 10, 2025 at 08:36:37AM +0100, Jan Beulich wrote:
> > On 10.12.2025 02:04, Stefano Stabellini wrote:
> > > On Tue, 23 Sep 2025, dmukhin@xen.org wrote:
> > >> From: Denis Mukhin <dmukhin@ford.com> 
> > >>
> > >> Add a new symbol DOMID_ANY aliasing DOMID_INVALID to improve the readability
> > >> of the code.
> > >>
> > >> Update all relevant domid_alloc() call sites.
> > >>
> > >> Amends: 2d5065060710 ("xen/domain: unify domain ID allocation")
> > >> Signed-off-by: Denis Mukhin <dmukhin@ford.com>
> > > 
> > > Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> > 
> > The other day concern was voiced over aliasing DOMID_ANY with DOMID_INVALID.
> > I don't recall though who it was or where.
> 
> I'm afraid it was me (at least) that voiced such concern.  But then I
> completely forgot to reply to the patch.  I don't think this is a good
> idea, aliasing DOMID_ANY with DOMID_INVALID is likely to be dangerous
> in the long run.  In the example here it's fine, because the function
> itself doesn't use DOMID_INVALID (iow: all usages of DOMID_INVALID are
> replaced with DOMID_ANY).
> 
> However I could see a function wanting to use both DOMID_INVALID and
> DOMID_ANY for different purposes.  Having both aliased to the same
> value is not going to work as expected.  If we have to introduce
> DOMID_ANY it must use a different value than DOMID_INVALID.  And given
> the context here I would be fine leaving domid_alloc() to handle
> getting passed DOMID_INVALID as a signal to search for an empty domid
> to use, I don't see a compelling reason to introduce DOMID_ANY.

Thanks for the feedback!

I agree with having a dedicated reservation for DOMID_ANY.
I think introducing a new DOMID_ANY symbol improves code readability
a bit.

> 
> Thanks, Roger.