Re: [PATCH v4 3/3] LoongArch: Give chance to build under !CONFIG_SMP

From: Huacai Chen
Date: Wed Apr 17 2024 - 23:17:59 EST


Hi, Tiezhu,

On Wed, Apr 17, 2024 at 6:00 PM Tiezhu Yang <yangtiezhu@xxxxxxxxxxx> wrote:
>
> In the current code, SMP is selected in Kconfig for LoongArch, the users
> can not unset it, this is reasonable for a multiprocessor machine. But as
> the help info of config SMP said, if you have a system with only one CPU,
> say N. On a uniprocessor machine, the kernel will run faster if you say N
> here.
>
> The Loongson-2K0500 is a single-core CPU for applications like industrial
> control, printing terminals, and BMC (Baseboard Management Controller),
> there are many development boards, products and solutions on the market,
> so it is better and necessary to give a chance to build under !CONFIG_SMP
> for a uniprocessor machine.
>
> First of all, do not select SMP for config LOONGARCH in Kconfig to make it
> possible to unset CONFIG_SMP. Then, do some changes to fix the warnings and
> errors if CONFIG_SMP is not set.
>
> (1) Define get_ipi_irq() only if CONFIG_SMP is set to fix the warning:
> arch/loongarch/kernel/irq.c:90:19: warning: 'get_ipi_irq' defined but not used [-Wunused-function]
>
> (2) Add "#ifdef CONFIG_SMP" in asm/smp.h to fix the warning:
> ./arch/loongarch/include/asm/smp.h:49:9: warning: "raw_smp_processor_id" redefined
> 49 | #define raw_smp_processor_id raw_smp_processor_id
> | ^~~~~~~~~~~~~~~~~~~~
> ./include/linux/smp.h:198:9: note: this is the location of the previous definition
> 198 | #define raw_smp_processor_id() 0
>
> (3) Define machine_shutdown() as empty under !CONFIG_SMP to fix the error:
> arch/loongarch/kernel/machine_kexec.c: In function 'machine_shutdown':
> arch/loongarch/kernel/machine_kexec.c:233:25: error: implicit declaration of function 'cpu_device_up'; did you mean 'put_device'? [-Wimplicit-function-declaration]
>
> (4) Make config SCHED_SMT depends on SMP to fix many errors such as:
> kernel/sched/core.c: In function 'sched_core_find':
> kernel/sched/core.c:310:43: error: 'struct rq' has no member named 'cpu'
>
> (5) Define cpu_logical_map(cpu) as read_csr_cpuid() under !CONFIG_SMP
> in asm/smp.h and then include asm/smp.h in asm/acpi.h (because acpi.h
> is included in linux/irq.h indirectly) to fix many build errors under
> drivers/irqchip such as:
> drivers/irqchip/irq-loongson-eiointc.c: In function 'cpu_to_eio_node':
> drivers/irqchip/irq-loongson-eiointc.c:59:16: error: implicit declaration of function 'cpu_logical_map' [-Wimplicit-function-declaration]
>
> When running the UnixBench tests with "-c 1" single-streamed pass,
> the improvement in performance is about 9 percent with this patch.
>
> By the way, it is helpful to debug and analysis the kernel issue
> of multi-core system under !CONFIG_SMP.
>
> Signed-off-by: Tiezhu Yang <yangtiezhu@xxxxxxxxxxx>
> ---
> arch/loongarch/Kconfig | 2 +-
> arch/loongarch/include/asm/acpi.h | 1 +
> arch/loongarch/include/asm/smp.h | 5 +++++
> arch/loongarch/kernel/irq.c | 2 ++
> arch/loongarch/kernel/machine_kexec.c | 2 +-
> 5 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
> index a5f300ec6f28..8d892de0b7a8 100644
> --- a/arch/loongarch/Kconfig
> +++ b/arch/loongarch/Kconfig
> @@ -174,7 +174,6 @@ config LOONGARCH
> select PCI_QUIRKS
> select PERF_USE_VMALLOC
> select RTC_LIB
> - select SMP
> select SPARSE_IRQ
> select SYSCTL_ARCH_UNALIGN_ALLOW
> select SYSCTL_ARCH_UNALIGN_NO_WARN
> @@ -420,6 +419,7 @@ config EFI_STUB
>
> config SCHED_SMT
> bool "SMT scheduler support"
> + depends on SMP
> default y
> help
> Improves scheduler's performance when there are multiple
> diff --git a/arch/loongarch/include/asm/acpi.h b/arch/loongarch/include/asm/acpi.h
> index 49e29b29996f..313f66f7913a 100644
> --- a/arch/loongarch/include/asm/acpi.h
> +++ b/arch/loongarch/include/asm/acpi.h
> @@ -8,6 +8,7 @@
> #ifndef _ASM_LOONGARCH_ACPI_H
> #define _ASM_LOONGARCH_ACPI_H
>
> +#include <asm/smp.h>
> #include <asm/suspend.h>
>
> #ifdef CONFIG_ACPI
> diff --git a/arch/loongarch/include/asm/smp.h b/arch/loongarch/include/asm/smp.h
> index f81e5f01d619..1ec11b57e60c 100644
> --- a/arch/loongarch/include/asm/smp.h
> +++ b/arch/loongarch/include/asm/smp.h
> @@ -6,6 +6,7 @@
> #ifndef __ASM_SMP_H
> #define __ASM_SMP_H
>
> +#ifdef CONFIG_SMP
> #include <linux/atomic.h>
> #include <linux/bitops.h>
> #include <linux/linkage.h>
> @@ -101,4 +102,8 @@ static inline void __cpu_die(unsigned int cpu)
> }
> #endif
>
> +#else /* !CONFIG_SMP */
> +#define cpu_logical_map(cpu) read_csr_cpuid()
> +#endif /* CONFIG_SMP */
Non-SMP kernel is not supposed to run on SMP hardware, just define it
to 0 to keep it as simple as possible.

