diff -rup -x CVS 2.6.16-rt17/arch/powerpc/mm/hash_native_64.c rt-powerpc/arch/powerpc/mm/hash_native_64.c --- 2.6.16-rt17/arch/powerpc/mm/hash_native_64.c 2006-03-20 14:53:29.000000000 +0900 +++ rt-powerpc/arch/powerpc/mm/hash_native_64.c 2006-07-12 14:38:24.000000000 +0900 @@ -35,7 +35,10 @@ #define HPTE_LOCK_BIT 3 -static DEFINE_SPINLOCK(native_tlbie_lock); +/* + * to avoid "BUG: scheduling while atomic at native_flush_hash_range. + */ +static DEFINE_RAW_SPINLOCK(native_tlbie_lock); static inline void __tlbie(unsigned long va, unsigned int psize) { diff -rup -x CVS 2.6.16-rt17/arch/powerpc/mm/tlb_64.c rt-powerpc/arch/powerpc/mm/tlb_64.c --- 2.6.16-rt17/arch/powerpc/mm/tlb_64.c 2006-04-26 18:24:28.000000000 +0900 +++ rt-powerpc/arch/powerpc/mm/tlb_64.c 2006-07-12 13:47:32.000000000 +0900 @@ -95,9 +95,15 @@ static void pte_free_submit(struct pte_f void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf) { +#ifndef CONFIG_PREEMPT_RT /* This is safe since tlb_gather_mmu has disabled preemption */ cpumask_t local_cpumask = cpumask_of_cpu(smp_processor_id()); struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur); +#else + cpumask_t local_cpumask = cpumask_of_cpu(raw_smp_processor_id()); + struct pte_freelist_batch **batchp = &get_cpu_var(pte_freelist_cur); + put_cpu_var(pte_freelist_cur); +#endif /* !CONFIG_PREEMPT_RT */ if (atomic_read(&tlb->mm->mm_users) < 2 || cpus_equal(tlb->mm->cpu_vm_mask, local_cpumask)) { diff -rup -x CVS 2.6.16-rt17/arch/powerpc/platforms/cell/pervasive.c rt-powerpc/arch/powerpc/platforms/cell/pervasive.c --- 2.6.16-rt17/arch/powerpc/platforms/cell/pervasive.c 2006-03-20 14:53:29.000000000 +0900 +++ rt-powerpc/arch/powerpc/platforms/cell/pervasive.c 2006-07-12 13:48:09.000000000 +0900 @@ -136,8 +136,8 @@ static void cbe_idle(void) */ ppc64_runlatch_on(); - preempt_enable_no_resched(); - schedule(); + __preempt_enable_no_resched(); + __schedule(); preempt_disable(); } } diff -rup -x CVS 2.6.16-rt17/arch/powerpc/platforms/powermac/low_i2c.c rt-powerpc/arch/powerpc/platforms/powermac/low_i2c.c --- 2.6.16-rt17/arch/powerpc/platforms/powermac/low_i2c.c 2006-03-20 14:53:29.000000000 +0900 +++ rt-powerpc/arch/powerpc/platforms/powermac/low_i2c.c 2006-07-12 13:49:09.000000000 +0900 @@ -85,7 +85,7 @@ struct pmac_i2c_bus void *hostdata; int channel; /* some hosts have multiple */ int mode; /* current mode */ - struct semaphore sem; + struct compat_semaphore sem; int opened; int polled; /* open mode */ struct platform_device *platform_dev; @@ -105,7 +105,7 @@ static LIST_HEAD(pmac_i2c_busses); struct pmac_i2c_host_kw { - struct semaphore mutex; /* Access mutex for use by + struct compat_semaphore mutex; /* Access mutex for use by * i2c-keywest */ void __iomem *base; /* register base address */ int bsteps; /* register stepping */ @@ -119,6 +119,9 @@ struct pmac_i2c_host_kw int result; struct completion complete; spinlock_t lock; + /* "BUG: scheduling while at atomic" at del_timer() called + * from kw_i2c_irq() if raw_spinlock_t. + */ struct timer_list timeout_timer; }; diff -rup -x CVS 2.6.16-rt17/arch/powerpc/sysdev/mpic.c rt-powerpc/arch/powerpc/sysdev/mpic.c --- 2.6.16-rt17/arch/powerpc/sysdev/mpic.c 2006-03-20 14:53:29.000000000 +0900 +++ rt-powerpc/arch/powerpc/sysdev/mpic.c 2006-07-11 16:19:06.000000000 +0900 @@ -45,7 +45,7 @@ static struct mpic *mpics; static struct mpic *mpic_primary; -static DEFINE_SPINLOCK(mpic_lock); +static DEFINE_RAW_SPINLOCK(mpic_lock); #ifdef CONFIG_PPC32 /* XXX for now */ #ifdef CONFIG_IRQ_ALL_CPUS @@ -1009,13 +1009,13 @@ void mpic_request_ipis(void) printk("requesting IPIs ... \n"); /* IPIs are marked SA_INTERRUPT as they must run with irqs disabled */ - request_irq(mpic->ipi_offset+0, mpic_ipi_action, SA_INTERRUPT, + request_irq(mpic->ipi_offset+0, mpic_ipi_action, SA_INTERRUPT | SA_NODELAY, "IPI0 (call function)", mpic); - request_irq(mpic->ipi_offset+1, mpic_ipi_action, SA_INTERRUPT, + request_irq(mpic->ipi_offset+1, mpic_ipi_action, SA_INTERRUPT | SA_NODELAY, "IPI1 (reschedule)", mpic); - request_irq(mpic->ipi_offset+2, mpic_ipi_action, SA_INTERRUPT, + request_irq(mpic->ipi_offset+2, mpic_ipi_action, SA_INTERRUPT | SA_NODELAY, "IPI2 (unused)", mpic); - request_irq(mpic->ipi_offset+3, mpic_ipi_action, SA_INTERRUPT, + request_irq(mpic->ipi_offset+3, mpic_ipi_action, SA_INTERRUPT | SA_NODELAY, "IPI3 (debugger break)", mpic); printk("IPIs requested... \n"); diff -rup -x CVS 2.6.16-rt17/drivers/ide/ide-io.c rt-powerpc/drivers/ide/ide-io.c --- 2.6.16-rt17/drivers/ide/ide-io.c 2006-04-26 18:24:28.000000000 +0900 +++ rt-powerpc/drivers/ide/ide-io.c 2006-07-12 13:50:47.000000000 +0900 @@ -1560,8 +1560,10 @@ irqreturn_t ide_intr (int irq, void *dev del_timer(&hwgroup->timer); spin_unlock(&ide_lock); +#if !defined(CONFIG_PREEMPT_HARDIRQS) || !defined(CONFIG_PPC_PMAC64) if (drive->unmask) local_irq_enable_nort(); +#endif /* !(CONFIG_PREEMPT_HARDIRQS && CONFIG_PPC_PMAC64) */ /* service this interrupt, may set handler for next interrupt */ startstop = handler(drive); spin_lock_irq(&ide_lock); diff -rup -x CVS 2.6.16-rt17/drivers/ide/ide-probe.c rt-powerpc/drivers/ide/ide-probe.c --- 2.6.16-rt17/drivers/ide/ide-probe.c 2006-04-26 18:24:28.000000000 +0900 +++ rt-powerpc/drivers/ide/ide-probe.c 2006-07-12 14:07:23.000000000 +0900 @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -1088,6 +1089,10 @@ static int init_irq (ide_hwif_t *hwif) sa = SA_SHIRQ; #endif /* __mc68000__ || CONFIG_APUS */ +#if defined(CONFIG_PREEMPT_HARDIRQS) && defined(CONFIG_PPC_PMAC64) + sa |= SA_NODELAY | SA_INTERRUPT; +#endif /* (CONFIG_PREEMPT_HARDIRQS && CONFIG_PPC_PMAC64) */ + if (IDE_CHIPSET_IS_PCI(hwif->chipset)) { sa = SA_SHIRQ; #ifndef CONFIG_IDEPCI_SHARE_IRQ diff -rup -x CVS 2.6.16-rt17/drivers/net/sungem.c rt-powerpc/drivers/net/sungem.c --- 2.6.16-rt17/drivers/net/sungem.c 2006-03-20 14:53:29.000000000 +0900 +++ rt-powerpc/drivers/net/sungem.c 2006-07-11 17:07:43.000000000 +0900 @@ -1036,10 +1036,8 @@ static int gem_start_xmit(struct sk_buff (csum_stuff_off << 21)); } - local_irq_save(flags); - if (!spin_trylock(&gp->tx_lock)) { + if (!spin_trylock_irqsave(&gp->tx_lock, flags)) { /* Tell upper layer to requeue */ - local_irq_restore(flags); return NETDEV_TX_LOCKED; } /* We raced with gem_do_stop() */ diff -rup -x CVS 2.6.16-rt17/include/asm-powerpc/mpic.h rt-powerpc/include/asm-powerpc/mpic.h --- 2.6.16-rt17/include/asm-powerpc/mpic.h 2006-03-20 14:53:29.000000000 +0900 +++ rt-powerpc/include/asm-powerpc/mpic.h 2006-05-19 20:48:49.000000000 +0900 @@ -160,7 +160,7 @@ struct mpic #ifdef CONFIG_MPIC_BROKEN_U3 /* The fixup table */ struct mpic_irq_fixup *fixups; - spinlock_t fixup_lock; + raw_spinlock_t fixup_lock; #endif /* The various ioremap'ed bases */ diff -rup -x CVS 2.6.16-rt17/kernel/latency.c rt-powerpc/kernel/latency.c --- 2.6.16-rt17/kernel/latency.c 2006-04-26 18:24:29.000000000 +0900 +++ rt-powerpc/kernel/latency.c 2006-07-12 13:57:31.000000000 +0900 @@ -1787,7 +1787,12 @@ void notrace add_preempt_count(unsigned #endif preempt_count() += val; + #ifdef CONFIG_PREEMPT_TRACE +#if 1 /* FIXME: somehow current is NULL. why? */ + if (!current) + return; +#endif if (val <= 10) { unsigned int idx = preempt_count() & PREEMPT_MASK; if (idx < MAX_PREEMPT_TRACE) {