* [PATCH v5 1/3] xen/arm: optimize the size of struct vcpu
2026-01-07 16:28 [PATCH v5 0/3] Move alloc/free_vcpu_struct() to common code Oleksii Kurochko
@ 2026-01-07 16:28 ` Oleksii Kurochko
2026-01-09 13:15 ` Orzel, Michal
2026-01-07 16:28 ` [PATCH v5 2/3] xen: move alloc/free_vcpu_struct() to common code Oleksii Kurochko
2026-01-07 16:29 ` [PATCH v5 3/3] xen/common: make {alloc,free}_domain_struct() static Oleksii Kurochko
2 siblings, 1 reply; 7+ messages in thread
From: Oleksii Kurochko @ 2026-01-07 16:28 UTC (permalink / raw)
To: xen-devel
Cc: Oleksii Kurochko, Stefano Stabellini, Julien Grall,
Bertrand Marquis, Michal Orzel, Volodymyr Babchuk, Andrew Cooper
When CONFIG_NEW_VGIC=y and CONFIG_ARM_64=y, the size of struct vcpu
exceeds one page, which requires allocating two pages and led to the
introduction of MAX_PAGES_PER_VCPU.
To remove the need for MAX_PAGES_PER_VCPU, the vgic member of NEW_VGIC's
struct vgic_cpu member private_irqs is changed to a pointer to struct
vgic_irq.
As a result, the size of struct vcpu for Arm64 is reduced to 2176 bytes
in the case when CONFIG_ARM_64=y and CONFIG_NEW_VGIC=y, compared to 3840
bytes (without these changes and with CONFIG_ARM_64=y) and 4736 bytes
(without these changes and with both CONFIG_ARM_64=y and CONFIG_NEW_VGIC=y).
Note that all numbers are based on defconfig with the mentioned options
enabled or disabled as specified.
Since the private_irqs member is now a pointer, vcpu_vgic_init() and
vcpu_vgic_free() are updated to allocate and free private_irqs instance.
As struct vcpu now fits into one page, drop MAX_PAGES_PER_VCPU.
Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
Michal gave his:
Acked-by: Michal Orzel <michal.orzel@amd.com>
But wrote to MAX_PAGES_PER_VCPU in this patch, so probably he would
like to look at how it was done.
---
Change in v5:
- Correct the commit message:
- s/vgic_vcpu/vgic_cpu/
- s/private_irq/private_irqs/
- Drop MAX_PAGES_PER_VCPU.
---
Change in v4:
- Add Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>.
---
Changes in v3:
- Make private_irqs member as pointer to vgic_irq in struct vgic_cpu
of new_vgic instead of vgic member of arch_vcpu.
---
Changes in v2:
- New patch.
---
xen/arch/arm/domain.c | 23 ++++-------------------
xen/arch/arm/include/asm/new_vgic.h | 2 +-
xen/arch/arm/vgic/vgic-init.c | 7 +++++++
3 files changed, 12 insertions(+), 20 deletions(-)
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 47973f99d935..64b935b68000 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -473,36 +473,21 @@ void dump_pageframe_info(struct domain *d)
}
-/*
- * The new VGIC has a bigger per-IRQ structure, so we need more than one
- * page on ARM64. Cowardly increase the limit in this case.
- */
-#if defined(CONFIG_NEW_VGIC) && defined(CONFIG_ARM_64)
-#define MAX_PAGES_PER_VCPU 2
-#else
-#define MAX_PAGES_PER_VCPU 1
-#endif
-
struct vcpu *alloc_vcpu_struct(const struct domain *d)
{
struct vcpu *v;
- BUILD_BUG_ON(sizeof(*v) > MAX_PAGES_PER_VCPU * PAGE_SIZE);
- v = alloc_xenheap_pages(get_order_from_bytes(sizeof(*v)), 0);
+ BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE);
+ v = alloc_xenheap_page();
if ( v != NULL )
- {
- unsigned int i;
-
- for ( i = 0; i < DIV_ROUND_UP(sizeof(*v), PAGE_SIZE); i++ )
- clear_page((void *)v + i * PAGE_SIZE);
- }
+ clear_page(v);
return v;
}
void free_vcpu_struct(struct vcpu *v)
{
- free_xenheap_pages(v, get_order_from_bytes(sizeof(*v)));
+ free_xenheap_page(v);
}
int arch_vcpu_create(struct vcpu *v)
diff --git a/xen/arch/arm/include/asm/new_vgic.h b/xen/arch/arm/include/asm/new_vgic.h
index 1e762138939f..6f7af0e02b2b 100644
--- a/xen/arch/arm/include/asm/new_vgic.h
+++ b/xen/arch/arm/include/asm/new_vgic.h
@@ -155,7 +155,7 @@ struct vgic_dist {
};
struct vgic_cpu {
- struct vgic_irq private_irqs[VGIC_NR_PRIVATE_IRQS];
+ struct vgic_irq *private_irqs;
struct list_head ap_list_head;
spinlock_t ap_list_lock; /* Protects the ap_list */
diff --git a/xen/arch/arm/vgic/vgic-init.c b/xen/arch/arm/vgic/vgic-init.c
index aef526f2e717..4eb49d922492 100644
--- a/xen/arch/arm/vgic/vgic-init.c
+++ b/xen/arch/arm/vgic/vgic-init.c
@@ -202,6 +202,11 @@ int vcpu_vgic_init(struct vcpu *v)
{
int ret = 0;
+ v->arch.vgic.private_irqs =
+ xzalloc_array(struct vgic_irq, VGIC_NR_PRIVATE_IRQS);
+ if ( !v->arch.vgic.private_irqs )
+ return -ENOMEM;
+
vgic_vcpu_early_init(v);
if ( gic_hw_version() == GIC_V2 )
@@ -244,6 +249,8 @@ void vcpu_vgic_free(struct vcpu *v)
struct vgic_cpu *vgic_cpu = &v->arch.vgic;
INIT_LIST_HEAD(&vgic_cpu->ap_list_head);
+
+ XFREE(v->arch.vgic.private_irqs);
}
/*
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v5 1/3] xen/arm: optimize the size of struct vcpu
2026-01-07 16:28 ` [PATCH v5 1/3] xen/arm: optimize the size of struct vcpu Oleksii Kurochko
@ 2026-01-09 13:15 ` Orzel, Michal
0 siblings, 0 replies; 7+ messages in thread
From: Orzel, Michal @ 2026-01-09 13:15 UTC (permalink / raw)
To: Oleksii Kurochko, xen-devel
Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
Volodymyr Babchuk, Andrew Cooper
On 07/01/2026 17:28, Oleksii Kurochko wrote:
> When CONFIG_NEW_VGIC=y and CONFIG_ARM_64=y, the size of struct vcpu
> exceeds one page, which requires allocating two pages and led to the
> introduction of MAX_PAGES_PER_VCPU.
>
> To remove the need for MAX_PAGES_PER_VCPU, the vgic member of NEW_VGIC's
> struct vgic_cpu member private_irqs is changed to a pointer to struct
> vgic_irq.
> As a result, the size of struct vcpu for Arm64 is reduced to 2176 bytes
> in the case when CONFIG_ARM_64=y and CONFIG_NEW_VGIC=y, compared to 3840
> bytes (without these changes and with CONFIG_ARM_64=y) and 4736 bytes
> (without these changes and with both CONFIG_ARM_64=y and CONFIG_NEW_VGIC=y).
> Note that all numbers are based on defconfig with the mentioned options
> enabled or disabled as specified.
>
> Since the private_irqs member is now a pointer, vcpu_vgic_init() and
> vcpu_vgic_free() are updated to allocate and free private_irqs instance.
>
> As struct vcpu now fits into one page, drop MAX_PAGES_PER_VCPU.
>
> Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> Michal gave his:
> Acked-by: Michal Orzel <michal.orzel@amd.com>
> But wrote to MAX_PAGES_PER_VCPU in this patch, so probably he would
> like to look at how it was done.
Looks ok, you can retain the tag.
~MichaL
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v5 2/3] xen: move alloc/free_vcpu_struct() to common code
2026-01-07 16:28 [PATCH v5 0/3] Move alloc/free_vcpu_struct() to common code Oleksii Kurochko
2026-01-07 16:28 ` [PATCH v5 1/3] xen/arm: optimize the size of struct vcpu Oleksii Kurochko
@ 2026-01-07 16:28 ` Oleksii Kurochko
2026-01-09 13:17 ` Orzel, Michal
2026-01-07 16:29 ` [PATCH v5 3/3] xen/common: make {alloc,free}_domain_struct() static Oleksii Kurochko
2 siblings, 1 reply; 7+ messages in thread
From: Oleksii Kurochko @ 2026-01-07 16:28 UTC (permalink / raw)
To: xen-devel
Cc: Oleksii Kurochko, Stefano Stabellini, Julien Grall,
Bertrand Marquis, Michal Orzel, Volodymyr Babchuk, Andrew Cooper,
Anthony PERARD, Jan Beulich, Roger Pau Monné,
Timothy Pearson, Alistair Francis, Connor Davis
alloc_vcpu_struct() and free_vcpu_struct() contain little
architecture-specific logic and are suitable for sharing across
architectures. Move both helpers to common code.
To support the remaining architectural differences, introduce
arch_vcpu_struct_memflags(), allowing architectures to override the
memory flags passed to alloc_xenheap_pages(). This is currently needed
by x86, which may require MEMF_bits(32) for HVM guests using shadow
paging.
The ARM implementation of alloc/free_vcpu_struct() is removed and
replaced by the common version. Stub implementations are also dropped
from PPC and RISC-V.
Now that the size of struct vcpu for Arm64 is smaller than PAGE_SIZE,
MAX_PAGES_PER_VCPU is no longer needed and is removed.
Finally, make alloc_vcpu_struct() and free_vcpu_struct() static to
common/domain.c, as they are no longer used outside common code.
No functional changes.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
Changes in v5:
- Nothing changed. Only rebase.
---
Changes in v4:
- Move implementation of alloc_vcpu_struct() and free_vcpu_struct() ahead
of vmtrace_free_buffer().
- Add Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>.
- Add Acked-by: Jan Beulich <jbeulich@suse.com>.
---
Changes in v3:
- Make from function arch_vcpu_struct_memflags() a macros in asm/domain.h.
- Drop forward declaration of arch_vcpu_struct_memflags() in asm/domain.h.
- Update defintion of arch_vcpu_stuct_memflags() in alloc_vcpu_struct().
---
Changes in v2:
- Rework alloc/free_vcpu_struct() to work with only one page.
- Return back the comment about the restriction inside x86's
arch_vcpu_struct_memflags().
- Drop MAX_PAGES_PER_VCPU.
---
xen/arch/arm/domain.c | 17 -----------------
xen/arch/ppc/stubs.c | 10 ----------
xen/arch/riscv/stubs.c | 10 ----------
xen/arch/x86/domain.c | 24 ------------------------
xen/arch/x86/include/asm/domain.h | 12 ++++++++++++
xen/common/domain.c | 20 ++++++++++++++++++++
xen/include/xen/domain.h | 4 ----
7 files changed, 32 insertions(+), 65 deletions(-)
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 64b935b68000..507df807edb8 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -473,23 +473,6 @@ void dump_pageframe_info(struct domain *d)
}
-struct vcpu *alloc_vcpu_struct(const struct domain *d)
-{
- struct vcpu *v;
-
- BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE);
- v = alloc_xenheap_page();
- if ( v != NULL )
- clear_page(v);
-
- return v;
-}
-
-void free_vcpu_struct(struct vcpu *v)
-{
- free_xenheap_page(v);
-}
-
int arch_vcpu_create(struct vcpu *v)
{
int rc = 0;
diff --git a/xen/arch/ppc/stubs.c b/xen/arch/ppc/stubs.c
index 9953ea1c6c08..f7f6e7ed97af 100644
--- a/xen/arch/ppc/stubs.c
+++ b/xen/arch/ppc/stubs.c
@@ -152,11 +152,6 @@ void dump_pageframe_info(struct domain *d)
BUG_ON("unimplemented");
}
-void free_vcpu_struct(struct vcpu *v)
-{
- BUG_ON("unimplemented");
-}
-
int arch_vcpu_create(struct vcpu *v)
{
BUG_ON("unimplemented");
@@ -264,11 +259,6 @@ void vcpu_kick(struct vcpu *v)
BUG_ON("unimplemented");
}
-struct vcpu *alloc_vcpu_struct(const struct domain *d)
-{
- BUG_ON("unimplemented");
-}
-
unsigned long
hypercall_create_continuation(unsigned int op, const char *format, ...)
{
diff --git a/xen/arch/riscv/stubs.c b/xen/arch/riscv/stubs.c
index 164fc091b28a..29bdb65afbdf 100644
--- a/xen/arch/riscv/stubs.c
+++ b/xen/arch/riscv/stubs.c
@@ -121,11 +121,6 @@ void dump_pageframe_info(struct domain *d)
BUG_ON("unimplemented");
}
-void free_vcpu_struct(struct vcpu *v)
-{
- BUG_ON("unimplemented");
-}
-
int arch_vcpu_create(struct vcpu *v)
{
BUG_ON("unimplemented");
@@ -233,11 +228,6 @@ void vcpu_kick(struct vcpu *v)
BUG_ON("unimplemented");
}
-struct vcpu *alloc_vcpu_struct(const struct domain *d)
-{
- BUG_ON("unimplemented");
-}
-
unsigned long
hypercall_create_continuation(unsigned int op, const char *format, ...)
{
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 7632d5e2d62d..c29a6b0decee 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -493,30 +493,6 @@ unsigned int arch_domain_struct_memflags(void)
return MEMF_bits(bits);
}
-struct vcpu *alloc_vcpu_struct(const struct domain *d)
-{
- struct vcpu *v;
- /*
- * This structure contains embedded PAE PDPTEs, used when an HVM guest
- * runs on shadow pagetables outside of 64-bit mode. In this case the CPU
- * may require that the shadow CR3 points below 4GB, and hence the whole
- * structure must satisfy this restriction. Thus we specify MEMF_bits(32).
- */
- unsigned int memflags =
- (is_hvm_domain(d) && paging_mode_shadow(d)) ? MEMF_bits(32) : 0;
-
- BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE);
- v = alloc_xenheap_pages(0, memflags);
- if ( v != NULL )
- clear_page(v);
- return v;
-}
-
-void free_vcpu_struct(struct vcpu *v)
-{
- free_xenheap_page(v);
-}
-
/* Initialise various registers to their architectural INIT/RESET state. */
void arch_vcpu_regs_init(struct vcpu *v)
{
diff --git a/xen/arch/x86/include/asm/domain.h b/xen/arch/x86/include/asm/domain.h
index 16cd45cc32c0..effb23a23416 100644
--- a/xen/arch/x86/include/asm/domain.h
+++ b/xen/arch/x86/include/asm/domain.h
@@ -15,6 +15,18 @@
unsigned int arch_domain_struct_memflags(void);
#define arch_domain_struct_memflags arch_domain_struct_memflags
+/*
+ * This structure contains embedded PAE PDPTEs, used when an HVM guest
+ * runs on shadow pagetables outside of 64-bit mode. In this case the CPU
+ * may require that the shadow CR3 points below 4GB, and hence the whole
+ * structure must satisfy this restriction. Thus we specify MEMF_bits(32).
+ */
+#define arch_vcpu_struct_memflags(d) ({ \
+ const struct domain *d_ = (d); \
+ \
+ (is_hvm_domain(d_) && paging_mode_shadow(d_) ? MEMF_bits(32) : 0); \
+})
+
#define has_32bit_shinfo(d) ((d)->arch.has_32bit_shinfo)
/*
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 93c71bc766b0..655d9590f846 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -316,6 +316,26 @@ static void vcpu_info_reset(struct vcpu *v)
: &dummy_vcpu_info);
}
+static struct vcpu *alloc_vcpu_struct(const struct domain *d)
+{
+#ifndef arch_vcpu_struct_memflags
+# define arch_vcpu_struct_memflags(d) ((void)(d), 0)
+#endif
+ struct vcpu *v;
+
+ BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE);
+ v = alloc_xenheap_pages(0, arch_vcpu_struct_memflags(d));
+ if ( v )
+ clear_page(v);
+
+ return v;
+}
+
+static void free_vcpu_struct(struct vcpu *v)
+{
+ free_xenheap_page(v);
+}
+
static void vmtrace_free_buffer(struct vcpu *v)
{
const struct domain *d = v->domain;
diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h
index 8aab05ae93c8..644f5ac3f293 100644
--- a/xen/include/xen/domain.h
+++ b/xen/include/xen/domain.h
@@ -70,10 +70,6 @@ void domid_free(domid_t domid);
struct domain *alloc_domain_struct(void);
void free_domain_struct(struct domain *d);
-/* Allocate/free a VCPU structure. */
-struct vcpu *alloc_vcpu_struct(const struct domain *d);
-void free_vcpu_struct(struct vcpu *v);
-
/* Allocate/free a PIRQ structure. */
#ifndef alloc_pirq_struct
struct pirq *alloc_pirq_struct(struct domain *d);
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v5 2/3] xen: move alloc/free_vcpu_struct() to common code
2026-01-07 16:28 ` [PATCH v5 2/3] xen: move alloc/free_vcpu_struct() to common code Oleksii Kurochko
@ 2026-01-09 13:17 ` Orzel, Michal
2026-01-09 13:35 ` Andrew Cooper
0 siblings, 1 reply; 7+ messages in thread
From: Orzel, Michal @ 2026-01-09 13:17 UTC (permalink / raw)
To: Oleksii Kurochko, xen-devel
Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
Volodymyr Babchuk, Andrew Cooper, Anthony PERARD, Jan Beulich,
Roger Pau Monné, Timothy Pearson, Alistair Francis,
Connor Davis
On 07/01/2026 17:28, Oleksii Kurochko wrote:
> alloc_vcpu_struct() and free_vcpu_struct() contain little
> architecture-specific logic and are suitable for sharing across
> architectures. Move both helpers to common code.
>
> To support the remaining architectural differences, introduce
> arch_vcpu_struct_memflags(), allowing architectures to override the
> memory flags passed to alloc_xenheap_pages(). This is currently needed
> by x86, which may require MEMF_bits(32) for HVM guests using shadow
> paging.
>
> The ARM implementation of alloc/free_vcpu_struct() is removed and
> replaced by the common version. Stub implementations are also dropped
> from PPC and RISC-V.
>
> Now that the size of struct vcpu for Arm64 is smaller than PAGE_SIZE,
> MAX_PAGES_PER_VCPU is no longer needed and is removed.
>
> Finally, make alloc_vcpu_struct() and free_vcpu_struct() static to
> common/domain.c, as they are no longer used outside common code.
>
> No functional changes.
>
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> Acked-by: Jan Beulich <jbeulich@suse.com>
> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
In case you need Arm tag here:
Acked-by: Michal Orzel <michal.orzel@amd.com>
~Michal
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 2/3] xen: move alloc/free_vcpu_struct() to common code
2026-01-09 13:17 ` Orzel, Michal
@ 2026-01-09 13:35 ` Andrew Cooper
0 siblings, 0 replies; 7+ messages in thread
From: Andrew Cooper @ 2026-01-09 13:35 UTC (permalink / raw)
To: Orzel, Michal, Oleksii Kurochko, xen-devel
Cc: Andrew Cooper, Stefano Stabellini, Julien Grall, Bertrand Marquis,
Volodymyr Babchuk, Anthony PERARD, Jan Beulich,
Roger Pau Monné, Timothy Pearson, Alistair Francis,
Connor Davis
On 09/01/2026 1:17 pm, Orzel, Michal wrote:
>
> On 07/01/2026 17:28, Oleksii Kurochko wrote:
>> alloc_vcpu_struct() and free_vcpu_struct() contain little
>> architecture-specific logic and are suitable for sharing across
>> architectures. Move both helpers to common code.
>>
>> To support the remaining architectural differences, introduce
>> arch_vcpu_struct_memflags(), allowing architectures to override the
>> memory flags passed to alloc_xenheap_pages(). This is currently needed
>> by x86, which may require MEMF_bits(32) for HVM guests using shadow
>> paging.
>>
>> The ARM implementation of alloc/free_vcpu_struct() is removed and
>> replaced by the common version. Stub implementations are also dropped
>> from PPC and RISC-V.
>>
>> Now that the size of struct vcpu for Arm64 is smaller than PAGE_SIZE,
>> MAX_PAGES_PER_VCPU is no longer needed and is removed.
>>
>> Finally, make alloc_vcpu_struct() and free_vcpu_struct() static to
>> common/domain.c, as they are no longer used outside common code.
>>
>> No functional changes.
>>
>> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
>> Acked-by: Jan Beulich <jbeulich@suse.com>
>> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
> In case you need Arm tag here:
> Acked-by: Michal Orzel <michal.orzel@amd.com>
Thanks. I think that's now sufficient to finish this series. I'll
queue it in my next sweep.
~Andrew
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v5 3/3] xen/common: make {alloc,free}_domain_struct() static
2026-01-07 16:28 [PATCH v5 0/3] Move alloc/free_vcpu_struct() to common code Oleksii Kurochko
2026-01-07 16:28 ` [PATCH v5 1/3] xen/arm: optimize the size of struct vcpu Oleksii Kurochko
2026-01-07 16:28 ` [PATCH v5 2/3] xen: move alloc/free_vcpu_struct() to common code Oleksii Kurochko
@ 2026-01-07 16:29 ` Oleksii Kurochko
2 siblings, 0 replies; 7+ messages in thread
From: Oleksii Kurochko @ 2026-01-07 16:29 UTC (permalink / raw)
To: xen-devel
Cc: Oleksii Kurochko, Andrew Cooper, Anthony PERARD, Michal Orzel,
Jan Beulich, Julien Grall, Roger Pau Monné,
Stefano Stabellini
As {alloc,free}_domain_struct() are used only within domain.c,
they can be declared static and their declarations removed
from xen/domain.h.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
Changes in v5:
- Nothing changed. Only rebase.
---
Changes in v4:
- Move implementation of alloc_domain_struct() and free_domain_struct()
ahead of alloc_vcpu_struct().
---
Changes in v3:
- Move alloc_domain_struct() and free_domain_struct() to not have
forward declaration.
- Add Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>.
---
Changes in v2:
- New patch.
---
xen/common/domain.c | 42 ++++++++++++++++++++--------------------
xen/include/xen/domain.h | 4 ----
2 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 655d9590f846..ed4b6175de0b 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -316,6 +316,27 @@ static void vcpu_info_reset(struct vcpu *v)
: &dummy_vcpu_info);
}
+static struct domain *alloc_domain_struct(void)
+{
+#ifndef arch_domain_struct_memflags
+# define arch_domain_struct_memflags() 0
+#endif
+
+ struct domain *d = alloc_xenheap_pages(0, arch_domain_struct_memflags());
+
+ BUILD_BUG_ON(sizeof(*d) > PAGE_SIZE);
+
+ if ( d )
+ clear_page(d);
+
+ return d;
+}
+
+static void free_domain_struct(struct domain *d)
+{
+ free_xenheap_page(d);
+}
+
static struct vcpu *alloc_vcpu_struct(const struct domain *d)
{
#ifndef arch_vcpu_struct_memflags
@@ -819,27 +840,6 @@ static int sanitise_domain_config(struct xen_domctl_createdomain *config)
return arch_sanitise_domain_config(config);
}
-struct domain *alloc_domain_struct(void)
-{
-#ifndef arch_domain_struct_memflags
-# define arch_domain_struct_memflags() 0
-#endif
-
- struct domain *d = alloc_xenheap_pages(0, arch_domain_struct_memflags());
-
- BUILD_BUG_ON(sizeof(*d) > PAGE_SIZE);
-
- if ( d )
- clear_page(d);
-
- return d;
-}
-
-void free_domain_struct(struct domain *d)
-{
- free_xenheap_page(d);
-}
-
struct domain *domain_create(domid_t domid,
struct xen_domctl_createdomain *config,
unsigned int flags)
diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h
index 644f5ac3f293..273717c31b3f 100644
--- a/xen/include/xen/domain.h
+++ b/xen/include/xen/domain.h
@@ -66,10 +66,6 @@ void domid_free(domid_t domid);
* Arch-specifics.
*/
-/* Allocate/free a domain structure. */
-struct domain *alloc_domain_struct(void);
-void free_domain_struct(struct domain *d);
-
/* Allocate/free a PIRQ structure. */
#ifndef alloc_pirq_struct
struct pirq *alloc_pirq_struct(struct domain *d);
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread