|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 5/6] arm/dom0less: assign dom0less guests to cpupools
On Thu, 10 Mar 2022, Luca Fancellu wrote:
> Introduce domain-cpupool property of a xen,domain device tree node,
> that specifies the cpupool device tree handle of a xen,cpupool node
> that identifies a cpupool created at boot time where the guest will
> be assigned on creation.
>
> Add member to the xen_domctl_createdomain public interface so the
> XEN_DOMCTL_INTERFACE_VERSION version is bumped.
>
> Add public function to retrieve a pool id from the device tree
> cpupool node.
>
> Update documentation about the property.
>
> Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx>
> ---
> Changes in v2:
> - Moved cpupool_id from arch specific to common part (Juergen)
> - Implemented functions to retrieve the cpupool id from the
> cpupool dtb node.
> ---
> docs/misc/arm/device-tree/booting.txt | 5 +++++
> xen/arch/arm/domain_build.c | 14 +++++++++++++-
> xen/common/boot_cpupools.c | 24 ++++++++++++++++++++++++
> xen/common/domain.c | 2 +-
> xen/include/public/domctl.h | 4 +++-
> xen/include/xen/sched.h | 9 +++++++++
> 6 files changed, 55 insertions(+), 3 deletions(-)
>
> diff --git a/docs/misc/arm/device-tree/booting.txt
> b/docs/misc/arm/device-tree/booting.txt
> index a94125394e35..7b4a29a2c293 100644
> --- a/docs/misc/arm/device-tree/booting.txt
> +++ b/docs/misc/arm/device-tree/booting.txt
> @@ -188,6 +188,11 @@ with the following properties:
> An empty property to request the memory of the domain to be
> direct-map (guest physical address == physical address).
>
> +- domain-cpupool
> +
> + Optional. Handle to a xen,cpupool device tree node that identifies the
> + cpupool where the guest will be started at boot.
> +
> Under the "xen,domain" compatible node, one or more sub-nodes are present
> for the DomU kernel and ramdisk.
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 8be01678de05..9c67a483d4a4 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -3172,7 +3172,8 @@ static int __init construct_domU(struct domain *d,
> void __init create_domUs(void)
> {
> struct dt_device_node *node;
> - const struct dt_device_node *chosen = dt_find_node_by_path("/chosen");
> + const struct dt_device_node *cpupool_node,
> + *chosen = dt_find_node_by_path("/chosen");
>
> BUG_ON(chosen == NULL);
> dt_for_each_child_node(chosen, node)
> @@ -3241,6 +3242,17 @@ void __init create_domUs(void)
> vpl011_virq - 32 + 1);
> }
>
> + /* Get the optional property domain-cpupool */
> + cpupool_node = dt_parse_phandle(node, "domain-cpupool", 0);
> + if ( cpupool_node )
> + {
> + int pool_id = btcpupools_get_domain_pool_id(cpupool_node);
> + if ( pool_id < 0 )
> + panic("Error getting cpupool id from domain-cpupool (%d)\n",
> + pool_id);
> + d_cfg.cpupool_id = pool_id;
> + }
> +
> /*
> * The variable max_init_domid is initialized with zero, so here it's
> * very important to use the pre-increment operator to call
> diff --git a/xen/common/boot_cpupools.c b/xen/common/boot_cpupools.c
> index e8529a902d21..01a69f894f14 100644
> --- a/xen/common/boot_cpupools.c
> +++ b/xen/common/boot_cpupools.c
> @@ -11,6 +11,8 @@
>
> #define BTCPUPOOLS_DT_NODE_NO_REG (-1)
> #define BTCPUPOOLS_DT_NODE_NO_LOG_CPU (-2)
> +#define BTCPUPOOLS_DT_WRONG_NODE (-3)
> +#define BTCPUPOOLS_DT_CORRUPTED_NODE (-4)
>
> struct pool_map {
> int pool_id;
> @@ -53,6 +55,28 @@ get_logical_cpu_from_cpu_node(const struct dt_device_node
> *cpu_node)
> return cpu_num;
> }
>
> +int __init btcpupools_get_domain_pool_id(const struct dt_device_node *node)
> +{
> + const struct dt_device_node *phandle_node;
> + int cpu_num;
> +
> + if ( !dt_device_is_compatible(node, "xen,cpupool") )
> + return BTCPUPOOLS_DT_WRONG_NODE;
> + /*
> + * Get first cpu listed in the cpupool, from its reg it's possible to
> + * retrieve the cpupool id.
> + */
> + phandle_node = dt_parse_phandle(node, "cpupool-cpus", 0);
> + if ( !phandle_node )
> + return BTCPUPOOLS_DT_CORRUPTED_NODE;
> +
> + cpu_num = get_logical_cpu_from_cpu_node(phandle_node);
> + if ( cpu_num < 0 )
> + return cpu_num;
> +
> + return pool_cpu_map[cpu_num].pool_id;
> +}
Nice!
> static int __init check_and_get_sched_id(const char* scheduler_name)
> {
> int sched_id = sched_get_id_by_name(scheduler_name);
> diff --git a/xen/common/domain.c b/xen/common/domain.c
> index 351029f8b239..0827400f4f49 100644
> --- a/xen/common/domain.c
> +++ b/xen/common/domain.c
> @@ -698,7 +698,7 @@ struct domain *domain_create(domid_t domid,
> if ( !d->pbuf )
> goto fail;
>
> - if ( (err = sched_init_domain(d, 0)) != 0 )
> + if ( (err = sched_init_domain(d, config->cpupool_id)) != 0 )
> goto fail;
>
> if ( (err = late_hwdom_init(d)) != 0 )
> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
> index b85e6170b0aa..3d431a8031fd 100644
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -38,7 +38,7 @@
> #include "hvm/save.h"
> #include "memory.h"
>
> -#define XEN_DOMCTL_INTERFACE_VERSION 0x00000014
> +#define XEN_DOMCTL_INTERFACE_VERSION 0x00000015
>
> /*
> * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
> @@ -106,6 +106,8 @@ struct xen_domctl_createdomain {
> /* Per-vCPU buffer size in bytes. 0 to disable. */
> uint32_t vmtrace_size;
>
> + unsigned int cpupool_id;
Please use an explicitly sized integer
> struct xen_arch_domainconfig arch;
> };
>
> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
> index de4e8feea399..30a6538452bc 100644
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -1182,6 +1182,7 @@ struct cpupool *btcpupools_get_cpupool(unsigned int
> cpu);
>
> #ifdef CONFIG_ARM
> void btcpupools_dtb_parse(void);
> +int btcpupools_get_domain_pool_id(const struct dt_device_node *node);
> #else
> static inline void btcpupools_dtb_parse(void) {}
> #endif
> @@ -1193,6 +1194,14 @@ static inline struct cpupool
> *btcpupools_get_cpupool(unsigned int cpu)
> {
> return cpupool0;
> }
> +#ifdef CONFIG_ARM
> +static inline int
> +btcpupools_get_domain_pool_id(const struct dt_device_node *node)
> +{
> + return 0;
> +}
> +#endif
> +
> #endif
>
> #endif /* __SCHED_H__ */
> --
> 2.17.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |