|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 6/9] xen/riscv: introduce functionality to work with cpu info
On 24.07.2024 17:31, Oleksii Kurochko wrote:
> --- a/xen/arch/riscv/include/asm/processor.h
> +++ b/xen/arch/riscv/include/asm/processor.h
> @@ -12,8 +12,39 @@
>
> #ifndef __ASSEMBLY__
>
> -/* TODO: need to be implemeted */
> -#define smp_processor_id() 0
> +#include <xen/bug.h>
> +#include <xen/types.h>
> +
> +register struct pcpu_info *tp asm ("tp");
> +
> +struct pcpu_info {
> + unsigned int processor_id;
> +};
> +
> +/* tp points to one of these */
> +extern struct pcpu_info pcpu_info[NR_CPUS];
> +
> +#define get_processor_id() (tp->processor_id)
> +#define set_processor_id(id) do { \
> + tp->processor_id = id; \
Nit: Parentheses around id please.
> +} while(0)
While often we omit the blanks inside the parentheses for such
constructs, the one ahead of the opening paren should still be there.
> +static inline unsigned int smp_processor_id(void)
> +{
> + unsigned int id;
> +
> + id = get_processor_id();
> +
> + /*
> + * Technically the hartid can be greater than what a uint can hold.
> + * If such a system were to exist, we will need to change
> + * the smp_processor_id() API to be unsigned long instead of
> + * unsigned int.
> + */
> + BUG_ON(id > UINT_MAX);
Compilers may complaing about this condition being always false. But: Why
do you check against UINT_MAX, not against NR_CPUS? It's not the hart ID
your retrieving get_processor_id(), but Xen's, isn't it? Even if I'm
missing something here, ...
> --- a/xen/arch/riscv/include/asm/smp.h
> +++ b/xen/arch/riscv/include/asm/smp.h
> @@ -5,6 +5,8 @@
> #include <xen/cpumask.h>
> #include <xen/percpu.h>
>
> +#define INVALID_HARTID UINT_MAX
... this implies that the check above would need to use >=.
> @@ -14,6 +16,14 @@ DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
> */
> #define park_offline_cpus false
>
> +void smp_setup_processor_id(unsigned long boot_cpu_hartid);
> +
> +/*
> + * Mapping between linux logical cpu index and hartid.
> + */
> +extern unsigned long __cpuid_to_hartid_map[NR_CPUS];
> +#define cpuid_to_hartid_map(cpu) __cpuid_to_hartid_map[cpu]
May I please ask that there be no new variables with double underscores
at the front or any other namespacing violations?
> --- a/xen/arch/riscv/setup.c
> +++ b/xen/arch/riscv/setup.c
> @@ -40,6 +40,19 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
> {
> remove_identity_mapping();
>
> + /*
> + * tp register contains an address of physical cpu information.
> + * So write physical CPU info of boot cpu to tp register
> + * It will be used later by get_processor_id() to get process_id ( look
> at
process_id?
> + * <asm/processor.h> ):
> + * #define get_processor_id() (tp->processor_id)
> + */
> + asm volatile ("mv tp, %0" : : "r"((unsigned long)&pcpu_info[0]));
Nit: Blanks missing.
> --- /dev/null
> +++ b/xen/arch/riscv/smp.c
> @@ -0,0 +1,4 @@
> +#include <xen/smp.h>
> +
> +/* tp points to one of these per cpu */
> +struct pcpu_info pcpu_info[NR_CPUS];
> \ No newline at end of file
Please correct this.
> --- /dev/null
> +++ b/xen/arch/riscv/smpboot.c
> @@ -0,0 +1,12 @@
> +#include <xen/init.h>
> +#include <xen/sections.h>
> +#include <xen/smp.h>
> +
> +unsigned long __cpuid_to_hartid_map[NR_CPUS] __ro_after_init = {
> + [0 ... NR_CPUS-1] = INVALID_HARTID
Nit: Blanks around - please.
> +};
> +
> +void __init smp_setup_processor_id(unsigned long boot_cpu_hartid)
> +{
> + cpuid_to_hartid_map(0) = boot_cpu_hartid;
> +}
The function name suggests this can be used for all CPUs, but the
code is pretty clear abut this being for the boot CPU only.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |