--- kernel/ipipe/core.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) Index: linux-2.6.17.13/kernel/ipipe/core.c =================================================================== --- linux-2.6.17.13.orig/kernel/ipipe/core.c +++ linux-2.6.17.13/kernel/ipipe/core.c @@ -134,16 +134,8 @@ void __ipipe_stall_root(void) unsigned long flags; ipipe_get_cpu(flags); /* Care for migration. */ - set_bit(IPIPE_STALL_FLAG, &ipipe_root_domain->cpudata[cpuid].status); - -#ifdef CONFIG_SMP - if (!__ipipe_pipeline_head_p(ipipe_root_domain)) - ipipe_put_cpu(flags); -#else /* CONFIG_SMP */ - if (__ipipe_pipeline_head_p(ipipe_root_domain)) - local_irq_disable_hw(); -#endif /* CONFIG_SMP */ + ipipe_put_cpu(flags); } void __ipipe_cleanup_domain(struct ipipe_domain *ipd) @@ -166,6 +158,7 @@ void __ipipe_unstall_root(void) { ipipe_declare_cpuid; +#ifdef CONFIG_SMP local_irq_disable_hw(); ipipe_load_cpuid(); @@ -176,6 +169,15 @@ void __ipipe_unstall_root(void) __ipipe_sync_pipeline(IPIPE_IRQMASK_ANY); local_irq_enable_hw(); +#else /* !CONFIG_SMP */ + __clear_bit(IPIPE_STALL_FLAG, &ipipe_root_domain->cpudata[cpuid].status); + + if (unlikely(ipipe_root_domain->cpudata[cpuid].irq_pending_hi != 0)) { + local_irq_disable_hw(); + __ipipe_sync_pipeline(IPIPE_IRQMASK_ANY); + local_irq_enable_hw(); + } +#endif /* CONFIG_SMP */ } unsigned long __ipipe_test_root(void)