* [RFC v2 0/2] riscv: Idle thread using Zawrs extension
@ 2024-06-21 9:32 Xu Lu
2024-06-21 9:32 ` [RFC v2 1/2] riscv: process: Introduce idle " Xu Lu
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Xu Lu @ 2024-06-21 9:32 UTC (permalink / raw)
To: linux-riscv, kvm-riscv, devicetree
Cc: paul.walmsley, palmer, aou, conor.dooley, anup, atishp, robh,
krzysztof.kozlowski+dt, conor+dt, christoph.muellner, heiko,
charlie, David.Laight, parri.andrea, Xu Lu
This is the second version of idle thread based on Zawrs extension. We
rebased our code on Andrew's patch series[1] which provides basic
support for Zawrs as well as optimization for spinlock.
This patch series introduces a new implementation of idle thread using
Zawrs extension.
The Zawrs[0] extension introduces two new instructions named WRS.STO and
WRS.NTO in RISC-V. When software registers a reservation set using LR
instruction, a subsequent WRS.STO or WRS.NTO instruction will cause the
hart to stall in a low-power state until a store happens to the
reservation set or an interrupt becomes pending. The difference between
these two instructions is that WRS.STO will terminate stall after an
implementation-defined timeout while WRS.NTO won't.
This patch series implements idle thread using WRS.NTO instruction.
Besides, we found there is no need to send a real IPI to wake up an idle
CPU. Instead, we write IPI information to the reservation set of an idle
CPU to wake it up and let it handle IPI quickly, without going through
tranditional interrupt handling routine.
[0] https://github.com/riscv/riscv-zawrs/blob/main/zawrs.adoc
[1] https://github.com/jones-drew/linux/commits/riscv/zawrs-v3
Xu Lu (2):
riscv: process: Introduce idle thread using Zawrs extension
riscv: Use Zawrs to accelerate IPI to idle cpu
arch/riscv/Kconfig | 10 +++
arch/riscv/include/asm/cpuidle.h | 11 +---
arch/riscv/include/asm/processor.h | 32 +++++++++
arch/riscv/include/asm/smp.h | 14 ++++
arch/riscv/kernel/cpu.c | 5 ++
arch/riscv/kernel/process.c | 102 ++++++++++++++++++++++++++++-
arch/riscv/kernel/smp.c | 39 +++++++----
7 files changed, 190 insertions(+), 23 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [RFC v2 1/2] riscv: process: Introduce idle thread using Zawrs extension
2024-06-21 9:32 [RFC v2 0/2] riscv: Idle thread using Zawrs extension Xu Lu
@ 2024-06-21 9:32 ` Xu Lu
2024-06-21 9:32 ` [RFC v2 2/2] riscv: Use Zawrs to accelerate IPI to idle cpu Xu Lu
2024-06-21 11:16 ` [RFC v2 0/2] riscv: Idle thread using Zawrs extension Andrea Parri
2 siblings, 0 replies; 6+ messages in thread
From: Xu Lu @ 2024-06-21 9:32 UTC (permalink / raw)
To: linux-riscv, kvm-riscv, devicetree
Cc: paul.walmsley, palmer, aou, conor.dooley, anup, atishp, robh,
krzysztof.kozlowski+dt, conor+dt, christoph.muellner, heiko,
charlie, David.Laight, parri.andrea, Xu Lu, Hangjing Li,
Liang Deng, Wen Chai
The Zawrs extension introduces a new instruction WRS.NTO, which will
register a reservation set and causes the hart to temporarily stall
execution in a low-power state until a store occurs to the reservation
set or an interrupt is observed.
This commit implements new version of idle thread for RISC-V via Zawrs
extension.
Signed-off-by: Xu Lu <luxu.kernel@bytedance.com>
Reviewed-by: Hangjing Li <lihangjing@bytedance.com>
Reviewed-by: Liang Deng <dengliang.1214@bytedance.com>
Reviewed-by: Wen Chai <chaiwen.cc@bytedance.com>
---
arch/riscv/Kconfig | 10 ++++++++
arch/riscv/include/asm/cpuidle.h | 11 +-------
arch/riscv/include/asm/processor.h | 18 +++++++++++++
arch/riscv/kernel/cpu.c | 5 ++++
arch/riscv/kernel/process.c | 41 +++++++++++++++++++++++++++++-
5 files changed, 74 insertions(+), 11 deletions(-)
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 34bbe6b70546..898e61bbb328 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -19,6 +19,7 @@ config RISCV
select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE
select ARCH_HAS_BINFMT_FLAT
+ select ARCH_HAS_CPU_FINALIZE_INIT
select ARCH_HAS_CURRENT_STACK_POINTER
select ARCH_HAS_DEBUG_VIRTUAL if MMU
select ARCH_HAS_DEBUG_VM_PGTABLE
@@ -1081,6 +1082,15 @@ endmenu # "Power management options"
menu "CPU Power Management"
+config RISCV_ZAWRS_IDLE
+ bool "Idle thread using ZAWRS extensions"
+ depends on RISCV_ISA_ZAWRS
+ default y
+ help
+ Adds support to implement idle thread using ZAWRS extension.
+
+ If you don't know what to do here, say Y.
+
source "drivers/cpuidle/Kconfig"
source "drivers/cpufreq/Kconfig"
diff --git a/arch/riscv/include/asm/cpuidle.h b/arch/riscv/include/asm/cpuidle.h
index 71fdc607d4bc..94c9ecb46571 100644
--- a/arch/riscv/include/asm/cpuidle.h
+++ b/arch/riscv/include/asm/cpuidle.h
@@ -10,15 +10,6 @@
#include <asm/barrier.h>
#include <asm/processor.h>
-static inline void cpu_do_idle(void)
-{
- /*
- * Add mb() here to ensure that all
- * IO/MEM accesses are completed prior
- * to entering WFI.
- */
- mb();
- wait_for_interrupt();
-}
+void cpu_do_idle(void);
#endif
diff --git a/arch/riscv/include/asm/processor.h b/arch/riscv/include/asm/processor.h
index 0faf5f161f1e..5ad572645bee 100644
--- a/arch/riscv/include/asm/processor.h
+++ b/arch/riscv/include/asm/processor.h
@@ -12,6 +12,7 @@
#include <vdso/processor.h>
+#include <asm/insn-def.h>
#include <asm/ptrace.h>
/*
@@ -157,6 +158,21 @@ static inline void wait_for_interrupt(void)
__asm__ __volatile__ ("wfi");
}
+static inline void wrs_nto(unsigned long *addr)
+{
+ int val;
+
+ __asm__ __volatile__(
+#ifdef CONFIG_64BIT
+ "lr.d %[p], %[v]\n\t"
+#else
+ "lr.w %[p], %[v]\n\t"
+#endif
+ ZAWRS_WRS_NTO "\n\t"
+ : [p] "=&r" (val), [v] "+A" (*addr)
+ : : "memory");
+}
+
extern phys_addr_t dma32_phys_limit;
struct device_node;
@@ -183,6 +199,8 @@ extern int set_unalign_ctl(struct task_struct *tsk, unsigned int val);
#define GET_UNALIGN_CTL(tsk, addr) get_unalign_ctl((tsk), (addr))
#define SET_UNALIGN_CTL(tsk, val) set_unalign_ctl((tsk), (val))
+extern void select_idle_routine(void);
+
#endif /* __ASSEMBLY__ */
#endif /* _ASM_RISCV_PROCESSOR_H */
diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c
index d11d6320fb0d..69cebd41f5f3 100644
--- a/arch/riscv/kernel/cpu.c
+++ b/arch/riscv/kernel/cpu.c
@@ -22,6 +22,11 @@ bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
return phys_id == cpuid_to_hartid_map(cpu);
}
+void __init arch_cpu_finalize_init(void)
+{
+ select_idle_routine();
+}
+
/*
* Returns the hart ID of the given device tree node, or -ENODEV if the node
* isn't an enabled and valid RISC-V hart node.
diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c
index 92922dbd5b5c..9f0f7b888bc1 100644
--- a/arch/riscv/kernel/process.c
+++ b/arch/riscv/kernel/process.c
@@ -15,6 +15,7 @@
#include <linux/tick.h>
#include <linux/ptrace.h>
#include <linux/uaccess.h>
+#include <linux/static_call.h>
#include <asm/unistd.h>
#include <asm/processor.h>
@@ -37,11 +38,49 @@ EXPORT_SYMBOL(__stack_chk_guard);
extern asmlinkage void ret_from_fork(void);
-void arch_cpu_idle(void)
+static __cpuidle void default_idle(void)
+{
+ /*
+ * Add mb() here to ensure that all
+ * IO/MEM accesses are completed prior
+ * to entering WFI.
+ */
+ mb();
+ wait_for_interrupt();
+}
+
+static __cpuidle void wrs_idle(void)
+{
+ /*
+ * Add mb() here to ensure that all
+ * IO/MEM accesses are completed prior
+ * to entering WRS.NTO.
+ */
+ mb();
+ wrs_nto(¤t_thread_info()->flags);
+}
+
+DEFINE_STATIC_CALL_NULL(riscv_idle, default_idle);
+
+void __cpuidle cpu_do_idle(void)
+{
+ static_call(riscv_idle)();
+}
+
+void __cpuidle arch_cpu_idle(void)
{
cpu_do_idle();
}
+void __init select_idle_routine(void)
+{
+ if (IS_ENABLED(CONFIG_RISCV_ZAWRS_IDLE) &&
+ riscv_has_extension_likely(RISCV_ISA_EXT_ZAWRS))
+ static_call_update(riscv_idle, wrs_idle);
+ else
+ static_call_update(riscv_idle, default_idle);
+}
+
int set_unalign_ctl(struct task_struct *tsk, unsigned int val)
{
if (!unaligned_ctl_available())
--
2.20.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [RFC v2 2/2] riscv: Use Zawrs to accelerate IPI to idle cpu
2024-06-21 9:32 [RFC v2 0/2] riscv: Idle thread using Zawrs extension Xu Lu
2024-06-21 9:32 ` [RFC v2 1/2] riscv: process: Introduce idle " Xu Lu
@ 2024-06-21 9:32 ` Xu Lu
2024-06-21 11:16 ` [RFC v2 0/2] riscv: Idle thread using Zawrs extension Andrea Parri
2 siblings, 0 replies; 6+ messages in thread
From: Xu Lu @ 2024-06-21 9:32 UTC (permalink / raw)
To: linux-riscv, kvm-riscv, devicetree
Cc: paul.walmsley, palmer, aou, conor.dooley, anup, atishp, robh,
krzysztof.kozlowski+dt, conor+dt, christoph.muellner, heiko,
charlie, David.Laight, parri.andrea, Xu Lu
When sending IPI to a cpu which has entered idle state using Zawrs
extension, there is no need to send a physical software interrupt.
Instead, we can write the IPI information to the address reserved by
target cpu, which will wake it from WRS.NTO. Then the target cpu can
handle the IPI directly without falling into traditional interrupt
handling routine.
Signed-off-by: Xu Lu <luxu.kernel@bytedance.com>
---
arch/riscv/include/asm/processor.h | 14 +++++++
arch/riscv/include/asm/smp.h | 14 +++++++
arch/riscv/kernel/process.c | 65 +++++++++++++++++++++++++++++-
arch/riscv/kernel/smp.c | 39 ++++++++++++------
4 files changed, 118 insertions(+), 14 deletions(-)
diff --git a/arch/riscv/include/asm/processor.h b/arch/riscv/include/asm/processor.h
index 5ad572645bee..45e060831313 100644
--- a/arch/riscv/include/asm/processor.h
+++ b/arch/riscv/include/asm/processor.h
@@ -173,6 +173,20 @@ static inline void wrs_nto(unsigned long *addr)
: : "memory");
}
+static inline void wrs_nto_if(int *addr, int val)
+{
+ int prev;
+
+ __asm__ __volatile__(
+ "lr.w %[p], %[a]\n\t"
+ "bne %[p], %[v], 1f\n\t"
+ ZAWRS_WRS_NTO "\n\t"
+ "1:\n\t"
+ : [p] "=&r" (prev), [a] "+A" (*addr)
+ : [v] "r" (val)
+ : "memory");
+}
+
extern phys_addr_t dma32_phys_limit;
struct device_node;
diff --git a/arch/riscv/include/asm/smp.h b/arch/riscv/include/asm/smp.h
index 0d555847cde6..2f27fd743092 100644
--- a/arch/riscv/include/asm/smp.h
+++ b/arch/riscv/include/asm/smp.h
@@ -19,6 +19,20 @@ extern unsigned long boot_cpu_hartid;
#include <linux/jump_label.h>
+enum ipi_message_type {
+ IPI_RESCHEDULE,
+ IPI_CALL_FUNC,
+ IPI_CPU_STOP,
+ IPI_CPU_CRASH_STOP,
+ IPI_IRQ_WORK,
+ IPI_TIMER,
+ IPI_MAX
+};
+
+int ipi_virq_base_get(void);
+
+irqreturn_t handle_IPI(int irq, void *data);
+
/*
* Mapping between linux logical cpu index and hartid.
*/
diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c
index 9f0f7b888bc1..7d6bf780d334 100644
--- a/arch/riscv/kernel/process.c
+++ b/arch/riscv/kernel/process.c
@@ -16,6 +16,7 @@
#include <linux/ptrace.h>
#include <linux/uaccess.h>
#include <linux/static_call.h>
+#include <linux/hardirq.h>
#include <asm/unistd.h>
#include <asm/processor.h>
@@ -27,6 +28,7 @@
#include <asm/cpuidle.h>
#include <asm/vector.h>
#include <asm/cpufeature.h>
+#include <asm/smp.h>
register unsigned long gp_in_global __asm__("gp");
@@ -38,6 +40,8 @@ EXPORT_SYMBOL(__stack_chk_guard);
extern asmlinkage void ret_from_fork(void);
+DEFINE_PER_CPU(atomic_t, idle_ipi_mask);
+
static __cpuidle void default_idle(void)
{
/*
@@ -49,6 +53,16 @@ static __cpuidle void default_idle(void)
wait_for_interrupt();
}
+static __cpuidle void default_idle_enter(void)
+{
+ /* Do nothing */
+}
+
+static __cpuidle void default_idle_exit(void)
+{
+ /* Do nothing */
+}
+
static __cpuidle void wrs_idle(void)
{
/*
@@ -57,10 +71,42 @@ static __cpuidle void wrs_idle(void)
* to entering WRS.NTO.
*/
mb();
+#ifdef CONFIG_SMP
+ wrs_nto_if(&this_cpu_ptr(&idle_ipi_mask)->counter, BIT(IPI_MAX));
+#else
wrs_nto(¤t_thread_info()->flags);
+#endif
+}
+
+static __cpuidle void wrs_idle_enter(void)
+{
+#ifdef CONFIG_SMP
+ atomic_set(this_cpu_ptr(&idle_ipi_mask), BIT(IPI_MAX));
+#endif
+}
+
+static __cpuidle void wrs_idle_exit(void)
+{
+#ifdef CONFIG_SMP
+ int pending;
+ unsigned long flags;
+ enum ipi_message_type ipi;
+
+ local_irq_save(flags);
+ pending = atomic_xchg_relaxed(this_cpu_ptr(&idle_ipi_mask), 0);
+ for (ipi = IPI_RESCHEDULE; ipi < IPI_MAX; ipi++)
+ if (pending & BIT(ipi)) {
+ irq_enter();
+ handle_IPI(ipi_virq_base_get() + ipi, NULL);
+ irq_exit();
+ }
+ local_irq_restore(flags);
+#endif
}
DEFINE_STATIC_CALL_NULL(riscv_idle, default_idle);
+DEFINE_STATIC_CALL_NULL(riscv_idle_enter, default_idle_enter);
+DEFINE_STATIC_CALL_NULL(riscv_idle_exit, default_idle_exit);
void __cpuidle cpu_do_idle(void)
{
@@ -72,13 +118,28 @@ void __cpuidle arch_cpu_idle(void)
cpu_do_idle();
}
+void __cpuidle arch_cpu_idle_enter(void)
+{
+ static_call(riscv_idle_enter)();
+}
+
+void __cpuidle arch_cpu_idle_exit(void)
+{
+ static_call(riscv_idle_exit)();
+}
+
void __init select_idle_routine(void)
{
if (IS_ENABLED(CONFIG_RISCV_ZAWRS_IDLE) &&
- riscv_has_extension_likely(RISCV_ISA_EXT_ZAWRS))
+ riscv_has_extension_likely(RISCV_ISA_EXT_ZAWRS)) {
static_call_update(riscv_idle, wrs_idle);
- else
+ static_call_update(riscv_idle_enter, wrs_idle_enter);
+ static_call_update(riscv_idle_exit, wrs_idle_exit);
+ } else {
static_call_update(riscv_idle, default_idle);
+ static_call_update(riscv_idle_enter, default_idle_enter);
+ static_call_update(riscv_idle_exit, default_idle_exit);
+ }
}
int set_unalign_ctl(struct task_struct *tsk, unsigned int val)
diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c
index 45dd4035416e..b5416ee41967 100644
--- a/arch/riscv/kernel/smp.c
+++ b/arch/riscv/kernel/smp.c
@@ -26,16 +26,6 @@
#include <asm/cacheflush.h>
#include <asm/cpu_ops.h>
-enum ipi_message_type {
- IPI_RESCHEDULE,
- IPI_CALL_FUNC,
- IPI_CPU_STOP,
- IPI_CPU_CRASH_STOP,
- IPI_IRQ_WORK,
- IPI_TIMER,
- IPI_MAX
-};
-
unsigned long __cpuid_to_hartid_map[NR_CPUS] __ro_after_init = {
[0 ... NR_CPUS-1] = INVALID_HARTID
};
@@ -94,14 +84,34 @@ static inline void ipi_cpu_crash_stop(unsigned int cpu, struct pt_regs *regs)
}
#endif
+#if defined(CONFIG_RISCV_ZAWRS_IDLE) && defined(CONFIG_SMP)
+DECLARE_PER_CPU(atomic_t, idle_ipi_mask);
+#endif
+
static void send_ipi_mask(const struct cpumask *mask, enum ipi_message_type op)
{
+#if defined(CONFIG_RISCV_ZAWRS_IDLE) && defined(CONFIG_SMP)
+ int cpu, val;
+
+ for_each_cpu(cpu, mask) {
+ val = atomic_fetch_or_relaxed(BIT(op), per_cpu_ptr(&idle_ipi_mask, cpu));
+ if (likely(!(val & BIT(IPI_MAX))))
+ __ipi_send_mask(ipi_desc[op], cpumask_of(cpu));
+ }
+#else
__ipi_send_mask(ipi_desc[op], mask);
+#endif
}
static void send_ipi_single(int cpu, enum ipi_message_type op)
{
- __ipi_send_mask(ipi_desc[op], cpumask_of(cpu));
+#if defined(CONFIG_RISCV_ZAWRS_IDLE) && defined(CONFIG_SMP)
+ int val;
+
+ val = atomic_fetch_or_relaxed(BIT(op), per_cpu_ptr(&idle_ipi_mask, cpu));
+ if (likely(!(val & BIT(IPI_MAX))))
+#endif
+ __ipi_send_mask(ipi_desc[op], cpumask_of(cpu));
}
#ifdef CONFIG_IRQ_WORK
@@ -111,7 +121,7 @@ void arch_irq_work_raise(void)
}
#endif
-static irqreturn_t handle_IPI(int irq, void *data)
+irqreturn_t handle_IPI(int irq, void *data)
{
int ipi = irq - ipi_virq_base;
@@ -332,3 +342,8 @@ void arch_smp_send_reschedule(int cpu)
send_ipi_single(cpu, IPI_RESCHEDULE);
}
EXPORT_SYMBOL_GPL(arch_smp_send_reschedule);
+
+int ipi_virq_base_get(void)
+{
+ return ipi_virq_base;
+}
--
2.20.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFC v2 0/2] riscv: Idle thread using Zawrs extension
2024-06-21 9:32 [RFC v2 0/2] riscv: Idle thread using Zawrs extension Xu Lu
2024-06-21 9:32 ` [RFC v2 1/2] riscv: process: Introduce idle " Xu Lu
2024-06-21 9:32 ` [RFC v2 2/2] riscv: Use Zawrs to accelerate IPI to idle cpu Xu Lu
@ 2024-06-21 11:16 ` Andrea Parri
2024-06-21 11:24 ` Andrea Parri
2024-06-21 12:09 ` [External] " Xu Lu
2 siblings, 2 replies; 6+ messages in thread
From: Andrea Parri @ 2024-06-21 11:16 UTC (permalink / raw)
To: Xu Lu
Cc: linux-riscv, kvm-riscv, devicetree, paul.walmsley, palmer, aou,
conor.dooley, anup, atishp, robh, krzysztof.kozlowski+dt,
conor+dt, christoph.muellner, heiko, charlie, David.Laight
> This is the second version of idle thread based on Zawrs extension. We
> rebased our code on Andrew's patch series[1] which provides basic
> support for Zawrs as well as optimization for spinlock.
There's some feedback on Andrew's v2 [1] which seems to equally apply
to the later, mentioned series/submission, and hence to the series in
question (although only indirectly admittedly).
As an additional comment, please do add linux-kernel@vger.kernel.org
(the LKML) to your Cc: list on patch submission (again, this applies
to both Andrew's and the present submissions).
Andrea
[1] https://lore.kernel.org/linux-riscv/ZiWCP6f6zZ3dKXfN@andrea/
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC v2 0/2] riscv: Idle thread using Zawrs extension
2024-06-21 11:16 ` [RFC v2 0/2] riscv: Idle thread using Zawrs extension Andrea Parri
@ 2024-06-21 11:24 ` Andrea Parri
2024-06-21 12:09 ` [External] " Xu Lu
1 sibling, 0 replies; 6+ messages in thread
From: Andrea Parri @ 2024-06-21 11:24 UTC (permalink / raw)
To: Xu Lu
Cc: linux-riscv, kvm-riscv, devicetree, paul.walmsley, palmer, aou,
conor.dooley, anup, atishp, robh, krzysztof.kozlowski+dt,
conor+dt, christoph.muellner, heiko, charlie, David.Laight,
ajones
On Fri, Jun 21, 2024 at 01:16:50PM +0200, Andrea Parri wrote:
> > This is the second version of idle thread based on Zawrs extension. We
> > rebased our code on Andrew's patch series[1] which provides basic
> > support for Zawrs as well as optimization for spinlock.
>
> There's some feedback on Andrew's v2 [1] which seems to equally apply
> to the later, mentioned series/submission, and hence to the series in
> question (although only indirectly admittedly).
>
> As an additional comment, please do add linux-kernel@vger.kernel.org
> (the LKML) to your Cc: list on patch submission (again, this applies
> to both Andrew's and the present submissions).
Ah, yes, and possibly people mentioned in the changelog! :-) + Andrew
Andrea
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [External] Re: [RFC v2 0/2] riscv: Idle thread using Zawrs extension
2024-06-21 11:16 ` [RFC v2 0/2] riscv: Idle thread using Zawrs extension Andrea Parri
2024-06-21 11:24 ` Andrea Parri
@ 2024-06-21 12:09 ` Xu Lu
1 sibling, 0 replies; 6+ messages in thread
From: Xu Lu @ 2024-06-21 12:09 UTC (permalink / raw)
To: Andrea Parri
Cc: linux-riscv, kvm-riscv, devicetree, paul.walmsley, palmer, aou,
conor.dooley, anup, atishp, robh, krzysztof.kozlowski+dt,
conor+dt, christoph.muellner, heiko, charlie, David.Laight
On Fri, Jun 21, 2024 at 7:17 PM Andrea Parri <parri.andrea@gmail.com> wrote:
>
> > This is the second version of idle thread based on Zawrs extension. We
> > rebased our code on Andrew's patch series[1] which provides basic
> > support for Zawrs as well as optimization for spinlock.
>
> There's some feedback on Andrew's v2 [1] which seems to equally apply
> to the later, mentioned series/submission, and hence to the series in
> question (although only indirectly admittedly).
>
> As an additional comment, please do add linux-kernel@vger.kernel.org
> (the LKML) to your Cc: list on patch submission (again, this applies
> to both Andrew's and the present submissions).
>
> Andrea
>
> [1] https://lore.kernel.org/linux-riscv/ZiWCP6f6zZ3dKXfN@andrea/
Hi Andrea,
Thanks a lot for your reminder. I will check the feedback and add this
email in the next patch series!
Xu Lu
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-06-21 12:09 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-21 9:32 [RFC v2 0/2] riscv: Idle thread using Zawrs extension Xu Lu
2024-06-21 9:32 ` [RFC v2 1/2] riscv: process: Introduce idle " Xu Lu
2024-06-21 9:32 ` [RFC v2 2/2] riscv: Use Zawrs to accelerate IPI to idle cpu Xu Lu
2024-06-21 11:16 ` [RFC v2 0/2] riscv: Idle thread using Zawrs extension Andrea Parri
2024-06-21 11:24 ` Andrea Parri
2024-06-21 12:09 ` [External] " Xu Lu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).