Messages in this thread | | | From | Huacai Chen <> | Date | Thu, 18 Apr 2024 11:17:43 +0800 | Subject | Re: [PATCH v4 3/3] LoongArch: Give chance to build under !CONFIG_SMP |
| |
Hi, Tiezhu,
On Wed, Apr 17, 2024 at 6:00 PM Tiezhu Yang <yangtiezhu@loongson.cn> 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@loongson.cn> > --- > 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 > >
| |