From c11936810da66cb5244ef3908d3eafcfc6992f86 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sat, 22 Nov 2025 18:48:06 +0800 Subject: [PATCH 01/17] xx --- arch/riscv/kernel/smp/smp.c | 4 +++ include/linux/smp.h | 14 ++++++++++ .../sched/_core_/smp/resched_curr_other_cpu.c | 27 +++++++++++++++++++ kern/sched/core.c | 11 ++++++-- 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 kern/sched/_core_/smp/resched_curr_other_cpu.c diff --git a/arch/riscv/kernel/smp/smp.c b/arch/riscv/kernel/smp/smp.c index 754868d..87660da 100644 --- a/arch/riscv/kernel/smp/smp.c +++ b/arch/riscv/kernel/smp/smp.c @@ -42,3 +42,7 @@ unsigned raw_smp_processor_id(void) { return current_thread_info()->cpu; } + +void arch_smp_send_reschedule(int cpu) +{ +} diff --git a/include/linux/smp.h b/include/linux/smp.h index 7942c67..b23ec3e 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -40,6 +40,20 @@ extern unsigned int setup_max_cpus; */ extern void smp_prepare_cpus(unsigned int max_cpus); +/* + * sends a 'reschedule' event to another CPU: + */ +extern void arch_smp_send_reschedule(int cpu); + +/* + * scheduler_ipi() is inline so can't be passed as callback reason, but the + * callsite IP should be sufficient for root-causing IPIs sent from here. + */ +#define smp_send_reschedule(cpu) \ + ({ \ + arch_smp_send_reschedule(cpu); \ + }) + #else /* !smp */ #define raw_smp_processor_id() 0 diff --git a/kern/sched/_core_/smp/resched_curr_other_cpu.c b/kern/sched/_core_/smp/resched_curr_other_cpu.c new file mode 100644 index 0000000..fae1341 --- /dev/null +++ b/kern/sched/_core_/smp/resched_curr_other_cpu.c @@ -0,0 +1,27 @@ + +#ifdef CONFIG_SMP + +static inline bool set_nr_and_not_polling(struct thread_info *ti, int tif) +{ + set_ti_thread_flag(ti, tif); + return true; +} + +static inline bool set_nr_if_polling(struct task_struct *p) +{ + return false; +} + +static void inline resched_curr_other_cpu(struct thread_info *cti, int tif, int cpu) +{ + if (set_nr_and_not_polling(cti, tif)) + { + if (tif == TIF_NEED_RESCHED) + smp_send_reschedule(cpu); + } +} +#else +static void inline resched_curr_other_cpu(struct thread_info *cti, int tif, int cpu) +{ +} +#endif diff --git a/kern/sched/core.c b/kern/sched/core.c index 146302e..44cef23 100644 --- a/kern/sched/core.c +++ b/kern/sched/core.c @@ -31,12 +31,13 @@ bool sched_smp_initialized = false; #include "_core_/pi.c" #include "_core_/wake_q.c" #include "_core_/task_state_match.c" -#include "_core_/smp/select_task_rq.c" +#include "_core_/smp/select_task_rq.c" #include "_core_/wake_up.c" #include "_core_/set_load_weight.c" #include "_core_/smp/set_rq_online.c" #include "_core_/smp/cpu_active.c" #include "_core_/wait_task_inactive.c" +#include "_core_/smp/resched_curr_other_cpu.c" /* * Constants for the sched_mode argument of __schedule(). @@ -142,13 +143,19 @@ static void __resched_curr(struct rq *rq, int tif) if (is_idle_task(curr) && tif == TIF_NEED_RESCHED_LAZY) tif = TIF_NEED_RESCHED; + if (cti->flags & ((1 << tif) | _TIF_NEED_RESCHED)) + return; + cpu = cpu_of(rq); if (cpu == smp_processor_id()) { set_ti_thread_flag(cti, tif); if (tif == TIF_NEED_RESCHED) set_preempt_need_resched(); - return; + } + else + { + resched_curr_other_cpu(cti, tif, cpu); } } -- Gitee From d8724925bc7f03d02131f61ccfe5a5b23c551840 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sat, 22 Nov 2025 19:18:49 +0800 Subject: [PATCH 02/17] xx --- arch/riscv/include/riscv/sbi.h | 5 +++++ arch/riscv/sbi/sbi.c | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/arch/riscv/include/riscv/sbi.h b/arch/riscv/include/riscv/sbi.h index c8f9582..195a8b9 100644 --- a/arch/riscv/include/riscv/sbi.h +++ b/arch/riscv/include/riscv/sbi.h @@ -68,6 +68,11 @@ enum sbi_ext_hsm_fid SBI_EXT_HSM_HART_SUSPEND, }; +enum sbi_ext_ipi_fid +{ + SBI_EXT_IPI_SEND_IPI = 0, +}; + struct sbiret __sbi_ecall(unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, diff --git a/arch/riscv/sbi/sbi.c b/arch/riscv/sbi/sbi.c index e4b687e..4e2cf49 100644 --- a/arch/riscv/sbi/sbi.c +++ b/arch/riscv/sbi/sbi.c @@ -6,6 +6,16 @@ static void __sbi_set_timer_v01(uint64_t stime_value) sbi_ecall(SBI_EXT_0_1_SET_TIMER, 0, stime_value, 0, 0, 0, 0, 0); } +static int __sbi_send_ipi_v02(unsigned int hartid) +{ + struct sbiret ret = {0}; + + ret = sbi_ecall(SBI_EXT_IPI, SBI_EXT_IPI_SEND_IPI, + 1, hartid, 0, 0, 0, 0); + + return ret.error; +} + void sbi_set_timer(uint64_t stime_value) { __sbi_set_timer_v01(stime_value); -- Gitee From 7221994cb5042c40ddef2489c119a7f864b07245 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sat, 22 Nov 2025 19:23:48 +0800 Subject: [PATCH 03/17] xx --- arch/riscv/kernel/irq.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c index 65ba786..02c0102 100644 --- a/arch/riscv/kernel/irq.c +++ b/arch/riscv/kernel/irq.c @@ -4,7 +4,12 @@ __weak void irqchip_init(void) { } +__weak void sbi_ipi_init(void) +{ +} + void init_IRQ(void) { irqchip_init(); + sbi_ipi_init(); } -- Gitee From 3914a7b155a3cc583787a63d9b84211e56692e9e Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sat, 22 Nov 2025 20:30:12 +0800 Subject: [PATCH 04/17] xx --- arch/riscv/include/riscv/csr.h | 71 +++++++++++++++++----------------- arch/riscv/include/riscv/sbi.h | 1 + arch/riscv/sbi/sbi.c | 5 +++ include/linux/cpuhotplug.h | 1 + 4 files changed, 42 insertions(+), 36 deletions(-) diff --git a/arch/riscv/include/riscv/csr.h b/arch/riscv/include/riscv/csr.h index b1796cc..60972d4 100644 --- a/arch/riscv/include/riscv/csr.h +++ b/arch/riscv/include/riscv/csr.h @@ -1,48 +1,47 @@ #pragma once /* Status register flags */ -#define SR_SIE 0x00000002 /* Supervisor Interrupt Enable */ -#define SR_SPP 0x00000100 /* Previously Supervisor */ -#define SR_SUM 0x00040000 /* Supervisor User Memory Access */ - -#define SR_FS 0x00006000 /* Floating-point Status */ - -#define SR_VS 0x00000600 /* Vector Status */ - -#define SR_FS_VS (SR_FS | SR_VS) /* Vector and Floating-Point Unit */ - - -#define CSR_SSTATUS 0x100 -#define CSR_SIE 0x104 -#define CSR_STVEC 0x105 -#define CSR_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_STVAL 0x143 -#define CSR_SIP 0x144 -#define CSR_SATP 0x180 - - -#define CSR_IE CSR_SIE -#define CSR_IP CSR_SIP -#define CSR_TVEC CSR_STVEC -#define CSR_SCRATCH CSR_SSCRATCH +#define SR_SIE 0x00000002 /* Supervisor Interrupt Enable */ +#define SR_SPP 0x00000100 /* Previously Supervisor */ +#define SR_SUM 0x00040000 /* Supervisor User Memory Access */ + +#define SR_FS 0x00006000 /* Floating-point Status */ + +#define SR_VS 0x00000600 /* Vector Status */ + +#define SR_FS_VS (SR_FS | SR_VS) /* Vector and Floating-Point Unit */ + +#define CSR_SSTATUS 0x100 +#define CSR_SIE 0x104 +#define CSR_STVEC 0x105 +#define CSR_SSCRATCH 0x140 +#define CSR_SEPC 0x141 +#define CSR_SCAUSE 0x142 +#define CSR_STVAL 0x143 +#define CSR_SIP 0x144 +#define CSR_SATP 0x180 + +#define CSR_IE CSR_SIE +#define CSR_IP CSR_SIP +#define CSR_TVEC CSR_STVEC +#define CSR_SCRATCH CSR_SSCRATCH #define CSR_STATUS CSR_SSTATUS -#define CSR_EPC CSR_SEPC -#define CSR_CAUSE CSR_SCAUSE -#define CSR_TVAL CSR_STVAL - -#define SR_IE SR_SIE +#define CSR_EPC CSR_SEPC +#define CSR_CAUSE CSR_SCAUSE +#define CSR_TVAL CSR_STVAL +#define SR_IE SR_SIE +#define IRQ_S_SOFT 1 #define IRQ_S_TIMER 5 #define IRQ_S_EXT 9 -#define MIP_STIP (1 << IRQ_S_TIMER) +#define MIP_STIP (1 << IRQ_S_TIMER) -#define SIP_STIP MIP_STIP /* timer interrupt */ +#define SIP_STIP MIP_STIP /* timer interrupt */ -#define RV_IRQ_TIMER IRQ_S_TIMER -#define RV_IRQ_EXT IRQ_S_EXT +#define RV_IRQ_TIMER IRQ_S_TIMER +#define RV_IRQ_EXT IRQ_S_EXT +#define RV_IRQ_SOFT IRQ_S_SOFT -#define SATP_MODE_39 0x8000000000000000UL +#define SATP_MODE_39 0x8000000000000000UL diff --git a/arch/riscv/include/riscv/sbi.h b/arch/riscv/include/riscv/sbi.h index 195a8b9..3447716 100644 --- a/arch/riscv/include/riscv/sbi.h +++ b/arch/riscv/include/riscv/sbi.h @@ -87,3 +87,4 @@ void sbi_set_timer(uint64_t stime_value); void sbi_console_putchar(int ch); int sbi_err_map_linux_errno(int err); +int sbi_send_ipi(unsigned int hartid); diff --git a/arch/riscv/sbi/sbi.c b/arch/riscv/sbi/sbi.c index 4e2cf49..955cc02 100644 --- a/arch/riscv/sbi/sbi.c +++ b/arch/riscv/sbi/sbi.c @@ -54,6 +54,11 @@ int sbi_err_map_linux_errno(int err) return ret; } +int sbi_send_ipi(unsigned int hartid) +{ + return __sbi_send_ipi_v02(hartid); +} + void sbi_init(void) { } diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index f9aebb5..bb4c9f3 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -75,6 +75,7 @@ enum cpuhp_state CPUHP_AP_RCUTREE_DYING, CPUHP_AP_CPU_PM_STARTING, CPUHP_AP_IRQ_CHIP_STARTING, + CPUHP_AP_IRQ_IPI_STARTING, CPUHP_AP_PERF_CPU_STARTING, -- Gitee From e8dc8b2550dcba827d544b3041390a7ac5ab2e08 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 09:59:40 +0800 Subject: [PATCH 05/17] xx --- bsp/qemu-riscv-virt64/drivers/timer-ce.c | 2 +- bsp/qemu-riscv-virt64/irq/irqchip.c | 5 +++++ bsp/qemu-riscv-virt64/irq/sbi-ipi.c | 18 ++++++++++++++++++ include/linux/interrupt.h | 2 ++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 bsp/qemu-riscv-virt64/irq/sbi-ipi.c diff --git a/bsp/qemu-riscv-virt64/drivers/timer-ce.c b/bsp/qemu-riscv-virt64/drivers/timer-ce.c index fffad7b..7a3ee64 100644 --- a/bsp/qemu-riscv-virt64/drivers/timer-ce.c +++ b/bsp/qemu-riscv-virt64/drivers/timer-ce.c @@ -39,7 +39,7 @@ static int riscv_timer_starting_cpu(unsigned int cpu) struct clock_event_device *ce = per_cpu_ptr(&riscv_clock_event, cpu); clockevents_config_and_register(ce, CPUTIME_TIMER_FREQ, 100, 100000); - csr_set(CSR_IE, 1 << RV_IRQ_TIMER); + enable_percpu_irq(RV_IRQ_TIMER, 0); return 0; } diff --git a/bsp/qemu-riscv-virt64/irq/irqchip.c b/bsp/qemu-riscv-virt64/irq/irqchip.c index 10854c9..5ba6cc4 100644 --- a/bsp/qemu-riscv-virt64/irq/irqchip.c +++ b/bsp/qemu-riscv-virt64/irq/irqchip.c @@ -43,6 +43,11 @@ int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, return 0; } +void enable_percpu_irq(unsigned int irq, unsigned int type) +{ + csr_set(CSR_IE, 1 << irq); +} + static int plic_dying_cpu(unsigned int cpu) { if (plic_parent_irq) diff --git a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c new file mode 100644 index 0000000..0fd3a0b --- /dev/null +++ b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c @@ -0,0 +1,18 @@ +#include +#include + +#include + +static int sbi_ipi_starting_cpu(unsigned int cpu) +{ + enable_percpu_irq(RV_IRQ_SOFT, 0); + + return 0; +} + +void sbi_ipi_init(void) +{ + cpuhp_setup_state(CPUHP_AP_IRQ_IPI_STARTING, + "irqchip/sbi-ipi:starting", + sbi_ipi_starting_cpu, NULL); +} diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 915bef9..af2ec49 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -20,3 +20,5 @@ extern int request_irq(unsigned int irq, irq_handler_t handler, unsigned long fl extern int request_percpu_irq(unsigned int irq, irq_handler_t handler, const char *devname, void *percpu_dev_id); + +extern void enable_percpu_irq(unsigned int irq, unsigned int type); -- Gitee From 06e4bec6f68dcd20f4ce13e0a737bf81656dd77a Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 10:07:01 +0800 Subject: [PATCH 06/17] xx --- bsp/qemu-riscv-virt64/irq/sbi-ipi.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c index 0fd3a0b..64ca0d0 100644 --- a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c +++ b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c @@ -2,6 +2,7 @@ #include #include +#include static int sbi_ipi_starting_cpu(unsigned int cpu) { @@ -10,8 +11,15 @@ static int sbi_ipi_starting_cpu(unsigned int cpu) return 0; } +static irqreturn_t ipi_handler(int irq, void *data) +{ + return IRQ_HANDLED; +} + void sbi_ipi_init(void) { + request_percpu_irq(RV_IRQ_SOFT, ipi_handler, "ipi", 0); + cpuhp_setup_state(CPUHP_AP_IRQ_IPI_STARTING, "irqchip/sbi-ipi:starting", sbi_ipi_starting_cpu, NULL); -- Gitee From 2d01585b3465aa401571144c54c4811f3cb5b347 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 10:18:09 +0800 Subject: [PATCH 07/17] xx --- arch/riscv/include/riscv/ipi.h | 20 ++++++++++++++++++++ arch/riscv/kernel/smp/smp.c | 19 +++++-------------- 2 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 arch/riscv/include/riscv/ipi.h diff --git a/arch/riscv/include/riscv/ipi.h b/arch/riscv/include/riscv/ipi.h new file mode 100644 index 0000000..1b79a99 --- /dev/null +++ b/arch/riscv/include/riscv/ipi.h @@ -0,0 +1,20 @@ +#pragma once + +enum ipi_message_type +{ + IPI_RESCHEDULE, + IPI_CALL_FUNC, + IPI_CPU_STOP, + IPI_CPU_CRASH_STOP, + IPI_IRQ_WORK, + IPI_TIMER, + IPI_CPU_BACKTRACE, + IPI_KGDB_ROUNDUP, + + IPI_MAX +}; + +/* + __weak - +*/ +void send_ipi_single(int cpu, enum ipi_message_type op); diff --git a/arch/riscv/kernel/smp/smp.c b/arch/riscv/kernel/smp/smp.c index 87660da..00ff8ff 100644 --- a/arch/riscv/kernel/smp/smp.c +++ b/arch/riscv/kernel/smp/smp.c @@ -5,20 +5,6 @@ extern unsigned long boot_cpu_hartid; -enum ipi_message_type -{ - IPI_RESCHEDULE, - IPI_CALL_FUNC, - IPI_CPU_STOP, - IPI_CPU_CRASH_STOP, - IPI_IRQ_WORK, - IPI_TIMER, - IPI_CPU_BACKTRACE, - IPI_KGDB_ROUNDUP, - - IPI_MAX -}; - static unsigned int __cpuid_to_hartid_map[NR_CPUS] = { [0 ... NR_CPUS - 1] = INVALID_HARTID, }; @@ -43,6 +29,11 @@ unsigned raw_smp_processor_id(void) return current_thread_info()->cpu; } +__weak void send_ipi_single(int cpu, enum ipi_message_type op) +{ +} + void arch_smp_send_reschedule(int cpu) { + send_ipi_single(cpu, IPI_RESCHEDULE); } -- Gitee From cd3499f1af30acfe485604214985beba13a01110 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 10:22:49 +0800 Subject: [PATCH 08/17] xx --- arch/riscv/include/riscv/ipi.h | 2 +- bsp/qemu-riscv-virt64/irq/sbi-ipi.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/arch/riscv/include/riscv/ipi.h b/arch/riscv/include/riscv/ipi.h index 1b79a99..8897856 100644 --- a/arch/riscv/include/riscv/ipi.h +++ b/arch/riscv/include/riscv/ipi.h @@ -17,4 +17,4 @@ enum ipi_message_type /* __weak - */ -void send_ipi_single(int cpu, enum ipi_message_type op); +extern void send_ipi_single(int cpu, enum ipi_message_type op); diff --git a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c index 64ca0d0..161d8af 100644 --- a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c +++ b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c @@ -3,6 +3,8 @@ #include #include +#include +#include static int sbi_ipi_starting_cpu(unsigned int cpu) { @@ -16,6 +18,13 @@ static irqreturn_t ipi_handler(int irq, void *data) return IRQ_HANDLED; } +void send_ipi_single(int cpu, enum ipi_message_type op) +{ + unsigned int hartid = cpuid_to_hartid_map(cpu); + + sbi_send_ipi(hartid); +} + void sbi_ipi_init(void) { request_percpu_irq(RV_IRQ_SOFT, ipi_handler, "ipi", 0); -- Gitee From 930a3177a29663e1ff199c6e4bb546c1648cf3ed Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 10:56:24 +0800 Subject: [PATCH 09/17] xx --- arch/riscv/kernel/smp/smp.c | 1 + bsp/qemu-riscv-virt64/irq/sbi-ipi.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/riscv/kernel/smp/smp.c b/arch/riscv/kernel/smp/smp.c index 00ff8ff..5c72122 100644 --- a/arch/riscv/kernel/smp/smp.c +++ b/arch/riscv/kernel/smp/smp.c @@ -2,6 +2,7 @@ #include #include +#include extern unsigned long boot_cpu_hartid; diff --git a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c index 161d8af..ad73ad4 100644 --- a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c +++ b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c @@ -31,5 +31,5 @@ void sbi_ipi_init(void) cpuhp_setup_state(CPUHP_AP_IRQ_IPI_STARTING, "irqchip/sbi-ipi:starting", - sbi_ipi_starting_cpu, NULL); + sbi_ipi_starting_cpu, 0); } -- Gitee From 8fc80aa539a1d5b48e03b274f4bab95a5ee60b5c Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 11:10:01 +0800 Subject: [PATCH 10/17] xx --- bsp/qemu-riscv-virt64/irq/irqchip.c | 5 ++--- bsp/qemu-riscv-virt64/irq/sbi-ipi.c | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bsp/qemu-riscv-virt64/irq/irqchip.c b/bsp/qemu-riscv-virt64/irq/irqchip.c index 5ba6cc4..7e3a22d 100644 --- a/bsp/qemu-riscv-virt64/irq/irqchip.c +++ b/bsp/qemu-riscv-virt64/irq/irqchip.c @@ -73,11 +73,10 @@ static int plic_starting_cpu(unsigned int cpu) static void plic_handle_irq(struct pt_regs *regs) { - int irq; + int irq = regs->cause & 0xff; - if ((regs->cause & 0xff) == 5) + if (irq < RV_IRQ_EXT) { - irq = 5; if (_act[irq].handler) { _act[irq].handler(irq, _act[irq].dev_id); diff --git a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c index ad73ad4..4c4bbce 100644 --- a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c +++ b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c @@ -15,6 +15,8 @@ static int sbi_ipi_starting_cpu(unsigned int cpu) static irqreturn_t ipi_handler(int irq, void *data) { + csr_clear(CSR_IP, (1 << RV_IRQ_TIMER)); + return IRQ_HANDLED; } -- Gitee From 5763f27dc82d6e86da9fe2c760a18885517424c9 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 11:13:36 +0800 Subject: [PATCH 11/17] xx --- bsp/qemu-riscv-virt64/irq/sbi-ipi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c index 4c4bbce..9038cbf 100644 --- a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c +++ b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c @@ -15,7 +15,7 @@ static int sbi_ipi_starting_cpu(unsigned int cpu) static irqreturn_t ipi_handler(int irq, void *data) { - csr_clear(CSR_IP, (1 << RV_IRQ_TIMER)); + csr_clear(CSR_IP, (1 << RV_IRQ_SOFT)); return IRQ_HANDLED; } -- Gitee From 6cae7ef0ca10680bef67bc7688efde171629e64b Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 14:48:46 +0800 Subject: [PATCH 12/17] xx --- arch/riscv/include/riscv/ipi.h | 7 ++++++- arch/riscv/kernel/smp/smp.c | 11 +++++++++++ bsp/qemu-riscv-virt64/irq/sbi-ipi.c | 2 ++ include/linux/sched.h | 2 ++ kern/sched/core.c | 5 +++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/arch/riscv/include/riscv/ipi.h b/arch/riscv/include/riscv/ipi.h index 8897856..e45e70f 100644 --- a/arch/riscv/include/riscv/ipi.h +++ b/arch/riscv/include/riscv/ipi.h @@ -15,6 +15,11 @@ enum ipi_message_type }; /* - __weak - + send_ipi_single - this is a 'weak' function, implete me in SMP */ extern void send_ipi_single(int cpu, enum ipi_message_type op); + +/* + call me when IPI is received +*/ +void riscv_handle_ipi(enum ipi_message_type op); diff --git a/arch/riscv/kernel/smp/smp.c b/arch/riscv/kernel/smp/smp.c index 5c72122..8bf1c07 100644 --- a/arch/riscv/kernel/smp/smp.c +++ b/arch/riscv/kernel/smp/smp.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -30,6 +31,16 @@ unsigned raw_smp_processor_id(void) return current_thread_info()->cpu; } +void riscv_handle_ipi(enum ipi_message_type ipi) +{ + switch (ipi) + { + case IPI_RESCHEDULE: + scheduler_ipi(); + break; + } +} + __weak void send_ipi_single(int cpu, enum ipi_message_type op) { } diff --git a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c index 9038cbf..7faf182 100644 --- a/bsp/qemu-riscv-virt64/irq/sbi-ipi.c +++ b/bsp/qemu-riscv-virt64/irq/sbi-ipi.c @@ -15,6 +15,8 @@ static int sbi_ipi_starting_cpu(unsigned int cpu) static irqreturn_t ipi_handler(int irq, void *data) { + riscv_handle_ipi(IPI_RESCHEDULE); + csr_clear(CSR_IP, (1 << RV_IRQ_SOFT)); return IRQ_HANDLED; diff --git a/include/linux/sched.h b/include/linux/sched.h index 3c0a82b..60da910 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -165,3 +165,5 @@ extern unsigned long wait_task_inactive(struct task_struct *, unsigned int match /* do_set_cpus_allowed() - consider using set_cpus_allowed_ptr() instead */ extern void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); + +void scheduler_ipi(void); diff --git a/kern/sched/core.c b/kern/sched/core.c index 44cef23..463fd42 100644 --- a/kern/sched/core.c +++ b/kern/sched/core.c @@ -389,6 +389,11 @@ void __init sched_init_smp(void) sched_smp_initialized = true; } + +void scheduler_ipi(void) +{ + +} #else void __init sched_init_smp(void) { -- Gitee From 451cf5ba8d76f1b3b4a63177dcc37dceb8de0bec Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 17:09:12 +0800 Subject: [PATCH 13/17] xx --- .../{resched_curr_other_cpu.c => resched_curr_target_cpu.c} | 0 kern/sched/core.c | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename kern/sched/_core_/smp/{resched_curr_other_cpu.c => resched_curr_target_cpu.c} (100%) diff --git a/kern/sched/_core_/smp/resched_curr_other_cpu.c b/kern/sched/_core_/smp/resched_curr_target_cpu.c similarity index 100% rename from kern/sched/_core_/smp/resched_curr_other_cpu.c rename to kern/sched/_core_/smp/resched_curr_target_cpu.c diff --git a/kern/sched/core.c b/kern/sched/core.c index 463fd42..aa88eb1 100644 --- a/kern/sched/core.c +++ b/kern/sched/core.c @@ -37,7 +37,7 @@ bool sched_smp_initialized = false; #include "_core_/smp/set_rq_online.c" #include "_core_/smp/cpu_active.c" #include "_core_/wait_task_inactive.c" -#include "_core_/smp/resched_curr_other_cpu.c" +#include "_core_/smp/resched_curr_cpu.c" /* * Constants for the sched_mode argument of __schedule(). @@ -155,7 +155,7 @@ static void __resched_curr(struct rq *rq, int tif) } else { - resched_curr_other_cpu(cti, tif, cpu); + resched_curr_cpu(cti, tif, cpu); } } -- Gitee From f74a65abab47949f73c2b05a35a5eabbd1521dbf Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 17:09:54 +0800 Subject: [PATCH 14/17] xx --- .../_core_/smp/{resched_curr_target_cpu.c => resched_curr_cpu.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename kern/sched/_core_/smp/{resched_curr_target_cpu.c => resched_curr_cpu.c} (100%) diff --git a/kern/sched/_core_/smp/resched_curr_target_cpu.c b/kern/sched/_core_/smp/resched_curr_cpu.c similarity index 100% rename from kern/sched/_core_/smp/resched_curr_target_cpu.c rename to kern/sched/_core_/smp/resched_curr_cpu.c -- Gitee From e72e3c3510e4c2dcb4ca689837c47a1b0face667 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 17:11:22 +0800 Subject: [PATCH 15/17] xx --- arch/riscv/kernel/smp/boot.c | 2 ++ kern/sched/_core_/smp/resched_curr_cpu.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/riscv/kernel/smp/boot.c b/arch/riscv/kernel/smp/boot.c index cd0bc6b..ce85e7c 100644 --- a/arch/riscv/kernel/smp/boot.c +++ b/arch/riscv/kernel/smp/boot.c @@ -28,6 +28,8 @@ void smp_callin(void) notify_cpu_starting(curr_cpuid); + set_cpu_online(curr_cpuid, true); + local_irq_enable(); cpu_startup_entry(CPUHP_AP_ONLINE_IDLE); } diff --git a/kern/sched/_core_/smp/resched_curr_cpu.c b/kern/sched/_core_/smp/resched_curr_cpu.c index fae1341..4f694ee 100644 --- a/kern/sched/_core_/smp/resched_curr_cpu.c +++ b/kern/sched/_core_/smp/resched_curr_cpu.c @@ -12,7 +12,7 @@ static inline bool set_nr_if_polling(struct task_struct *p) return false; } -static void inline resched_curr_other_cpu(struct thread_info *cti, int tif, int cpu) +static void inline resched_curr_cpu(struct thread_info *cti, int tif, int cpu) { if (set_nr_and_not_polling(cti, tif)) { @@ -21,7 +21,7 @@ static void inline resched_curr_other_cpu(struct thread_info *cti, int tif, int } } #else -static void inline resched_curr_other_cpu(struct thread_info *cti, int tif, int cpu) +static void inline resched_curr_cpu(struct thread_info *cti, int tif, int cpu) { } #endif -- Gitee From a526108a5ae602d567fb2e3c0c9ff44b1a139774 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 17:28:00 +0800 Subject: [PATCH 16/17] xx --- kern/sched/_core_/init.c | 3 ++- kern/sched/core.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/kern/sched/_core_/init.c b/kern/sched/_core_/init.c index dc95f3e..9356405 100644 --- a/kern/sched/_core_/init.c +++ b/kern/sched/_core_/init.c @@ -13,10 +13,11 @@ #define for_each_class(class) \ for_class_range(class, __sched_class_highest(), __sched_class_lowest()) -static inline void init_rq(struct rq *rq) +static inline void init_rq(struct rq *rq, unsigned int cpu) { const struct sched_class *class; + rq->cpu = cpu; raw_spin_lock_init(&rq->__lock); INIT_LIST_HEAD(&rq->cfs_tasks); diff --git a/kern/sched/core.c b/kern/sched/core.c index aa88eb1..d0d7673 100644 --- a/kern/sched/core.c +++ b/kern/sched/core.c @@ -370,7 +370,7 @@ void __init sched_init(void) rq = cpu_rq(i); - init_rq(rq); + init_rq(rq, i); } set_load_weight(&init_task, false); -- Gitee From 643f5997be96a252c873a0c6fbcf642ad69f708d Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 23 Nov 2025 19:22:34 +0800 Subject: [PATCH 17/17] xx --- bsp/qemu-riscv-virt64/drivers/timer-ce.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bsp/qemu-riscv-virt64/drivers/timer-ce.c b/bsp/qemu-riscv-virt64/drivers/timer-ce.c index 7a3ee64..0dff0ab 100644 --- a/bsp/qemu-riscv-virt64/drivers/timer-ce.c +++ b/bsp/qemu-riscv-virt64/drivers/timer-ce.c @@ -37,6 +37,9 @@ static irqreturn_t riscv_timer_interrupt(int irq, void *dev_id) static int riscv_timer_starting_cpu(unsigned int cpu) { struct clock_event_device *ce = per_cpu_ptr(&riscv_clock_event, cpu); + + csr_clear(CSR_IE, SIP_STIP); + sbi_set_timer(get_cycles() + tick_cycles); clockevents_config_and_register(ce, CPUTIME_TIMER_FREQ, 100, 100000); enable_percpu_irq(RV_IRQ_TIMER, 0); @@ -52,9 +55,6 @@ static int riscv_timer_dying_cpu(unsigned int cpu) void timer_probe(void) { tick_cycles = CPUTIME_TIMER_FREQ / HZ; - csr_clear(CSR_IE, SIP_STIP); - - sbi_set_timer(get_cycles() + tick_cycles); request_percpu_irq(riscv_clock_event_irq, riscv_timer_interrupt, -- Gitee