linux/include/linux/spinlock.h
<<
>>
Prefs
   1#ifndef __LINUX_SPINLOCK_H
   2#define __LINUX_SPINLOCK_H
   3
   4/*
   5 * include/linux/spinlock.h - generic locking declarations
   6 */
   7
   8#include <linux/config.h>
   9#include <linux/preempt.h>
  10#include <linux/linkage.h>
  11#include <linux/compiler.h>
  12#include <linux/thread_info.h>
  13#include <linux/kernel.h>
  14#include <linux/stringify.h>
  15
  16#include <asm/processor.h>      /* for cpu relax */
  17#include <asm/system.h>
  18
  19/*
  20 * Must define these before including other files, inline functions need them
  21 */
  22#define LOCK_SECTION_NAME                       \
  23        ".text.lock." __stringify(KBUILD_BASENAME)
  24
  25#define LOCK_SECTION_START(extra)               \
  26        ".subsection 1\n\t"                     \
  27        extra                                   \
  28        ".ifndef " LOCK_SECTION_NAME "\n\t"     \
  29        LOCK_SECTION_NAME ":\n\t"               \
  30        ".endif\n"
  31
  32#define LOCK_SECTION_END                        \
  33        ".previous\n\t"
  34
  35#define __lockfunc fastcall __attribute__((section(".spinlock.text")))
  36
  37/*
  38 * If CONFIG_SMP is set, pull in the _raw_* definitions
  39 */
  40#ifdef CONFIG_SMP
  41
  42#define assert_spin_locked(x)   BUG_ON(!spin_is_locked(x))
  43#include <asm/spinlock.h>
  44
  45int __lockfunc _spin_trylock(spinlock_t *lock);
  46int __lockfunc _read_trylock(rwlock_t *lock);
  47int __lockfunc _write_trylock(rwlock_t *lock);
  48
  49void __lockfunc _spin_lock(spinlock_t *lock)    __acquires(spinlock_t);
  50void __lockfunc _read_lock(rwlock_t *lock)      __acquires(rwlock_t);
  51void __lockfunc _write_lock(rwlock_t *lock)     __acquires(rwlock_t);
  52
  53void __lockfunc _spin_unlock(spinlock_t *lock)  __releases(spinlock_t);
  54void __lockfunc _read_unlock(rwlock_t *lock)    __releases(rwlock_t);
  55void __lockfunc _write_unlock(rwlock_t *lock)   __releases(rwlock_t);
  56
  57unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)   __acquires(spinlock_t);
  58unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock)     __acquires(rwlock_t);
  59unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock)    __acquires(rwlock_t);
  60
  61void __lockfunc _spin_lock_irq(spinlock_t *lock)        __acquires(spinlock_t);
  62void __lockfunc _spin_lock_bh(spinlock_t *lock)         __acquires(spinlock_t);
  63void __lockfunc _read_lock_irq(rwlock_t *lock)          __acquires(rwlock_t);
  64void __lockfunc _read_lock_bh(rwlock_t *lock)           __acquires(rwlock_t);
  65void __lockfunc _write_lock_irq(rwlock_t *lock)         __acquires(rwlock_t);
  66void __lockfunc _write_lock_bh(rwlock_t *lock)          __acquires(rwlock_t);
  67
  68void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)  __releases(spinlock_t);
  69void __lockfunc _spin_unlock_irq(spinlock_t *lock)                              __releases(spinlock_t);
  70void __lockfunc _spin_unlock_bh(spinlock_t *lock)                               __releases(spinlock_t);
  71void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags)    __releases(rwlock_t);
  72void __lockfunc _read_unlock_irq(rwlock_t *lock)                                __releases(rwlock_t);
  73void __lockfunc _read_unlock_bh(rwlock_t *lock)                                 __releases(rwlock_t);
  74void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags)   __releases(rwlock_t);
  75void __lockfunc _write_unlock_irq(rwlock_t *lock)                               __releases(rwlock_t);
  76void __lockfunc _write_unlock_bh(rwlock_t *lock)                                __releases(rwlock_t);
  77
  78int __lockfunc _spin_trylock_bh(spinlock_t *lock);
  79int __lockfunc generic_raw_read_trylock(rwlock_t *lock);
  80int in_lock_functions(unsigned long addr);
  81
  82#else
  83
  84#define in_lock_functions(ADDR) 0
  85
  86#if !defined(CONFIG_PREEMPT) && !defined(CONFIG_DEBUG_SPINLOCK)
  87# define _atomic_dec_and_lock(atomic,lock) atomic_dec_and_test(atomic)
  88# define ATOMIC_DEC_AND_LOCK
  89#endif
  90
  91#ifdef CONFIG_DEBUG_SPINLOCK
  92 
  93#define SPINLOCK_MAGIC  0x1D244B3C
  94typedef struct {
  95        unsigned long magic;
  96        volatile unsigned long lock;
  97        volatile unsigned int babble;
  98        const char *module;
  99        char *owner;
 100        int oline;
 101} spinlock_t;
 102#define SPIN_LOCK_UNLOCKED (spinlock_t) { SPINLOCK_MAGIC, 0, 10, __FILE__ , NULL, 0}
 103
 104#define spin_lock_init(x) \
 105        do { \
 106                (x)->magic = SPINLOCK_MAGIC; \
 107                (x)->lock = 0; \
 108                (x)->babble = 5; \
 109                (x)->module = __FILE__; \
 110                (x)->owner = NULL; \
 111                (x)->oline = 0; \
 112        } while (0)
 113
 114#define CHECK_LOCK(x) \
 115        do { \
 116                if ((x)->magic != SPINLOCK_MAGIC) { \
 117                        printk(KERN_ERR "%s:%d: spin_is_locked on uninitialized spinlock %p.\n", \
 118                                        __FILE__, __LINE__, (x)); \
 119                } \
 120        } while(0)
 121
 122#define _raw_spin_lock(x)               \
 123        do { \
 124                CHECK_LOCK(x); \
 125                if ((x)->lock&&(x)->babble) { \
 126                        (x)->babble--; \
 127                        printk("%s:%d: spin_lock(%s:%p) already locked by %s/%d\n", \
 128                                        __FILE__,__LINE__, (x)->module, \
 129                                        (x), (x)->owner, (x)->oline); \
 130                } \
 131                (x)->lock = 1; \
 132                (x)->owner = __FILE__; \
 133                (x)->oline = __LINE__; \
 134        } while (0)
 135
 136/* without debugging, spin_is_locked on UP always says
 137 * FALSE. --> printk if already locked. */
 138#define spin_is_locked(x) \
 139        ({ \
 140                CHECK_LOCK(x); \
 141                if ((x)->lock&&(x)->babble) { \
 142                        (x)->babble--; \
 143                        printk("%s:%d: spin_is_locked(%s:%p) already locked by %s/%d\n", \
 144                                        __FILE__,__LINE__, (x)->module, \
 145                                        (x), (x)->owner, (x)->oline); \
 146                } \
 147                0; \
 148        })
 149
 150/* with debugging, assert_spin_locked() on UP does check
 151 * the lock value properly */
 152#define assert_spin_locked(x) \
 153        ({ \
 154                CHECK_LOCK(x); \
 155                BUG_ON(!(x)->lock); \
 156        })
 157
 158/* without debugging, spin_trylock on UP always says
 159 * TRUE. --> printk if already locked. */
 160#define _raw_spin_trylock(x) \
 161        ({ \
 162                CHECK_LOCK(x); \
 163                if ((x)->lock&&(x)->babble) { \
 164                        (x)->babble--; \
 165                        printk("%s:%d: spin_trylock(%s:%p) already locked by %s/%d\n", \
 166                                        __FILE__,__LINE__, (x)->module, \
 167                                        (x), (x)->owner, (x)->oline); \
 168                } \
 169                (x)->lock = 1; \
 170                (x)->owner = __FILE__; \
 171                (x)->oline = __LINE__; \
 172                1; \
 173        })
 174
 175#define spin_unlock_wait(x)     \
 176        do { \
 177                CHECK_LOCK(x); \
 178                if ((x)->lock&&(x)->babble) { \
 179                        (x)->babble--; \
 180                        printk("%s:%d: spin_unlock_wait(%s:%p) owned by %s/%d\n", \
 181                                        __FILE__,__LINE__, (x)->module, (x), \
 182                                        (x)->owner, (x)->oline); \
 183                }\
 184        } while (0)
 185
 186#define _raw_spin_unlock(x) \
 187        do { \
 188                CHECK_LOCK(x); \
 189                if (!(x)->lock&&(x)->babble) { \
 190                        (x)->babble--; \
 191                        printk("%s:%d: spin_unlock(%s:%p) not locked\n", \
 192                                        __FILE__,__LINE__, (x)->module, (x));\
 193                } \
 194                (x)->lock = 0; \
 195        } while (0)
 196#else
 197/*
 198 * gcc versions before ~2.95 have a nasty bug with empty initializers.
 199 */
 200#if (__GNUC__ > 2)
 201  typedef struct { } spinlock_t;
 202  #define SPIN_LOCK_UNLOCKED (spinlock_t) { }
 203#else
 204  typedef struct { int gcc_is_buggy; } spinlock_t;
 205  #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
 206#endif
 207
 208/*
 209 * If CONFIG_SMP is unset, declare the _raw_* definitions as nops
 210 */
 211#define spin_lock_init(lock)    do { (void)(lock); } while(0)
 212#define _raw_spin_lock(lock)    do { (void)(lock); } while(0)
 213#define spin_is_locked(lock)    ((void)(lock), 0)
 214#define assert_spin_locked(lock)        do { (void)(lock); } while(0)
 215#define _raw_spin_trylock(lock) (((void)(lock), 1))
 216#define spin_unlock_wait(lock)  (void)(lock)
 217#define _raw_spin_unlock(lock) do { (void)(lock); } while(0)
 218#endif /* CONFIG_DEBUG_SPINLOCK */
 219
 220/* RW spinlocks: No debug version */
 221
 222#if (__GNUC__ > 2)
 223  typedef struct { } rwlock_t;
 224  #define RW_LOCK_UNLOCKED (rwlock_t) { }
 225#else
 226  typedef struct { int gcc_is_buggy; } rwlock_t;
 227  #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
 228#endif
 229
 230#define rwlock_init(lock)       do { (void)(lock); } while(0)
 231#define _raw_read_lock(lock)    do { (void)(lock); } while(0)
 232#define _raw_read_unlock(lock)  do { (void)(lock); } while(0)
 233#define _raw_write_lock(lock)   do { (void)(lock); } while(0)
 234#define _raw_write_unlock(lock) do { (void)(lock); } while(0)
 235#define read_can_lock(lock)     (((void)(lock), 1))
 236#define write_can_lock(lock)    (((void)(lock), 1))
 237#define _raw_read_trylock(lock) ({ (void)(lock); (1); })
 238#define _raw_write_trylock(lock) ({ (void)(lock); (1); })
 239
 240#define _spin_trylock(lock)     ({preempt_disable(); _raw_spin_trylock(lock) ? \
 241                                1 : ({preempt_enable(); 0;});})
 242
 243#define _read_trylock(lock)     ({preempt_disable();_raw_read_trylock(lock) ? \
 244                                1 : ({preempt_enable(); 0;});})
 245
 246#define _write_trylock(lock)    ({preempt_disable(); _raw_write_trylock(lock) ? \
 247                                1 : ({preempt_enable(); 0;});})
 248
 249#define _spin_trylock_bh(lock)  ({preempt_disable(); local_bh_disable(); \
 250                                _raw_spin_trylock(lock) ? \
 251                                1 : ({preempt_enable(); local_bh_enable(); 0;});})
 252
 253#define _spin_lock(lock)        \
 254do { \
 255        preempt_disable(); \
 256        _raw_spin_lock(lock); \
 257        __acquire(lock); \
 258} while(0)
 259
 260#define _write_lock(lock) \
 261do { \
 262        preempt_disable(); \
 263        _raw_write_lock(lock); \
 264        __acquire(lock); \
 265} while(0)
 266 
 267#define _read_lock(lock)        \
 268do { \
 269        preempt_disable(); \
 270        _raw_read_lock(lock); \
 271        __acquire(lock); \
 272} while(0)
 273
 274#define _spin_unlock(lock) \
 275do { \
 276        _raw_spin_unlock(lock); \
 277        preempt_enable(); \
 278        __release(lock); \
 279} while (0)
 280
 281#define _write_unlock(lock) \
 282do { \
 283        _raw_write_unlock(lock); \
 284        preempt_enable(); \
 285        __release(lock); \
 286} while(0)
 287
 288#define _read_unlock(lock) \
 289do { \
 290        _raw_read_unlock(lock); \
 291        preempt_enable(); \
 292        __release(lock); \
 293} while(0)
 294
 295#define _spin_lock_irqsave(lock, flags) \
 296do {    \
 297        local_irq_save(flags); \
 298        preempt_disable(); \
 299        _raw_spin_lock(lock); \
 300        __acquire(lock); \
 301} while (0)
 302
 303#define _spin_lock_irq(lock) \
 304do { \
 305        local_irq_disable(); \
 306        preempt_disable(); \
 307        _raw_spin_lock(lock); \
 308        __acquire(lock); \
 309} while (0)
 310
 311#define _spin_lock_bh(lock) \
 312do { \
 313        local_bh_disable(); \
 314        preempt_disable(); \
 315        _raw_spin_lock(lock); \
 316        __acquire(lock); \
 317} while (0)
 318
 319#define _read_lock_irqsave(lock, flags) \
 320do {    \
 321        local_irq_save(flags); \
 322        preempt_disable(); \
 323        _raw_read_lock(lock); \
 324        __acquire(lock); \
 325} while (0)
 326
 327#define _read_lock_irq(lock) \
 328do { \
 329        local_irq_disable(); \
 330        preempt_disable(); \
 331        _raw_read_lock(lock); \
 332        __acquire(lock); \
 333} while (0)
 334
 335#define _read_lock_bh(lock) \
 336do { \
 337        local_bh_disable(); \
 338        preempt_disable(); \
 339        _raw_read_lock(lock); \
 340        __acquire(lock); \
 341} while (0)
 342
 343#define _write_lock_irqsave(lock, flags) \
 344do {    \
 345        local_irq_save(flags); \
 346        preempt_disable(); \
 347        _raw_write_lock(lock); \
 348        __acquire(lock); \
 349} while (0)
 350
 351#define _write_lock_irq(lock) \
 352do { \
 353        local_irq_disable(); \
 354        preempt_disable(); \
 355        _raw_write_lock(lock); \
 356        __acquire(lock); \
 357} while (0)
 358
 359#define _write_lock_bh(lock) \
 360do { \
 361        local_bh_disable(); \
 362        preempt_disable(); \
 363        _raw_write_lock(lock); \
 364        __acquire(lock); \
 365} while (0)
 366
 367#define _spin_unlock_irqrestore(lock, flags) \
 368do { \
 369        _raw_spin_unlock(lock); \
 370        local_irq_restore(flags); \
 371        preempt_enable(); \
 372        __release(lock); \
 373} while (0)
 374
 375#define _spin_unlock_irq(lock) \
 376do { \
 377        _raw_spin_unlock(lock); \
 378        local_irq_enable(); \
 379        preempt_enable(); \
 380        __release(lock); \
 381} while (0)
 382
 383#define _spin_unlock_bh(lock) \
 384do { \
 385        _raw_spin_unlock(lock); \
 386        preempt_enable(); \
 387        local_bh_enable(); \
 388        __release(lock); \
 389} while (0)
 390
 391#define _write_unlock_bh(lock) \
 392do { \
 393        _raw_write_unlock(lock); \
 394        preempt_enable(); \
 395        local_bh_enable(); \
 396        __release(lock); \
 397} while (0)
 398
 399#define _read_unlock_irqrestore(lock, flags) \
 400do { \
 401        _raw_read_unlock(lock); \
 402        local_irq_restore(flags); \
 403        preempt_enable(); \
 404        __release(lock); \
 405} while (0)
 406
 407#define _write_unlock_irqrestore(lock, flags) \
 408do { \
 409        _raw_write_unlock(lock); \
 410        local_irq_restore(flags); \
 411        preempt_enable(); \
 412        __release(lock); \
 413} while (0)
 414
 415#define _read_unlock_irq(lock)  \
 416do { \
 417        _raw_read_unlock(lock); \
 418        local_irq_enable();     \
 419        preempt_enable();       \
 420        __release(lock); \
 421} while (0)
 422
 423#define _read_unlock_bh(lock)   \
 424do { \
 425        _raw_read_unlock(lock); \
 426        local_bh_enable();      \
 427        preempt_enable();       \
 428        __release(lock); \
 429} while (0)
 430
 431#define _write_unlock_irq(lock) \
 432do { \
 433        _raw_write_unlock(lock);        \
 434        local_irq_enable();     \
 435        preempt_enable();       \
 436        __release(lock); \
 437} while (0)
 438
 439#endif /* !SMP */
 440
 441/*
 442 * Define the various spin_lock and rw_lock methods.  Note we define these
 443 * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
 444 * methods are defined as nops in the case they are not required.
 445 */
 446#define spin_trylock(lock)      __cond_lock(_spin_trylock(lock))
 447#define read_trylock(lock)      __cond_lock(_read_trylock(lock))
 448#define write_trylock(lock)     __cond_lock(_write_trylock(lock))
 449
 450#define spin_lock(lock)         _spin_lock(lock)
 451#define write_lock(lock)        _write_lock(lock)
 452#define read_lock(lock)         _read_lock(lock)
 453
 454#ifdef CONFIG_SMP
 455#define spin_lock_irqsave(lock, flags)  flags = _spin_lock_irqsave(lock)
 456#define read_lock_irqsave(lock, flags)  flags = _read_lock_irqsave(lock)
 457#define write_lock_irqsave(lock, flags) flags = _write_lock_irqsave(lock)
 458#else
 459#define spin_lock_irqsave(lock, flags)  _spin_lock_irqsave(lock, flags)
 460#define read_lock_irqsave(lock, flags)  _read_lock_irqsave(lock, flags)
 461#define write_lock_irqsave(lock, flags) _write_lock_irqsave(lock, flags)
 462#endif
 463
 464#define spin_lock_irq(lock)             _spin_lock_irq(lock)
 465#define spin_lock_bh(lock)              _spin_lock_bh(lock)
 466
 467#define read_lock_irq(lock)             _read_lock_irq(lock)
 468#define read_lock_bh(lock)              _read_lock_bh(lock)
 469
 470#define write_lock_irq(lock)            _write_lock_irq(lock)
 471#define write_lock_bh(lock)             _write_lock_bh(lock)
 472
 473#define spin_unlock(lock)       _spin_unlock(lock)
 474#define write_unlock(lock)      _write_unlock(lock)
 475#define read_unlock(lock)       _read_unlock(lock)
 476
 477#define spin_unlock_irqrestore(lock, flags)     _spin_unlock_irqrestore(lock, flags)
 478#define spin_unlock_irq(lock)           _spin_unlock_irq(lock)
 479#define spin_unlock_bh(lock)            _spin_unlock_bh(lock)
 480
 481#define read_unlock_irqrestore(lock, flags)     _read_unlock_irqrestore(lock, flags)
 482#define read_unlock_irq(lock)                   _read_unlock_irq(lock)
 483#define read_unlock_bh(lock)                    _read_unlock_bh(lock)
 484
 485#define write_unlock_irqrestore(lock, flags)    _write_unlock_irqrestore(lock, flags)
 486#define write_unlock_irq(lock)                  _write_unlock_irq(lock)
 487#define write_unlock_bh(lock)                   _write_unlock_bh(lock)
 488
 489#define spin_trylock_bh(lock)                   __cond_lock(_spin_trylock_bh(lock))
 490
 491#define spin_trylock_irq(lock) \
 492({ \
 493        local_irq_disable(); \
 494        _spin_trylock(lock) ? \
 495        1 : ({local_irq_enable(); 0; }); \
 496})
 497
 498#define spin_trylock_irqsave(lock, flags) \
 499({ \
 500        local_irq_save(flags); \
 501        _spin_trylock(lock) ? \
 502        1 : ({local_irq_restore(flags); 0;}); \
 503})
 504
 505#ifdef CONFIG_LOCKMETER
 506extern void _metered_spin_lock   (spinlock_t *lock);
 507extern void _metered_spin_unlock (spinlock_t *lock);
 508extern int  _metered_spin_trylock(spinlock_t *lock);
 509extern void _metered_read_lock    (rwlock_t *lock);
 510extern void _metered_read_unlock  (rwlock_t *lock);
 511extern void _metered_write_lock   (rwlock_t *lock);
 512extern void _metered_write_unlock (rwlock_t *lock);
 513extern int  _metered_read_trylock (rwlock_t *lock);
 514extern int  _metered_write_trylock(rwlock_t *lock);
 515#endif
 516
 517/* "lock on reference count zero" */
 518#ifndef ATOMIC_DEC_AND_LOCK
 519#include <asm/atomic.h>
 520extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
 521#endif
 522
 523#define atomic_dec_and_lock(atomic,lock) __cond_lock(_atomic_dec_and_lock(atomic,lock))
 524
 525/*
 526 *  bit-based spin_lock()
 527 *
 528 * Don't use this unless you really need to: spin_lock() and spin_unlock()
 529 * are significantly faster.
 530 */
 531static inline void bit_spin_lock(int bitnum, unsigned long *addr)
 532{
 533        /*
 534         * Assuming the lock is uncontended, this never enters
 535         * the body of the outer loop. If it is contended, then
 536         * within the inner loop a non-atomic test is used to
 537         * busywait with less bus contention for a good time to
 538         * attempt to acquire the lock bit.
 539         */
 540        preempt_disable();
 541#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
 542        while (test_and_set_bit(bitnum, addr)) {
 543                while (test_bit(bitnum, addr)) {
 544                        preempt_enable();
 545                        cpu_relax();
 546                        preempt_disable();
 547                }
 548        }
 549#endif
 550        __acquire(bitlock);
 551}
 552
 553/*
 554 * Return true if it was acquired
 555 */
 556static inline int bit_spin_trylock(int bitnum, unsigned long *addr)
 557{
 558        preempt_disable();      
 559#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
 560        if (test_and_set_bit(bitnum, addr)) {
 561                preempt_enable();
 562                return 0;
 563        }
 564#endif
 565        __acquire(bitlock);
 566        return 1;
 567}
 568
 569/*
 570 *  bit-based spin_unlock()
 571 */
 572static inline void bit_spin_unlock(int bitnum, unsigned long *addr)
 573{
 574#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
 575        BUG_ON(!test_bit(bitnum, addr));
 576        smp_mb__before_clear_bit();
 577        clear_bit(bitnum, addr);
 578#endif
 579        preempt_enable();
 580        __release(bitlock);
 581}
 582
 583/*
 584 * Return true if the lock is held.
 585 */
 586static inline int bit_spin_is_locked(int bitnum, unsigned long *addr)
 587{
 588#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
 589        return test_bit(bitnum, addr);
 590#elif defined CONFIG_PREEMPT
 591        return preempt_count();
 592#else
 593        return 1;
 594#endif
 595}
 596
 597#define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED
 598#define DEFINE_RWLOCK(x) rwlock_t x = RW_LOCK_UNLOCKED
 599
 600/**
 601 * spin_can_lock - would spin_trylock() succeed?
 602 * @lock: the spinlock in question.
 603 */
 604#define spin_can_lock(lock)             (!spin_is_locked(lock))
 605
 606#endif /* __LINUX_SPINLOCK_H */
 607
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.