Huacai

> +
> #endif /* __ASM_SMP_H */
> diff --git a/arch/loongarch/kernel/irq.c b/arch/loongarch/kernel/irq.c
> index 883e5066ae44..e791fa275ec5 100644
> --- a/arch/loongarch/kernel/irq.c
> +++ b/arch/loongarch/kernel/irq.c
> @@ -87,6 +87,7 @@ static void __init init_vec_parent_group(void)
> acpi_table_parse(ACPI_SIG_MCFG, early_pci_mcfg_parse);
> }
>
> +#ifdef CONFIG_SMP
> static int __init get_ipi_irq(void)
> {
> struct irq_domain *d = irq_find_matching_fwnode(cpuintc_handle, DOMAIN_BUS_ANY);
> @@ -96,6 +97,7 @@ static int __init get_ipi_irq(void)
>
> return -EINVAL;
> }
> +#endif
>
> void __init init_IRQ(void)
> {
> diff --git a/arch/loongarch/kernel/machine_kexec.c b/arch/loongarch/kernel/machine_kexec.c
> index 2dcb9e003657..8ae641dc53bb 100644
> --- a/arch/loongarch/kernel/machine_kexec.c
> +++ b/arch/loongarch/kernel/machine_kexec.c
> @@ -225,6 +225,7 @@ void crash_smp_send_stop(void)
>
> void machine_shutdown(void)
> {
> +#ifdef CONFIG_SMP
> int cpu;
>
> /* All CPUs go to reboot_code_buffer */
> @@ -232,7 +233,6 @@ void machine_shutdown(void)
> if (!cpu_online(cpu))
> cpu_device_up(get_cpu_device(cpu));
>
> -#ifdef CONFIG_SMP
> smp_call_function(kexec_shutdown_secondary, NULL, 0);
> #endif
> }
> --
> 2.42.0
>
>