Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/synch/spinlock.h

    r7a0359b r13108f24  
    4141#include <atomic.h>
    4242#include <debug.h>
    43 #include <arch/asm.h>
    4443
    4544#ifdef CONFIG_SMP
     
    5049#ifdef CONFIG_DEBUG_SPINLOCK
    5150        const char *name;
    52 #endif /* CONFIG_DEBUG_SPINLOCK */
     51#endif
    5352} spinlock_t;
    5453
     
    6160
    6261/*
    63  * SPINLOCK_INITIALIZE and SPINLOCK_STATIC_INITIALIZE are to be used
    64  * for statically allocated spinlocks. They declare (either as global
    65  * or static) symbol and initialize the lock.
     62 * SPINLOCK_INITIALIZE is to be used for statically allocated spinlocks.
     63 * It declares and initializes the lock.
    6664 */
    6765#ifdef CONFIG_DEBUG_SPINLOCK
     
    7977        }
    8078
    81 #define ASSERT_SPINLOCK(expr, lock) \
    82         ASSERT_VERBOSE(expr, (lock)->name)
     79#define spinlock_lock(lock)     spinlock_lock_debug((lock))
     80#define spinlock_unlock(lock)   spinlock_unlock_debug((lock))
    8381
    84 #define spinlock_lock(lock)    spinlock_lock_debug((lock))
    85 #define spinlock_unlock(lock)  spinlock_unlock_debug((lock))
    86 
    87 #else /* CONFIG_DEBUG_SPINLOCK */
     82#else
    8883
    8984#define SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \
     
    9792        }
    9893
    99 #define ASSERT_SPINLOCK(expr, lock) \
    100         ASSERT(expr)
     94#define spinlock_lock(lock)     atomic_lock_arch(&(lock)->val)
     95#define spinlock_unlock(lock)   spinlock_unlock_nondebug((lock))
    10196
    102 #define spinlock_lock(lock)    atomic_lock_arch(&(lock)->val)
    103 #define spinlock_unlock(lock)  spinlock_unlock_nondebug((lock))
    104 
    105 #endif /* CONFIG_DEBUG_SPINLOCK */
     97#endif
    10698
    10799#define SPINLOCK_INITIALIZE(lock_name) \
     
    111103        SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, #lock_name)
    112104
    113 extern void spinlock_initialize(spinlock_t *, const char *);
    114 extern int spinlock_trylock(spinlock_t *);
    115 extern void spinlock_lock_debug(spinlock_t *);
    116 extern void spinlock_unlock_debug(spinlock_t *);
    117 extern bool spinlock_locked(spinlock_t *);
     105extern void spinlock_initialize(spinlock_t *lock, const char *name);
     106extern int spinlock_trylock(spinlock_t *lock);
     107extern void spinlock_lock_debug(spinlock_t *lock);
     108extern void spinlock_unlock_debug(spinlock_t *lock);
    118109
    119110/** Unlock spinlock
     
    122113 *
    123114 * @param sl Pointer to spinlock_t structure.
    124  *
    125115 */
    126 NO_TRACE static inline void spinlock_unlock_nondebug(spinlock_t *lock)
     116static inline void spinlock_unlock_nondebug(spinlock_t *lock)
    127117{
    128118        /*
     
    151141        }
    152142
    153 #else /* CONFIG_DEBUG_SPINLOCK */
     143#else
    154144
    155145#define DEADLOCK_PROBE_INIT(pname)
    156146#define DEADLOCK_PROBE(pname, value)
    157147
    158 #endif /* CONFIG_DEBUG_SPINLOCK */
     148#endif
    159149
    160150#else /* CONFIG_SMP */
     
    171161#define SPINLOCK_STATIC_INITIALIZE_NAME(name, desc_name)
    172162
    173 #define ASSERT_SPINLOCK(expr, lock)  ASSERT(expr)
    174 
    175163#define spinlock_initialize(lock, name)
    176164
     
    178166#define spinlock_trylock(lock)  (preemption_disable(), 1)
    179167#define spinlock_unlock(lock)   preemption_enable()
    180 #define spinlock_locked(lock)   1
    181 #define spinlock_unlocked(lock) 1
    182168
    183169#define DEADLOCK_PROBE_INIT(pname)
    184170#define DEADLOCK_PROBE(pname, value)
    185171
    186 #endif /* CONFIG_SMP */
    187 
    188 typedef struct {
    189         SPINLOCK_DECLARE(lock);  /**< Spinlock */
    190         bool guard;              /**< Flag whether ipl is valid */
    191         ipl_t ipl;               /**< Original interrupt level */
    192 } irq_spinlock_t;
    193 
    194 #define IRQ_SPINLOCK_DECLARE(lock_name)  irq_spinlock_t lock_name
    195 #define IRQ_SPINLOCK_EXTERN(lock_name)   extern irq_spinlock_t lock_name
    196 
    197 #ifdef CONFIG_SMP
    198 
    199 #define ASSERT_IRQ_SPINLOCK(expr, irq_lock) \
    200         ASSERT_SPINLOCK(expr, &((irq_lock)->lock))
    201 
    202 /*
    203  * IRQ_SPINLOCK_INITIALIZE and IRQ_SPINLOCK_STATIC_INITIALIZE are to be used
    204  * for statically allocated interrupts-disabled spinlocks. They declare (either
    205  * as global or static symbol) and initialize the lock.
    206  */
    207 #ifdef CONFIG_DEBUG_SPINLOCK
    208 
    209 #define IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \
    210         irq_spinlock_t lock_name = { \
    211                 .lock = { \
    212                         .name = desc_name, \
    213                         .val = { 0 } \
    214                 }, \
    215                 .guard = false, \
    216                 .ipl = 0 \
    217         }
    218 
    219 #define IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, desc_name) \
    220         static irq_spinlock_t lock_name = { \
    221                 .lock = { \
    222                         .name = desc_name, \
    223                         .val = { 0 } \
    224                 }, \
    225                 .guard = false, \
    226                 .ipl = 0 \
    227         }
    228 
    229 #else /* CONFIG_DEBUG_SPINLOCK */
    230 
    231 #define IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \
    232         irq_spinlock_t lock_name = { \
    233                 .lock = { \
    234                         .val = { 0 } \
    235                 }, \
    236                 .guard = false, \
    237                 .ipl = 0 \
    238         }
    239 
    240 #define IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, desc_name) \
    241         static irq_spinlock_t lock_name = { \
    242                 .lock = { \
    243                         .val = { 0 } \
    244                 }, \
    245                 .guard = false, \
    246                 .ipl = 0 \
    247         }
    248 
    249 #endif /* CONFIG_DEBUG_SPINLOCK */
    250 
    251 #else /* CONFIG_SMP */
    252 
    253 /*
    254  * Since the spinlocks are void on UP systems, we also need
    255  * to have a special variant of interrupts-disabled spinlock
    256  * macros which take this into account.
    257  */
    258 
    259 #define ASSERT_IRQ_SPINLOCK(expr, irq_lock) \
    260         ASSERT_SPINLOCK(expr, NULL)
    261 
    262 #define IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \
    263         irq_spinlock_t lock_name = { \
    264                 .guard = false, \
    265                 .ipl = 0 \
    266         }
    267 
    268 #define IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, desc_name) \
    269         static irq_spinlock_t lock_name = { \
    270                 .guard = false, \
    271                 .ipl = 0 \
    272         }
    273 
    274 #endif /* CONFIG_SMP */
    275 
    276 #define IRQ_SPINLOCK_INITIALIZE(lock_name) \
    277         IRQ_SPINLOCK_INITIALIZE_NAME(lock_name, #lock_name)
    278 
    279 #define IRQ_SPINLOCK_STATIC_INITIALIZE(lock_name) \
    280         IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, #lock_name)
    281 
    282 extern void irq_spinlock_initialize(irq_spinlock_t *, const char *);
    283 extern void irq_spinlock_lock(irq_spinlock_t *, bool);
    284 extern void irq_spinlock_unlock(irq_spinlock_t *, bool);
    285 extern int irq_spinlock_trylock(irq_spinlock_t *);
    286 extern void irq_spinlock_pass(irq_spinlock_t *, irq_spinlock_t *);
    287 extern void irq_spinlock_exchange(irq_spinlock_t *, irq_spinlock_t *);
    288 extern bool irq_spinlock_locked(irq_spinlock_t *);
     172#endif
    289173
    290174#endif
Note: See TracChangeset for help on using the changeset viewer.