Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
lglock.h
Go to the documentation of this file.
1
/*
2
* Specialised local-global spinlock. Can only be declared as global variables
3
* to avoid overhead and keep things simple (and we don't want to start using
4
* these inside dynamically allocated structures).
5
*
6
* "local/global locks" (lglocks) can be used to:
7
*
8
* - Provide fast exclusive access to per-CPU data, with exclusive access to
9
* another CPU's data allowed but possibly subject to contention, and to
10
* provide very slow exclusive access to all per-CPU data.
11
* - Or to provide very fast and scalable read serialisation, and to provide
12
* very slow exclusive serialisation of data (not necessarily per-CPU data).
13
*
14
* Brlocks are also implemented as a short-hand notation for the latter use
15
* case.
16
*
17
* Copyright 2009, 2010, Nick Piggin, Novell Inc.
18
*/
19
#ifndef __LINUX_LGLOCK_H
20
#define __LINUX_LGLOCK_H
21
22
#include <
linux/spinlock.h
>
23
#include <
linux/lockdep.h
>
24
#include <
linux/percpu.h
>
25
#include <
linux/cpu.h
>
26
#include <
linux/notifier.h
>
27
28
/* can make br locks by using local lock for read side, global lock for write */
29
#define br_lock_init(name) lg_lock_init(name, #name)
30
#define br_read_lock(name) lg_local_lock(name)
31
#define br_read_unlock(name) lg_local_unlock(name)
32
#define br_write_lock(name) lg_global_lock(name)
33
#define br_write_unlock(name) lg_global_unlock(name)
34
35
#define DEFINE_BRLOCK(name) DEFINE_LGLOCK(name)
36
#define DEFINE_STATIC_BRLOCK(name) DEFINE_STATIC_LGLOCK(name)
37
38
#ifdef CONFIG_DEBUG_LOCK_ALLOC
39
#define LOCKDEP_INIT_MAP lockdep_init_map
40
#else
41
#define LOCKDEP_INIT_MAP(a, b, c, d)
42
#endif
43
44
struct
lglock
{
45
arch_spinlock_t
__percpu
*
lock
;
46
#ifdef CONFIG_DEBUG_LOCK_ALLOC
47
struct
lock_class_key
lock_key
;
48
struct
lockdep_map lock_dep_map;
49
#endif
50
};
51
52
#define DEFINE_LGLOCK(name) \
53
static DEFINE_PER_CPU(arch_spinlock_t, name ## _lock) \
54
= __ARCH_SPIN_LOCK_UNLOCKED; \
55
struct lglock name = { .lock = &name ## _lock }
56
57
#define DEFINE_STATIC_LGLOCK(name) \
58
static DEFINE_PER_CPU(arch_spinlock_t, name ## _lock) \
59
= __ARCH_SPIN_LOCK_UNLOCKED; \
60
static struct lglock name = { .lock = &name ## _lock }
61
62
void
lg_lock_init
(
struct
lglock
*lg,
char
*
name
);
63
void
lg_local_lock
(
struct
lglock
*lg);
64
void
lg_local_unlock
(
struct
lglock
*lg);
65
void
lg_local_lock_cpu
(
struct
lglock
*lg,
int
cpu
);
66
void
lg_local_unlock_cpu
(
struct
lglock
*lg,
int
cpu
);
67
void
lg_global_lock
(
struct
lglock
*lg);
68
void
lg_global_unlock
(
struct
lglock
*lg);
69
70
#endif
Generated on Thu Jan 10 2013 14:51:47 for Linux Kernel by
1.8.2