Hi, while disassembling that bug in start_kernel, I noticed that ipipe_lock_cpu(flags) is used in a suboptimal way in some ipipe_XXX_head() services, i.e. when the flags are actually of no interest. The compiler still generates the unneeded pushf/pop <reg>, and this in a hot-path.
Attached patch should perform better. Lightly tested, but QEMU SMP still works here. Jan
---
include/linux/ipipe.h | 8 ++++----
kernel/ipipe/core.c | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
Index: linux-2.6.19/include/linux/ipipe.h
===================================================================
--- linux-2.6.19.orig/include/linux/ipipe.h
+++ linux-2.6.19/include/linux/ipipe.h
@@ -471,18 +471,18 @@ static inline void ipipe_restore_pipelin
static inline void ipipe_stall_pipeline_head(void)
{
ipipe_declare_cpuid;
- unsigned long flags;
- ipipe_lock_cpu(flags);
+ local_irq_disable_hw();
+ ipipe_load_cpuid();
__set_bit(IPIPE_STALL_FLAG,
&__ipipe_pipeline_head()->cpudata[cpuid].status);
}
static inline unsigned long ipipe_test_and_stall_pipeline_head(void)
{
- unsigned long flags;
ipipe_declare_cpuid;
- ipipe_lock_cpu(flags);
+ local_irq_disable_hw();
+ ipipe_load_cpuid();
return __test_and_set_bit(IPIPE_STALL_FLAG,
&__ipipe_pipeline_head()->cpudata[cpuid].status);
}
Index: linux-2.6.19/kernel/ipipe/core.c
===================================================================
--- linux-2.6.19.orig/kernel/ipipe/core.c
+++ linux-2.6.19/kernel/ipipe/core.c
@@ -303,10 +303,10 @@ void fastcall ipipe_restore_pipeline_fro
void ipipe_unstall_pipeline_head(void)
{
struct ipipe_domain *head;
- unsigned long flags;
ipipe_declare_cpuid;
- ipipe_lock_cpu(flags);
+ local_irq_disable_hw();
+ ipipe_load_cpuid();
head = __ipipe_pipeline_head();
__clear_bit(IPIPE_STALL_FLAG, &head->cpudata[cpuid].status);
@@ -323,9 +323,9 @@ void ipipe_unstall_pipeline_head(void)
void fastcall __ipipe_restore_pipeline_head(struct ipipe_domain *head,
unsigned long x)
{
ipipe_declare_cpuid;
- unsigned long flags;
- ipipe_lock_cpu(flags);
+ local_irq_disable_hw();
+ ipipe_load_cpuid();
if (x) {
#ifdef CONFIG_DEBUG_KERNEL
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Adeos-main mailing list [email protected] https://mail.gna.org/listinfo/adeos-main
