Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Blackfin/ipipe: prepare status bitops for SMP support

Signed-off-by: Philippe Gerum <rpm@xenomai.org>
Signed-off-by: Li Yi <yi.li@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>

authored by

Philippe Gerum and committed by
Mike Frysinger
d2685fb7 ab843c79

+74 -25
-10
arch/blackfin/include/asm/ipipe.h
··· 124 124 return 1; 125 125 } 126 126 127 - static inline void __ipipe_lock_root(void) 128 - { 129 - set_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)); 130 - } 131 - 132 - static inline void __ipipe_unlock_root(void) 133 - { 134 - clear_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)); 135 - } 136 - 137 127 void __ipipe_enable_pipeline(void); 138 128 139 129 #define __ipipe_hook_critical_ipi(ipd) do { } while (0)
+7 -15
arch/blackfin/include/asm/ipipe_base.h
··· 51 51 52 52 extern unsigned long __ipipe_root_status; /* Alias to ipipe_root_cpudom_var(status) */ 53 53 54 - #define __ipipe_stall_root() \ 55 - do { \ 56 - volatile unsigned long *p = &__ipipe_root_status; \ 57 - set_bit(0, p); \ 58 - } while (0) 54 + void __ipipe_stall_root(void); 59 55 60 - #define __ipipe_test_and_stall_root() \ 61 - ({ \ 62 - volatile unsigned long *p = &__ipipe_root_status; \ 63 - test_and_set_bit(0, p); \ 64 - }) 56 + unsigned long __ipipe_test_and_stall_root(void); 65 57 66 - #define __ipipe_test_root() \ 67 - ({ \ 68 - const unsigned long *p = &__ipipe_root_status; \ 69 - test_bit(0, p); \ 70 - }) 58 + unsigned long __ipipe_test_root(void); 59 + 60 + void __ipipe_lock_root(void); 61 + 62 + void __ipipe_unlock_root(void); 71 63 72 64 #endif /* !__ASSEMBLY__ */ 73 65
+67
arch/blackfin/kernel/ipipe.c
··· 335 335 __clear_bit(IPIPE_STALL_FLAG, &ipipe_root_cpudom_var(status)); 336 336 bfin_sti(bfin_irq_flags); 337 337 } 338 + 339 + /* 340 + * We could use standard atomic bitops in the following root status 341 + * manipulation routines, but let's prepare for SMP support in the 342 + * same move, preventing CPU migration as required. 343 + */ 344 + void __ipipe_stall_root(void) 345 + { 346 + unsigned long *p, flags; 347 + 348 + local_irq_save_hw(flags); 349 + p = &__ipipe_root_status; 350 + __set_bit(IPIPE_STALL_FLAG, p); 351 + local_irq_restore_hw(flags); 352 + } 353 + EXPORT_SYMBOL(__ipipe_stall_root); 354 + 355 + unsigned long __ipipe_test_and_stall_root(void) 356 + { 357 + unsigned long *p, flags; 358 + int x; 359 + 360 + local_irq_save_hw(flags); 361 + p = &__ipipe_root_status; 362 + x = __test_and_set_bit(IPIPE_STALL_FLAG, p); 363 + local_irq_restore_hw(flags); 364 + 365 + return x; 366 + } 367 + EXPORT_SYMBOL(__ipipe_test_and_stall_root); 368 + 369 + unsigned long __ipipe_test_root(void) 370 + { 371 + const unsigned long *p; 372 + unsigned long flags; 373 + int x; 374 + 375 + local_irq_save_hw_smp(flags); 376 + p = &__ipipe_root_status; 377 + x = test_bit(IPIPE_STALL_FLAG, p); 378 + local_irq_restore_hw_smp(flags); 379 + 380 + return x; 381 + } 382 + EXPORT_SYMBOL(__ipipe_test_root); 383 + 384 + void __ipipe_lock_root(void) 385 + { 386 + unsigned long *p, flags; 387 + 388 + local_irq_save_hw(flags); 389 + p = &__ipipe_root_status; 390 + __set_bit(IPIPE_SYNCDEFER_FLAG, p); 391 + local_irq_restore_hw(flags); 392 + } 393 + EXPORT_SYMBOL(__ipipe_lock_root); 394 + 395 + void __ipipe_unlock_root(void) 396 + { 397 + unsigned long *p, flags; 398 + 399 + local_irq_save_hw(flags); 400 + p = &__ipipe_root_status; 401 + __clear_bit(IPIPE_SYNCDEFER_FLAG, p); 402 + local_irq_restore_hw(flags); 403 + } 404 + EXPORT_SYMBOL(__ipipe_unlock_root);