Merge branch 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (32 commits) locking, m68k/asm-offsets: Rename signal defines locking: Inline spinlock code for all locking variants on s390 locking: Simplify spinlock inlining locking: Allow arch-inlined spinlocks locking: Move spinlock function bodies to header file locking, m68k: Calculate thread_info offset with asm offset locking, m68k/asm-offsets: Rename pt_regs offset defines locking, sparc: Rename __spin_try_lock() and friends locking, powerpc: Rename __spin_try_lock() and friends lockdep: Remove recursion stattistics lockdep: Simplify lock_stat seqfile code lockdep: Simplify lockdep_chains seqfile code lockdep: Simplify lockdep seqfile code lockdep: Fix missing entries in /proc/lock_chains lockdep: Fix missing entry in /proc/lock_stat lockdep: Fix memory usage info of BFS lockdep: Reintroduce generation count to make BFS faster lockdep: Deal with many similar locks lockdep: Introduce lockdep_assert_held() lockdep: Fix style nits ...
This commit is contained in:
796
kernel/lockdep.c
796
kernel/lockdep.c
File diff suppressed because it is too large
Load Diff
@@ -91,6 +91,8 @@ extern unsigned int nr_process_chains;
|
||||
extern unsigned int max_lockdep_depth;
|
||||
extern unsigned int max_recursion_depth;
|
||||
|
||||
extern unsigned int max_bfs_queue_depth;
|
||||
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
extern unsigned long lockdep_count_forward_deps(struct lock_class *);
|
||||
extern unsigned long lockdep_count_backward_deps(struct lock_class *);
|
||||
|
@@ -25,38 +25,12 @@
|
||||
|
||||
static void *l_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
struct lock_class *class;
|
||||
|
||||
(*pos)++;
|
||||
|
||||
if (v == SEQ_START_TOKEN)
|
||||
class = m->private;
|
||||
else {
|
||||
class = v;
|
||||
|
||||
if (class->lock_entry.next != &all_lock_classes)
|
||||
class = list_entry(class->lock_entry.next,
|
||||
struct lock_class, lock_entry);
|
||||
else
|
||||
class = NULL;
|
||||
}
|
||||
|
||||
return class;
|
||||
return seq_list_next(v, &all_lock_classes, pos);
|
||||
}
|
||||
|
||||
static void *l_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
struct lock_class *class;
|
||||
loff_t i = 0;
|
||||
|
||||
if (*pos == 0)
|
||||
return SEQ_START_TOKEN;
|
||||
|
||||
list_for_each_entry(class, &all_lock_classes, lock_entry) {
|
||||
if (++i == *pos)
|
||||
return class;
|
||||
}
|
||||
return NULL;
|
||||
return seq_list_start_head(&all_lock_classes, *pos);
|
||||
}
|
||||
|
||||
static void l_stop(struct seq_file *m, void *v)
|
||||
@@ -82,11 +56,11 @@ static void print_name(struct seq_file *m, struct lock_class *class)
|
||||
|
||||
static int l_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct lock_class *class = v;
|
||||
struct lock_class *class = list_entry(v, struct lock_class, lock_entry);
|
||||
struct lock_list *entry;
|
||||
char usage[LOCK_USAGE_CHARS];
|
||||
|
||||
if (v == SEQ_START_TOKEN) {
|
||||
if (v == &all_lock_classes) {
|
||||
seq_printf(m, "all lock classes:\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -128,17 +102,7 @@ static const struct seq_operations lockdep_ops = {
|
||||
|
||||
static int lockdep_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
int res = seq_open(file, &lockdep_ops);
|
||||
if (!res) {
|
||||
struct seq_file *m = file->private_data;
|
||||
|
||||
if (!list_empty(&all_lock_classes))
|
||||
m->private = list_entry(all_lock_classes.next,
|
||||
struct lock_class, lock_entry);
|
||||
else
|
||||
m->private = NULL;
|
||||
}
|
||||
return res;
|
||||
return seq_open(file, &lockdep_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations proc_lockdep_operations = {
|
||||
@@ -149,37 +113,23 @@ static const struct file_operations proc_lockdep_operations = {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
static void *lc_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
struct lock_chain *chain;
|
||||
|
||||
(*pos)++;
|
||||
|
||||
if (v == SEQ_START_TOKEN)
|
||||
chain = m->private;
|
||||
else {
|
||||
chain = v;
|
||||
|
||||
if (*pos < nr_lock_chains)
|
||||
chain = lock_chains + *pos;
|
||||
else
|
||||
chain = NULL;
|
||||
}
|
||||
|
||||
return chain;
|
||||
}
|
||||
|
||||
static void *lc_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
if (*pos == 0)
|
||||
return SEQ_START_TOKEN;
|
||||
|
||||
if (*pos < nr_lock_chains)
|
||||
return lock_chains + *pos;
|
||||
if (*pos - 1 < nr_lock_chains)
|
||||
return lock_chains + (*pos - 1);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void *lc_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
(*pos)++;
|
||||
return lc_start(m, pos);
|
||||
}
|
||||
|
||||
static void lc_stop(struct seq_file *m, void *v)
|
||||
{
|
||||
}
|
||||
@@ -220,16 +170,7 @@ static const struct seq_operations lockdep_chains_ops = {
|
||||
|
||||
static int lockdep_chains_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
int res = seq_open(file, &lockdep_chains_ops);
|
||||
if (!res) {
|
||||
struct seq_file *m = file->private_data;
|
||||
|
||||
if (nr_lock_chains)
|
||||
m->private = lock_chains;
|
||||
else
|
||||
m->private = NULL;
|
||||
}
|
||||
return res;
|
||||
return seq_open(file, &lockdep_chains_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations proc_lockdep_chains_operations = {
|
||||
@@ -258,16 +199,10 @@ static void lockdep_stats_debug_show(struct seq_file *m)
|
||||
debug_atomic_read(&chain_lookup_hits));
|
||||
seq_printf(m, " cyclic checks: %11u\n",
|
||||
debug_atomic_read(&nr_cyclic_checks));
|
||||
seq_printf(m, " cyclic-check recursions: %11u\n",
|
||||
debug_atomic_read(&nr_cyclic_check_recursions));
|
||||
seq_printf(m, " find-mask forwards checks: %11u\n",
|
||||
debug_atomic_read(&nr_find_usage_forwards_checks));
|
||||
seq_printf(m, " find-mask forwards recursions: %11u\n",
|
||||
debug_atomic_read(&nr_find_usage_forwards_recursions));
|
||||
seq_printf(m, " find-mask backwards checks: %11u\n",
|
||||
debug_atomic_read(&nr_find_usage_backwards_checks));
|
||||
seq_printf(m, " find-mask backwards recursions:%11u\n",
|
||||
debug_atomic_read(&nr_find_usage_backwards_recursions));
|
||||
|
||||
seq_printf(m, " hardirq on events: %11u\n", hi1);
|
||||
seq_printf(m, " hardirq off events: %11u\n", hi2);
|
||||
@@ -409,8 +344,10 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
|
||||
nr_unused);
|
||||
seq_printf(m, " max locking depth: %11u\n",
|
||||
max_lockdep_depth);
|
||||
seq_printf(m, " max recursion depth: %11u\n",
|
||||
max_recursion_depth);
|
||||
#ifdef CONFIG_PROVE_LOCKING
|
||||
seq_printf(m, " max bfs queue depth: %11u\n",
|
||||
max_bfs_queue_depth);
|
||||
#endif
|
||||
lockdep_stats_debug_show(m);
|
||||
seq_printf(m, " debug_locks: %11u\n",
|
||||
debug_locks);
|
||||
@@ -438,7 +375,6 @@ struct lock_stat_data {
|
||||
};
|
||||
|
||||
struct lock_stat_seq {
|
||||
struct lock_stat_data *iter;
|
||||
struct lock_stat_data *iter_end;
|
||||
struct lock_stat_data stats[MAX_LOCKDEP_KEYS];
|
||||
};
|
||||
@@ -626,34 +562,22 @@ static void seq_header(struct seq_file *m)
|
||||
static void *ls_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
struct lock_stat_seq *data = m->private;
|
||||
struct lock_stat_data *iter;
|
||||
|
||||
if (*pos == 0)
|
||||
return SEQ_START_TOKEN;
|
||||
|
||||
data->iter = data->stats + *pos;
|
||||
if (data->iter >= data->iter_end)
|
||||
data->iter = NULL;
|
||||
iter = data->stats + (*pos - 1);
|
||||
if (iter >= data->iter_end)
|
||||
iter = NULL;
|
||||
|
||||
return data->iter;
|
||||
return iter;
|
||||
}
|
||||
|
||||
static void *ls_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
struct lock_stat_seq *data = m->private;
|
||||
|
||||
(*pos)++;
|
||||
|
||||
if (v == SEQ_START_TOKEN)
|
||||
data->iter = data->stats;
|
||||
else {
|
||||
data->iter = v;
|
||||
data->iter++;
|
||||
}
|
||||
|
||||
if (data->iter == data->iter_end)
|
||||
data->iter = NULL;
|
||||
|
||||
return data->iter;
|
||||
return ls_start(m, pos);
|
||||
}
|
||||
|
||||
static void ls_stop(struct seq_file *m, void *v)
|
||||
@@ -691,7 +615,6 @@ static int lock_stat_open(struct inode *inode, struct file *file)
|
||||
struct lock_stat_data *iter = data->stats;
|
||||
struct seq_file *m = file->private_data;
|
||||
|
||||
data->iter = iter;
|
||||
list_for_each_entry(class, &all_lock_classes, lock_entry) {
|
||||
iter->class = class;
|
||||
iter->stats = lock_stats(class);
|
||||
@@ -699,7 +622,7 @@ static int lock_stat_open(struct inode *inode, struct file *file)
|
||||
}
|
||||
data->iter_end = iter;
|
||||
|
||||
sort(data->stats, data->iter_end - data->iter,
|
||||
sort(data->stats, data->iter_end - data->stats,
|
||||
sizeof(struct lock_stat_data),
|
||||
lock_stat_cmp, NULL);
|
||||
|
||||
@@ -734,7 +657,6 @@ static int lock_stat_release(struct inode *inode, struct file *file)
|
||||
struct seq_file *seq = file->private_data;
|
||||
|
||||
vfree(seq->private);
|
||||
seq->private = NULL;
|
||||
return seq_release(inode, file);
|
||||
}
|
||||
|
||||
|
@@ -6609,6 +6609,8 @@ int cond_resched_lock(spinlock_t *lock)
|
||||
int resched = should_resched();
|
||||
int ret = 0;
|
||||
|
||||
lockdep_assert_held(lock);
|
||||
|
||||
if (spin_needbreak(lock) || resched) {
|
||||
spin_unlock(lock);
|
||||
if (resched)
|
||||
|
@@ -21,44 +21,29 @@
|
||||
#include <linux/debug_locks.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#ifndef _spin_trylock
|
||||
int __lockfunc _spin_trylock(spinlock_t *lock)
|
||||
{
|
||||
preempt_disable();
|
||||
if (_raw_spin_trylock(lock)) {
|
||||
spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
|
||||
return 1;
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
return 0;
|
||||
return __spin_trylock(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_trylock);
|
||||
#endif
|
||||
|
||||
#ifndef _read_trylock
|
||||
int __lockfunc _read_trylock(rwlock_t *lock)
|
||||
{
|
||||
preempt_disable();
|
||||
if (_raw_read_trylock(lock)) {
|
||||
rwlock_acquire_read(&lock->dep_map, 0, 1, _RET_IP_);
|
||||
return 1;
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
return 0;
|
||||
return __read_trylock(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_trylock);
|
||||
#endif
|
||||
|
||||
#ifndef _write_trylock
|
||||
int __lockfunc _write_trylock(rwlock_t *lock)
|
||||
{
|
||||
preempt_disable();
|
||||
if (_raw_write_trylock(lock)) {
|
||||
rwlock_acquire(&lock->dep_map, 0, 1, _RET_IP_);
|
||||
return 1;
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
return 0;
|
||||
return __write_trylock(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_trylock);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If lockdep is enabled then we use the non-preemption spin-ops
|
||||
@@ -67,132 +52,101 @@ EXPORT_SYMBOL(_write_trylock);
|
||||
*/
|
||||
#if !defined(CONFIG_GENERIC_LOCKBREAK) || defined(CONFIG_DEBUG_LOCK_ALLOC)
|
||||
|
||||
#ifndef _read_lock
|
||||
void __lockfunc _read_lock(rwlock_t *lock)
|
||||
{
|
||||
preempt_disable();
|
||||
rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock);
|
||||
__read_lock(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_lock);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_lock_irqsave
|
||||
unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
preempt_disable();
|
||||
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
/*
|
||||
* On lockdep we dont want the hand-coded irq-enable of
|
||||
* _raw_spin_lock_flags() code, because lockdep assumes
|
||||
* that interrupts are not re-enabled during lock-acquire:
|
||||
*/
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
|
||||
#else
|
||||
_raw_spin_lock_flags(lock, &flags);
|
||||
#endif
|
||||
return flags;
|
||||
return __spin_lock_irqsave(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_lock_irqsave);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_lock_irq
|
||||
void __lockfunc _spin_lock_irq(spinlock_t *lock)
|
||||
{
|
||||
local_irq_disable();
|
||||
preempt_disable();
|
||||
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
|
||||
__spin_lock_irq(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_lock_irq);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_lock_bh
|
||||
void __lockfunc _spin_lock_bh(spinlock_t *lock)
|
||||
{
|
||||
local_bh_disable();
|
||||
preempt_disable();
|
||||
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
|
||||
__spin_lock_bh(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_lock_bh);
|
||||
#endif
|
||||
|
||||
#ifndef _read_lock_irqsave
|
||||
unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
preempt_disable();
|
||||
rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED_FLAGS(lock, _raw_read_trylock, _raw_read_lock,
|
||||
_raw_read_lock_flags, &flags);
|
||||
return flags;
|
||||
return __read_lock_irqsave(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_lock_irqsave);
|
||||
#endif
|
||||
|
||||
#ifndef _read_lock_irq
|
||||
void __lockfunc _read_lock_irq(rwlock_t *lock)
|
||||
{
|
||||
local_irq_disable();
|
||||
preempt_disable();
|
||||
rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock);
|
||||
__read_lock_irq(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_lock_irq);
|
||||
#endif
|
||||
|
||||
#ifndef _read_lock_bh
|
||||
void __lockfunc _read_lock_bh(rwlock_t *lock)
|
||||
{
|
||||
local_bh_disable();
|
||||
preempt_disable();
|
||||
rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock);
|
||||
__read_lock_bh(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_lock_bh);
|
||||
#endif
|
||||
|
||||
#ifndef _write_lock_irqsave
|
||||
unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
preempt_disable();
|
||||
rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED_FLAGS(lock, _raw_write_trylock, _raw_write_lock,
|
||||
_raw_write_lock_flags, &flags);
|
||||
return flags;
|
||||
return __write_lock_irqsave(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_lock_irqsave);
|
||||
#endif
|
||||
|
||||
#ifndef _write_lock_irq
|
||||
void __lockfunc _write_lock_irq(rwlock_t *lock)
|
||||
{
|
||||
local_irq_disable();
|
||||
preempt_disable();
|
||||
rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock);
|
||||
__write_lock_irq(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_lock_irq);
|
||||
#endif
|
||||
|
||||
#ifndef _write_lock_bh
|
||||
void __lockfunc _write_lock_bh(rwlock_t *lock)
|
||||
{
|
||||
local_bh_disable();
|
||||
preempt_disable();
|
||||
rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock);
|
||||
__write_lock_bh(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_lock_bh);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_lock
|
||||
void __lockfunc _spin_lock(spinlock_t *lock)
|
||||
{
|
||||
preempt_disable();
|
||||
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
|
||||
__spin_lock(lock);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(_spin_lock);
|
||||
#endif
|
||||
|
||||
#ifndef _write_lock
|
||||
void __lockfunc _write_lock(rwlock_t *lock)
|
||||
{
|
||||
preempt_disable();
|
||||
rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_);
|
||||
LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock);
|
||||
__write_lock(lock);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(_write_lock);
|
||||
#endif
|
||||
|
||||
#else /* CONFIG_PREEMPT: */
|
||||
|
||||
@@ -318,125 +272,109 @@ EXPORT_SYMBOL(_spin_lock_nest_lock);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef _spin_unlock
|
||||
void __lockfunc _spin_unlock(spinlock_t *lock)
|
||||
{
|
||||
spin_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_spin_unlock(lock);
|
||||
preempt_enable();
|
||||
__spin_unlock(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_unlock);
|
||||
#endif
|
||||
|
||||
#ifndef _write_unlock
|
||||
void __lockfunc _write_unlock(rwlock_t *lock)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_write_unlock(lock);
|
||||
preempt_enable();
|
||||
__write_unlock(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_unlock);
|
||||
#endif
|
||||
|
||||
#ifndef _read_unlock
|
||||
void __lockfunc _read_unlock(rwlock_t *lock)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_read_unlock(lock);
|
||||
preempt_enable();
|
||||
__read_unlock(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_unlock);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_unlock_irqrestore
|
||||
void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
|
||||
{
|
||||
spin_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_spin_unlock(lock);
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
__spin_unlock_irqrestore(lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_unlock_irqrestore);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_unlock_irq
|
||||
void __lockfunc _spin_unlock_irq(spinlock_t *lock)
|
||||
{
|
||||
spin_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_spin_unlock(lock);
|
||||
local_irq_enable();
|
||||
preempt_enable();
|
||||
__spin_unlock_irq(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_unlock_irq);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_unlock_bh
|
||||
void __lockfunc _spin_unlock_bh(spinlock_t *lock)
|
||||
{
|
||||
spin_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_spin_unlock(lock);
|
||||
preempt_enable_no_resched();
|
||||
local_bh_enable_ip((unsigned long)__builtin_return_address(0));
|
||||
__spin_unlock_bh(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_unlock_bh);
|
||||
#endif
|
||||
|
||||
#ifndef _read_unlock_irqrestore
|
||||
void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_read_unlock(lock);
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
__read_unlock_irqrestore(lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_unlock_irqrestore);
|
||||
#endif
|
||||
|
||||
#ifndef _read_unlock_irq
|
||||
void __lockfunc _read_unlock_irq(rwlock_t *lock)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_read_unlock(lock);
|
||||
local_irq_enable();
|
||||
preempt_enable();
|
||||
__read_unlock_irq(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_unlock_irq);
|
||||
#endif
|
||||
|
||||
#ifndef _read_unlock_bh
|
||||
void __lockfunc _read_unlock_bh(rwlock_t *lock)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_read_unlock(lock);
|
||||
preempt_enable_no_resched();
|
||||
local_bh_enable_ip((unsigned long)__builtin_return_address(0));
|
||||
__read_unlock_bh(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_read_unlock_bh);
|
||||
#endif
|
||||
|
||||
#ifndef _write_unlock_irqrestore
|
||||
void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_write_unlock(lock);
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
__write_unlock_irqrestore(lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_unlock_irqrestore);
|
||||
#endif
|
||||
|
||||
#ifndef _write_unlock_irq
|
||||
void __lockfunc _write_unlock_irq(rwlock_t *lock)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_write_unlock(lock);
|
||||
local_irq_enable();
|
||||
preempt_enable();
|
||||
__write_unlock_irq(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_unlock_irq);
|
||||
#endif
|
||||
|
||||
#ifndef _write_unlock_bh
|
||||
void __lockfunc _write_unlock_bh(rwlock_t *lock)
|
||||
{
|
||||
rwlock_release(&lock->dep_map, 1, _RET_IP_);
|
||||
_raw_write_unlock(lock);
|
||||
preempt_enable_no_resched();
|
||||
local_bh_enable_ip((unsigned long)__builtin_return_address(0));
|
||||
__write_unlock_bh(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_write_unlock_bh);
|
||||
#endif
|
||||
|
||||
#ifndef _spin_trylock_bh
|
||||
int __lockfunc _spin_trylock_bh(spinlock_t *lock)
|
||||
{
|
||||
local_bh_disable();
|
||||
preempt_disable();
|
||||
if (_raw_spin_trylock(lock)) {
|
||||
spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
|
||||
return 1;
|
||||
}
|
||||
|
||||
preempt_enable_no_resched();
|
||||
local_bh_enable_ip((unsigned long)__builtin_return_address(0));
|
||||
return 0;
|
||||
return __spin_trylock_bh(lock);
|
||||
}
|
||||
EXPORT_SYMBOL(_spin_trylock_bh);
|
||||
#endif
|
||||
|
||||
notrace int in_lock_functions(unsigned long addr)
|
||||
{
|
||||
|
Reference in New Issue
Block a user