git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sched: fix buddie group latency
[pandora-kernel.git]
/
kernel
/
lockdep.c
diff --git
a/kernel/lockdep.c
b/kernel/lockdep.c
index
74b1878
..
06b0c35
100644
(file)
--- a/
kernel/lockdep.c
+++ b/
kernel/lockdep.c
@@
-137,16
+137,16
@@
static inline struct lock_class *hlock_class(struct held_lock *hlock)
#ifdef CONFIG_LOCK_STAT
static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], lock_stats);
#ifdef CONFIG_LOCK_STAT
static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], lock_stats);
-static int lock_
contention_point(struct lock_class *class
, unsigned long ip)
+static int lock_
point(unsigned long points[]
, unsigned long ip)
{
int i;
{
int i;
- for (i = 0; i <
ARRAY_SIZE(class->contention_point)
; i++) {
- if (
class->contention_point
[i] == 0) {
-
class->contention_point
[i] = ip;
+ for (i = 0; i <
LOCKSTAT_POINTS
; i++) {
+ if (
points
[i] == 0) {
+
points
[i] = ip;
break;
}
break;
}
- if (
class->contention_point
[i] == ip)
+ if (
points
[i] == ip)
break;
}
break;
}
@@
-186,6
+186,9
@@
struct lock_class_stats lock_stats(struct lock_class *class)
for (i = 0; i < ARRAY_SIZE(stats.contention_point); i++)
stats.contention_point[i] += pcs->contention_point[i];
for (i = 0; i < ARRAY_SIZE(stats.contention_point); i++)
stats.contention_point[i] += pcs->contention_point[i];
+ for (i = 0; i < ARRAY_SIZE(stats.contending_point); i++)
+ stats.contending_point[i] += pcs->contending_point[i];
+
lock_time_add(&pcs->read_waittime, &stats.read_waittime);
lock_time_add(&pcs->write_waittime, &stats.write_waittime);
lock_time_add(&pcs->read_waittime, &stats.read_waittime);
lock_time_add(&pcs->write_waittime, &stats.write_waittime);
@@
-210,6
+213,7
@@
void clear_lock_stats(struct lock_class *class)
memset(cpu_stats, 0, sizeof(struct lock_class_stats));
}
memset(class->contention_point, 0, sizeof(class->contention_point));
memset(cpu_stats, 0, sizeof(struct lock_class_stats));
}
memset(class->contention_point, 0, sizeof(class->contention_point));
+ memset(class->contending_point, 0, sizeof(class->contending_point));
}
static struct lock_class_stats *get_lock_stats(struct lock_class *class)
}
static struct lock_class_stats *get_lock_stats(struct lock_class *class)
@@
-288,14
+292,12
@@
void lockdep_off(void)
{
current->lockdep_recursion++;
}
{
current->lockdep_recursion++;
}
-
EXPORT_SYMBOL(lockdep_off);
void lockdep_on(void)
{
current->lockdep_recursion--;
}
EXPORT_SYMBOL(lockdep_off);
void lockdep_on(void)
{
current->lockdep_recursion--;
}
-
EXPORT_SYMBOL(lockdep_on);
/*
EXPORT_SYMBOL(lockdep_on);
/*
@@
-577,7
+579,8
@@
static void print_lock_class_header(struct lock_class *class, int depth)
/*
* printk all lock dependencies starting at <entry>:
*/
/*
* printk all lock dependencies starting at <entry>:
*/
-static void print_lock_dependencies(struct lock_class *class, int depth)
+static void __used
+print_lock_dependencies(struct lock_class *class, int depth)
{
struct lock_list *entry;
{
struct lock_list *entry;
@@
-2509,7
+2512,6
@@
void lockdep_init_map(struct lockdep_map *lock, const char *name,
if (subclass)
register_lock_class(lock, subclass, 1);
}
if (subclass)
register_lock_class(lock, subclass, 1);
}
-
EXPORT_SYMBOL_GPL(lockdep_init_map);
/*
EXPORT_SYMBOL_GPL(lockdep_init_map);
/*
@@
-2690,8
+2692,9
@@
static int check_unlock(struct task_struct *curr, struct lockdep_map *lock,
}
static int
}
static int
-__lock_set_subclass(struct lockdep_map *lock,
- unsigned int subclass, unsigned long ip)
+__lock_set_class(struct lockdep_map *lock, const char *name,
+ struct lock_class_key *key, unsigned int subclass,
+ unsigned long ip)
{
struct task_struct *curr = current;
struct held_lock *hlock, *prev_hlock;
{
struct task_struct *curr = current;
struct held_lock *hlock, *prev_hlock;
@@
-2718,6
+2721,7
@@
__lock_set_subclass(struct lockdep_map *lock,
return print_unlock_inbalance_bug(curr, lock, ip);
found_it:
return print_unlock_inbalance_bug(curr, lock, ip);
found_it:
+ lockdep_init_map(lock, name, key, 0);
class = register_lock_class(lock, subclass, 0);
hlock->class_idx = class - lock_classes + 1;
class = register_lock_class(lock, subclass, 0);
hlock->class_idx = class - lock_classes + 1;
@@
-2902,9
+2906,9
@@
static void check_flags(unsigned long flags)
#endif
}
#endif
}
-void
-
lock_set_subclass(struct lockdep_map *lock
,
-
unsigned int subclass,
unsigned long ip)
+void
lock_set_class(struct lockdep_map *lock, const char *name,
+
struct lock_class_key *key, unsigned int subclass
,
+
unsigned long ip)
{
unsigned long flags;
{
unsigned long flags;
@@
-2914,13
+2918,12
@@
lock_set_subclass(struct lockdep_map *lock,
raw_local_irq_save(flags);
current->lockdep_recursion = 1;
check_flags(flags);
raw_local_irq_save(flags);
current->lockdep_recursion = 1;
check_flags(flags);
- if (__lock_set_
subclass(lock
, subclass, ip))
+ if (__lock_set_
class(lock, name, key
, subclass, ip))
check_chain_key(current);
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
check_chain_key(current);
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
-
-EXPORT_SYMBOL_GPL(lock_set_subclass);
+EXPORT_SYMBOL_GPL(lock_set_class);
/*
* We are not always called with irqs disabled - do that here,
/*
* We are not always called with irqs disabled - do that here,
@@
-2944,7
+2947,6
@@
void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
-
EXPORT_SYMBOL_GPL(lock_acquire);
void lock_release(struct lockdep_map *lock, int nested,
EXPORT_SYMBOL_GPL(lock_acquire);
void lock_release(struct lockdep_map *lock, int nested,
@@
-2962,7
+2964,6
@@
void lock_release(struct lockdep_map *lock, int nested,
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
-
EXPORT_SYMBOL_GPL(lock_release);
#ifdef CONFIG_LOCK_STAT
EXPORT_SYMBOL_GPL(lock_release);
#ifdef CONFIG_LOCK_STAT
@@
-3000,7
+3001,7
@@
__lock_contended(struct lockdep_map *lock, unsigned long ip)
struct held_lock *hlock, *prev_hlock;
struct lock_class_stats *stats;
unsigned int depth;
struct held_lock *hlock, *prev_hlock;
struct lock_class_stats *stats;
unsigned int depth;
- int i, point;
+ int i,
contention_point, contending_
point;
depth = curr->lockdep_depth;
if (DEBUG_LOCKS_WARN_ON(!depth))
depth = curr->lockdep_depth;
if (DEBUG_LOCKS_WARN_ON(!depth))
@@
-3024,18
+3025,22
@@
__lock_contended(struct lockdep_map *lock, unsigned long ip)
found_it:
hlock->waittime_stamp = sched_clock();
found_it:
hlock->waittime_stamp = sched_clock();
- point = lock_contention_point(hlock_class(hlock), ip);
+ contention_point = lock_point(hlock_class(hlock)->contention_point, ip);
+ contending_point = lock_point(hlock_class(hlock)->contending_point,
+ lock->ip);
stats = get_lock_stats(hlock_class(hlock));
stats = get_lock_stats(hlock_class(hlock));
- if (point < ARRAY_SIZE(stats->contention_point))
- stats->contention_point[point]++;
+ if (contention_point < LOCKSTAT_POINTS)
+ stats->contention_point[contention_point]++;
+ if (contending_point < LOCKSTAT_POINTS)
+ stats->contending_point[contending_point]++;
if (lock->cpu != smp_processor_id())
stats->bounces[bounce_contended + !!hlock->read]++;
put_lock_stats(stats);
}
static void
if (lock->cpu != smp_processor_id())
stats->bounces[bounce_contended + !!hlock->read]++;
put_lock_stats(stats);
}
static void
-__lock_acquired(struct lockdep_map *lock)
+__lock_acquired(struct lockdep_map *lock
, unsigned long ip
)
{
struct task_struct *curr = current;
struct held_lock *hlock, *prev_hlock;
{
struct task_struct *curr = current;
struct held_lock *hlock, *prev_hlock;
@@
-3084,6
+3089,7
@@
found_it:
put_lock_stats(stats);
lock->cpu = cpu;
put_lock_stats(stats);
lock->cpu = cpu;
+ lock->ip = ip;
}
void lock_contended(struct lockdep_map *lock, unsigned long ip)
}
void lock_contended(struct lockdep_map *lock, unsigned long ip)
@@
-3105,7
+3111,7
@@
void lock_contended(struct lockdep_map *lock, unsigned long ip)
}
EXPORT_SYMBOL_GPL(lock_contended);
}
EXPORT_SYMBOL_GPL(lock_contended);
-void lock_acquired(struct lockdep_map *lock)
+void lock_acquired(struct lockdep_map *lock
, unsigned long ip
)
{
unsigned long flags;
{
unsigned long flags;
@@
-3118,7
+3124,7
@@
void lock_acquired(struct lockdep_map *lock)
raw_local_irq_save(flags);
check_flags(flags);
current->lockdep_recursion = 1;
raw_local_irq_save(flags);
check_flags(flags);
current->lockdep_recursion = 1;
- __lock_acquired(lock);
+ __lock_acquired(lock
, ip
);
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
current->lockdep_recursion = 0;
raw_local_irq_restore(flags);
}
@@
-3442,7
+3448,6
@@
retry:
if (unlock)
read_unlock(&tasklist_lock);
}
if (unlock)
read_unlock(&tasklist_lock);
}
-
EXPORT_SYMBOL_GPL(debug_show_all_locks);
/*
EXPORT_SYMBOL_GPL(debug_show_all_locks);
/*
@@
-3463,7
+3468,6
@@
void debug_show_held_locks(struct task_struct *task)
{
__debug_show_held_locks(task);
}
{
__debug_show_held_locks(task);
}
-
EXPORT_SYMBOL_GPL(debug_show_held_locks);
void lockdep_sys_exit(void)
EXPORT_SYMBOL_GPL(debug_show_held_locks);
void lockdep_sys_exit(void)