/include/linux/spinlock_up.h

https://github.com/airy09/android_kernel_sony_apq8064 · C Header · 78 lines · 47 code · 16 blank · 15 comment · 9 complexity · 4f33236e6d8041721c373993d21e71b1 MD5 · raw file

  1. #ifndef __LINUX_SPINLOCK_UP_H
  2. #define __LINUX_SPINLOCK_UP_H
  3. #ifndef __LINUX_SPINLOCK_H
  4. # error "please don't include this file directly"
  5. #endif
  6. #include <asm/processor.h> /* for cpu_relax() */
  7. /*
  8. * include/linux/spinlock_up.h - UP-debug version of spinlocks.
  9. *
  10. * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
  11. * Released under the General Public License (GPL).
  12. *
  13. * In the debug case, 1 means unlocked, 0 means locked. (the values
  14. * are inverted, to catch initialization bugs)
  15. *
  16. * No atomicity anywhere, we are on UP.
  17. */
  18. #ifdef CONFIG_DEBUG_SPINLOCK
  19. #define arch_spin_is_locked(x) ((x)->slock == 0)
  20. static inline void arch_spin_lock(arch_spinlock_t *lock)
  21. {
  22. lock->slock = 0;
  23. }
  24. static inline void
  25. arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags)
  26. {
  27. local_irq_save(flags);
  28. lock->slock = 0;
  29. }
  30. static inline int arch_spin_trylock(arch_spinlock_t *lock)
  31. {
  32. char oldval = lock->slock;
  33. lock->slock = 0;
  34. return oldval > 0;
  35. }
  36. static inline void arch_spin_unlock(arch_spinlock_t *lock)
  37. {
  38. lock->slock = 1;
  39. }
  40. /*
  41. * Read-write spinlocks. No debug version.
  42. */
  43. #define arch_read_lock(lock) do { (void)(lock); } while (0)
  44. #define arch_write_lock(lock) do { (void)(lock); } while (0)
  45. #define arch_read_trylock(lock) ({ (void)(lock); 1; })
  46. #define arch_write_trylock(lock) ({ (void)(lock); 1; })
  47. #define arch_read_unlock(lock) do { (void)(lock); } while (0)
  48. #define arch_write_unlock(lock) do { (void)(lock); } while (0)
  49. #else /* DEBUG_SPINLOCK */
  50. #define arch_spin_is_locked(lock) ((void)(lock), 0)
  51. /* for sched.c and kernel_lock.c: */
  52. # define arch_spin_lock(lock) do { (void)(lock); } while (0)
  53. # define arch_spin_lock_flags(lock, flags) do { (void)(lock); } while (0)
  54. # define arch_spin_unlock(lock) do { (void)(lock); } while (0)
  55. # define arch_spin_trylock(lock) ({ (void)(lock); 1; })
  56. #endif /* DEBUG_SPINLOCK */
  57. #define arch_spin_is_contended(lock) (((void)(lock), 0))
  58. #define arch_read_can_lock(lock) (((void)(lock), 1))
  59. #define arch_write_can_lock(lock) (((void)(lock), 1))
  60. #define arch_spin_unlock_wait(lock) \
  61. do { cpu_relax(); } while (arch_spin_is_locked(lock))
  62. #endif /* __LINUX_SPINLOCK_UP_H */