diff options
Diffstat (limited to 'arch/arc/include/asm/spinlock.h')
-rw-r--r-- | arch/arc/include/asm/spinlock.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/arc/include/asm/spinlock.h b/arch/arc/include/asm/spinlock.h index db8c59d1eaeb..800e7c430ca5 100644 --- a/arch/arc/include/asm/spinlock.h +++ b/arch/arc/include/asm/spinlock.h | |||
@@ -610,7 +610,9 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock) | |||
610 | static inline int arch_read_trylock(arch_rwlock_t *rw) | 610 | static inline int arch_read_trylock(arch_rwlock_t *rw) |
611 | { | 611 | { |
612 | int ret = 0; | 612 | int ret = 0; |
613 | unsigned long flags; | ||
613 | 614 | ||
615 | local_irq_save(flags); | ||
614 | arch_spin_lock(&(rw->lock_mutex)); | 616 | arch_spin_lock(&(rw->lock_mutex)); |
615 | 617 | ||
616 | /* | 618 | /* |
@@ -623,6 +625,7 @@ static inline int arch_read_trylock(arch_rwlock_t *rw) | |||
623 | } | 625 | } |
624 | 626 | ||
625 | arch_spin_unlock(&(rw->lock_mutex)); | 627 | arch_spin_unlock(&(rw->lock_mutex)); |
628 | local_irq_restore(flags); | ||
626 | 629 | ||
627 | smp_mb(); | 630 | smp_mb(); |
628 | return ret; | 631 | return ret; |
@@ -632,7 +635,9 @@ static inline int arch_read_trylock(arch_rwlock_t *rw) | |||
632 | static inline int arch_write_trylock(arch_rwlock_t *rw) | 635 | static inline int arch_write_trylock(arch_rwlock_t *rw) |
633 | { | 636 | { |
634 | int ret = 0; | 637 | int ret = 0; |
638 | unsigned long flags; | ||
635 | 639 | ||
640 | local_irq_save(flags); | ||
636 | arch_spin_lock(&(rw->lock_mutex)); | 641 | arch_spin_lock(&(rw->lock_mutex)); |
637 | 642 | ||
638 | /* | 643 | /* |
@@ -646,6 +651,7 @@ static inline int arch_write_trylock(arch_rwlock_t *rw) | |||
646 | ret = 1; | 651 | ret = 1; |
647 | } | 652 | } |
648 | arch_spin_unlock(&(rw->lock_mutex)); | 653 | arch_spin_unlock(&(rw->lock_mutex)); |
654 | local_irq_restore(flags); | ||
649 | 655 | ||
650 | return ret; | 656 | return ret; |
651 | } | 657 | } |
@@ -664,16 +670,24 @@ static inline void arch_write_lock(arch_rwlock_t *rw) | |||
664 | 670 | ||
665 | static inline void arch_read_unlock(arch_rwlock_t *rw) | 671 | static inline void arch_read_unlock(arch_rwlock_t *rw) |
666 | { | 672 | { |
673 | unsigned long flags; | ||
674 | |||
675 | local_irq_save(flags); | ||
667 | arch_spin_lock(&(rw->lock_mutex)); | 676 | arch_spin_lock(&(rw->lock_mutex)); |
668 | rw->counter++; | 677 | rw->counter++; |
669 | arch_spin_unlock(&(rw->lock_mutex)); | 678 | arch_spin_unlock(&(rw->lock_mutex)); |
679 | local_irq_restore(flags); | ||
670 | } | 680 | } |
671 | 681 | ||
672 | static inline void arch_write_unlock(arch_rwlock_t *rw) | 682 | static inline void arch_write_unlock(arch_rwlock_t *rw) |
673 | { | 683 | { |
684 | unsigned long flags; | ||
685 | |||
686 | local_irq_save(flags); | ||
674 | arch_spin_lock(&(rw->lock_mutex)); | 687 | arch_spin_lock(&(rw->lock_mutex)); |
675 | rw->counter = __ARCH_RW_LOCK_UNLOCKED__; | 688 | rw->counter = __ARCH_RW_LOCK_UNLOCKED__; |
676 | arch_spin_unlock(&(rw->lock_mutex)); | 689 | arch_spin_unlock(&(rw->lock_mutex)); |
690 | local_irq_restore(flags); | ||
677 | } | 691 | } |
678 | 692 | ||
679 | #endif | 693 | #endif |