aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arc/include/asm/spinlock.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arc/include/asm/spinlock.h')
-rw-r--r--arch/arc/include/asm/spinlock.h14
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)
610static inline int arch_read_trylock(arch_rwlock_t *rw) 610static 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)
632static inline int arch_write_trylock(arch_rwlock_t *rw) 635static 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
665static inline void arch_read_unlock(arch_rwlock_t *rw) 671static 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
672static inline void arch_write_unlock(arch_rwlock_t *rw) 682static 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