The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kernel/lglock.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* See include/linux/lglock.h for description */
    2 #include <linux/module.h>
    3 #include <linux/lglock.h>
    4 #include <linux/cpu.h>
    5 #include <linux/string.h>
    6 
    7 /*
    8  * Note there is no uninit, so lglocks cannot be defined in
    9  * modules (but it's fine to use them from there)
   10  * Could be added though, just undo lg_lock_init
   11  */
   12 
   13 void lg_lock_init(struct lglock *lg, char *name)
   14 {
   15         LOCKDEP_INIT_MAP(&lg->lock_dep_map, name, &lg->lock_key, 0);
   16 }
   17 EXPORT_SYMBOL(lg_lock_init);
   18 
   19 void lg_local_lock(struct lglock *lg)
   20 {
   21         arch_spinlock_t *lock;
   22 
   23         preempt_disable();
   24         rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_);
   25         lock = this_cpu_ptr(lg->lock);
   26         arch_spin_lock(lock);
   27 }
   28 EXPORT_SYMBOL(lg_local_lock);
   29 
   30 void lg_local_unlock(struct lglock *lg)
   31 {
   32         arch_spinlock_t *lock;
   33 
   34         rwlock_release(&lg->lock_dep_map, 1, _RET_IP_);
   35         lock = this_cpu_ptr(lg->lock);
   36         arch_spin_unlock(lock);
   37         preempt_enable();
   38 }
   39 EXPORT_SYMBOL(lg_local_unlock);
   40 
   41 void lg_local_lock_cpu(struct lglock *lg, int cpu)
   42 {
   43         arch_spinlock_t *lock;
   44 
   45         preempt_disable();
   46         rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_);
   47         lock = per_cpu_ptr(lg->lock, cpu);
   48         arch_spin_lock(lock);
   49 }
   50 EXPORT_SYMBOL(lg_local_lock_cpu);
   51 
   52 void lg_local_unlock_cpu(struct lglock *lg, int cpu)
   53 {
   54         arch_spinlock_t *lock;
   55 
   56         rwlock_release(&lg->lock_dep_map, 1, _RET_IP_);
   57         lock = per_cpu_ptr(lg->lock, cpu);
   58         arch_spin_unlock(lock);
   59         preempt_enable();
   60 }
   61 EXPORT_SYMBOL(lg_local_unlock_cpu);
   62 
   63 void lg_global_lock(struct lglock *lg)
   64 {
   65         int i;
   66 
   67         preempt_disable();
   68         rwlock_acquire(&lg->lock_dep_map, 0, 0, _RET_IP_);
   69         for_each_possible_cpu(i) {
   70                 arch_spinlock_t *lock;
   71                 lock = per_cpu_ptr(lg->lock, i);
   72                 arch_spin_lock(lock);
   73         }
   74 }
   75 EXPORT_SYMBOL(lg_global_lock);
   76 
   77 void lg_global_unlock(struct lglock *lg)
   78 {
   79         int i;
   80 
   81         rwlock_release(&lg->lock_dep_map, 1, _RET_IP_);
   82         for_each_possible_cpu(i) {
   83                 arch_spinlock_t *lock;
   84                 lock = per_cpu_ptr(lg->lock, i);
   85                 arch_spin_unlock(lock);
   86         }
   87         preempt_enable();
   88 }
   89 EXPORT_SYMBOL(lg_global_unlock);

Cache object: 5fad641c282fbc1265f606cb7b7505aa


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.