powerpc CONFIG_PREEMPT fixes
cover powerpc CONFIG_PREEMPT fixes
Hello!
This series provides fixes for a couple of CONFIG_PREEMPT problems on Power:
1. The hpte_need_flush() function accesses per-CPU variables without
protection.
2. The rtas_event_scan() function needs to use raw_smp_processor_id()
to get a starting point to avoid debugging splats.
There are probably a few more where these came from. ;-)
Thanx, Paul
PATCH 1/2 powerpc: protect per-CPU access with preempt_disable
The hpte_need_flush() function accesses the ppc64_tlb_batch per-CPU variable with preemption enabled, a bug that this patch fixes. Perhaps crudely.
--- arch/powerpc/include/asm/pgtable-ppc64.h | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
arch/powerpc/include/asm/pgtable-ppc64.h +4 -1
@@ -228,8 +228,11 @@ static inline unsigned long pte_update(struct mm_struct *mm,assert_pte_locked (mm, addr);#ifdef CONFIG_PPC_STD_MMU_64 -if (old & _PAGE_HASHPTE) +if (old & _PAGE_HASHPTE) { +preempt_disable ();hpte_need_flush (mm, addr, ptep, old, huge); +preempt_enable (); + }#endif return old;
Signature · 1 line
1.7.3.2
PATCH 2/2 powerpc: mask smp_processor_id() false positive
In reply to Paul E. McKenneyThe rtas_event_scan() function uses smp_processor_id() to select a starting point in cpu_online_mask, and does so under the protection of get_online_cpus(). This might not select the current processor in any case, so switch to raw_smp_processor_id().
--- arch/powerpc/kernel/rtasd.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
arch/powerpc/kernel/rtasd.c +2 -1
@@ -412,7 +412,8 @@ static void rtas_event_scan(struct work_struct *w)get_online_cpus (); - cpu =cpumask_next (smp_processor_id (), cpu_online_mask); +/* raw_ OK because just using CPU as starting point. */ + cpu =cpumask_next (raw_smp_processor_id (), cpu_online_mask);if (cpu >= nr_cpu_ids) { cpu =cpumask_first (cpu_online_mask);
Signature · 1 line
1.7.3.2