Loading arch/blackfin/include/asm/ipipe.h +15 −13 Original line number Diff line number Diff line Loading @@ -35,10 +35,10 @@ #include <asm/atomic.h> #include <asm/traps.h> #define IPIPE_ARCH_STRING "1.9-01" #define IPIPE_ARCH_STRING "1.10-00" #define IPIPE_MAJOR_NUMBER 1 #define IPIPE_MINOR_NUMBER 9 #define IPIPE_PATCH_NUMBER 1 #define IPIPE_MINOR_NUMBER 10 #define IPIPE_PATCH_NUMBER 0 #ifdef CONFIG_SMP #error "I-pipe/blackfin: SMP not implemented" Loading @@ -54,10 +54,11 @@ do { \ #define task_hijacked(p) \ ({ \ int __x__ = ipipe_current_domain != ipipe_root_domain; \ /* We would need to clear the SYNC flag for the root domain */ \ /* over the current processor in SMP mode. */ \ local_irq_enable_hw(); __x__; \ int __x__ = __ipipe_root_domain_p; \ __clear_bit(IPIPE_SYNC_FLAG, &ipipe_root_cpudom_var(status)); \ if (__x__) \ local_irq_enable_hw(); \ !__x__; \ }) struct ipipe_domain; Loading Loading @@ -179,23 +180,24 @@ static inline unsigned long __ipipe_ffnz(unsigned long ul) #define __ipipe_run_isr(ipd, irq) \ do { \ if (ipd == ipipe_root_domain) { \ if (!__ipipe_pipeline_head_p(ipd)) \ local_irq_enable_hw(); \ if (ipipe_virtual_irq_p(irq)) \ if (ipd == ipipe_root_domain) { \ if (unlikely(ipipe_virtual_irq_p(irq))) { \ irq_enter(); \ ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ else \ irq_exit(); \ } else \ ipd->irqs[irq].handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); \ local_irq_disable_hw(); \ } else { \ __clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ local_irq_enable_nohead(ipd); \ ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ /* Attempt to exit the outer interrupt level before \ * starting the deferred IRQ processing. */ \ local_irq_disable_nohead(ipd); \ __ipipe_run_irqtail(); \ __set_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ } \ local_irq_disable_hw(); \ } while (0) #define __ipipe_syscall_watched_p(p, sc) \ Loading arch/blackfin/kernel/ipipe.c +22 −20 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs) * interrupt. */ m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR); this_domain = ipipe_current_domain; this_domain = __ipipe_current_domain; if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control))) head = &this_domain->p_link; Loading Loading @@ -212,7 +212,9 @@ void __ipipe_unstall_root_raw(void) int __ipipe_syscall_root(struct pt_regs *regs) { struct ipipe_percpu_domain_data *p; unsigned long flags; int ret; /* * We need to run the IRQ tail hook whenever we don't Loading @@ -231,29 +233,31 @@ int __ipipe_syscall_root(struct pt_regs *regs) /* * This routine either returns: * 0 -- if the syscall is to be passed to Linux; * 1 -- if the syscall should not be passed to Linux, and no * >0 -- if the syscall should not be passed to Linux, and no * tail work should be performed; * -1 -- if the syscall should not be passed to Linux but the * <0 -- if the syscall should not be passed to Linux but the * tail work has to be performed (for handling signals etc). */ if (__ipipe_event_monitored_p(IPIPE_EVENT_SYSCALL) && __ipipe_dispatch_event(IPIPE_EVENT_SYSCALL, regs) > 0) { if (ipipe_root_domain_p && !in_atomic()) { /* * Sync pending VIRQs before _TIF_NEED_RESCHED * is tested. */ if (!__ipipe_event_monitored_p(IPIPE_EVENT_SYSCALL)) return 0; ret = __ipipe_dispatch_event(IPIPE_EVENT_SYSCALL, regs); local_irq_save_hw(flags); if ((ipipe_root_cpudom_var(irqpend_himask) & IPIPE_IRQMASK_VIRT) != 0) __ipipe_sync_pipeline(IPIPE_IRQMASK_VIRT); if (!__ipipe_root_domain_p) { local_irq_restore_hw(flags); return -1; } return 1; } return 0; p = ipipe_root_cpudom_ptr(); if ((p->irqpend_himask & IPIPE_IRQMASK_VIRT) != 0) __ipipe_sync_pipeline(IPIPE_IRQMASK_VIRT); local_irq_restore_hw(flags); return -ret; } unsigned long ipipe_critical_enter(void (*syncfn) (void)) Loading Loading @@ -329,9 +333,7 @@ asmlinkage void __ipipe_sync_root(void) void ___ipipe_sync_pipeline(unsigned long syncmask) { struct ipipe_domain *ipd = ipipe_current_domain; if (ipd == ipipe_root_domain) { if (__ipipe_root_domain_p) { if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status))) return; } Loading Loading
arch/blackfin/include/asm/ipipe.h +15 −13 Original line number Diff line number Diff line Loading @@ -35,10 +35,10 @@ #include <asm/atomic.h> #include <asm/traps.h> #define IPIPE_ARCH_STRING "1.9-01" #define IPIPE_ARCH_STRING "1.10-00" #define IPIPE_MAJOR_NUMBER 1 #define IPIPE_MINOR_NUMBER 9 #define IPIPE_PATCH_NUMBER 1 #define IPIPE_MINOR_NUMBER 10 #define IPIPE_PATCH_NUMBER 0 #ifdef CONFIG_SMP #error "I-pipe/blackfin: SMP not implemented" Loading @@ -54,10 +54,11 @@ do { \ #define task_hijacked(p) \ ({ \ int __x__ = ipipe_current_domain != ipipe_root_domain; \ /* We would need to clear the SYNC flag for the root domain */ \ /* over the current processor in SMP mode. */ \ local_irq_enable_hw(); __x__; \ int __x__ = __ipipe_root_domain_p; \ __clear_bit(IPIPE_SYNC_FLAG, &ipipe_root_cpudom_var(status)); \ if (__x__) \ local_irq_enable_hw(); \ !__x__; \ }) struct ipipe_domain; Loading Loading @@ -179,23 +180,24 @@ static inline unsigned long __ipipe_ffnz(unsigned long ul) #define __ipipe_run_isr(ipd, irq) \ do { \ if (ipd == ipipe_root_domain) { \ if (!__ipipe_pipeline_head_p(ipd)) \ local_irq_enable_hw(); \ if (ipipe_virtual_irq_p(irq)) \ if (ipd == ipipe_root_domain) { \ if (unlikely(ipipe_virtual_irq_p(irq))) { \ irq_enter(); \ ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ else \ irq_exit(); \ } else \ ipd->irqs[irq].handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); \ local_irq_disable_hw(); \ } else { \ __clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ local_irq_enable_nohead(ipd); \ ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ /* Attempt to exit the outer interrupt level before \ * starting the deferred IRQ processing. */ \ local_irq_disable_nohead(ipd); \ __ipipe_run_irqtail(); \ __set_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ } \ local_irq_disable_hw(); \ } while (0) #define __ipipe_syscall_watched_p(p, sc) \ Loading
arch/blackfin/kernel/ipipe.c +22 −20 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs) * interrupt. */ m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR); this_domain = ipipe_current_domain; this_domain = __ipipe_current_domain; if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control))) head = &this_domain->p_link; Loading Loading @@ -212,7 +212,9 @@ void __ipipe_unstall_root_raw(void) int __ipipe_syscall_root(struct pt_regs *regs) { struct ipipe_percpu_domain_data *p; unsigned long flags; int ret; /* * We need to run the IRQ tail hook whenever we don't Loading @@ -231,29 +233,31 @@ int __ipipe_syscall_root(struct pt_regs *regs) /* * This routine either returns: * 0 -- if the syscall is to be passed to Linux; * 1 -- if the syscall should not be passed to Linux, and no * >0 -- if the syscall should not be passed to Linux, and no * tail work should be performed; * -1 -- if the syscall should not be passed to Linux but the * <0 -- if the syscall should not be passed to Linux but the * tail work has to be performed (for handling signals etc). */ if (__ipipe_event_monitored_p(IPIPE_EVENT_SYSCALL) && __ipipe_dispatch_event(IPIPE_EVENT_SYSCALL, regs) > 0) { if (ipipe_root_domain_p && !in_atomic()) { /* * Sync pending VIRQs before _TIF_NEED_RESCHED * is tested. */ if (!__ipipe_event_monitored_p(IPIPE_EVENT_SYSCALL)) return 0; ret = __ipipe_dispatch_event(IPIPE_EVENT_SYSCALL, regs); local_irq_save_hw(flags); if ((ipipe_root_cpudom_var(irqpend_himask) & IPIPE_IRQMASK_VIRT) != 0) __ipipe_sync_pipeline(IPIPE_IRQMASK_VIRT); if (!__ipipe_root_domain_p) { local_irq_restore_hw(flags); return -1; } return 1; } return 0; p = ipipe_root_cpudom_ptr(); if ((p->irqpend_himask & IPIPE_IRQMASK_VIRT) != 0) __ipipe_sync_pipeline(IPIPE_IRQMASK_VIRT); local_irq_restore_hw(flags); return -ret; } unsigned long ipipe_critical_enter(void (*syncfn) (void)) Loading Loading @@ -329,9 +333,7 @@ asmlinkage void __ipipe_sync_root(void) void ___ipipe_sync_pipeline(unsigned long syncmask) { struct ipipe_domain *ipd = ipipe_current_domain; if (ipd == ipipe_root_domain) { if (__ipipe_root_domain_p) { if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status))) return; } Loading