Ignore:
File:
1 edited

Legend:

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

    r7e752b2 r90c8b8d  
    3636#define KERN_SPINLOCK_H_
    3737
    38 #include <typedefs.h>
     38#include <arch/types.h>
    3939#include <arch/barrier.h>
    4040#include <preemption.h>
    4141#include <atomic.h>
    4242#include <debug.h>
    43 #include <arch/asm.h>
    4443
    4544#ifdef CONFIG_SMP
     
    4948       
    5049#ifdef CONFIG_DEBUG_SPINLOCK
    51         const char *name;
    52 #endif /* CONFIG_DEBUG_SPINLOCK */
     50        char *name;
     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)
    8380
    84 #define spinlock_lock(lock)    spinlock_lock_debug((lock))
    85 #define spinlock_unlock(lock)  spinlock_unlock_debug((lock))
    86 
    87 #else /* CONFIG_DEBUG_SPINLOCK */
     81#else
    8882
    8983#define SPINLOCK_INITIALIZE_NAME(lock_name, desc_name) \
     
    9791        }
    9892
    99 #define ASSERT_SPINLOCK(expr, lock) \
    100         ASSERT(expr)
     93#define spinlock_lock(lock)  atomic_lock_arch(&(lock)->val)
    10194
    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 */
     95#endif
    10696
    10797#define SPINLOCK_INITIALIZE(lock_name) \
     
    111101        SPINLOCK_STATIC_INITIALIZE_NAME(lock_name, #lock_name)
    112102
    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 *);
     103extern void spinlock_initialize(spinlock_t *lock, char *name);
     104extern int spinlock_trylock(spinlock_t *lock);
     105extern void spinlock_lock_debug(spinlock_t *lock);
    118106
    119107/** Unlock spinlock
    120108 *
    121  * Unlock spinlock for non-debug kernels.
     109 * Unlock spinlock.
    122110 *
    123111 * @param sl Pointer to spinlock_t structure.
    124  *
    125112 */
    126 NO_TRACE static inline void spinlock_unlock_nondebug(spinlock_t *lock)
     113static inline void spinlock_unlock(spinlock_t *lock)
    127114{
     115        ASSERT(atomic_get(&lock->val) != 0);
     116       
    128117        /*
    129118         * Prevent critical section code from bleeding out this way down.
     
    146135        if ((pname)++ > (value)) { \
    147136                (pname) = 0; \
    148                 printf("Deadlock probe %s: exceeded threshold %u\n" \
     137                printf("Deadlock probe %s: exceeded threshold %u\n", \
    149138                    "cpu%u: function=%s, line=%u\n", \
    150139                    #pname, (value), CPU->id, __func__, __LINE__); \
    151140        }
    152141
    153 #else /* CONFIG_DEBUG_SPINLOCK */
     142#else
    154143
    155144#define DEADLOCK_PROBE_INIT(pname)
    156145#define DEADLOCK_PROBE(pname, value)
    157146
    158 #endif /* CONFIG_DEBUG_SPINLOCK */
     147#endif
    159148
    160149#else /* CONFIG_SMP */
     
    171160#define SPINLOCK_STATIC_INITIALIZE_NAME(name, desc_name)
    172161
    173 #define ASSERT_SPINLOCK(expr, lock)  ASSERT(expr)
    174 
    175162#define spinlock_initialize(lock, name)
    176163
     
    178165#define spinlock_trylock(lock)  (preemption_disable(), 1)
    179166#define spinlock_unlock(lock)   preemption_enable()
    180 #define spinlock_locked(lock)   1
    181 #define spinlock_unlocked(lock) 1
    182167
    183168#define DEADLOCK_PROBE_INIT(pname)
    184169#define DEADLOCK_PROBE(pname, value)
    185170
    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 *);
     171#endif
    289172
    290173#endif
Note: See TracChangeset for help on using the changeset viewer.