All new accounts created on Gitlab now require administrator approval. If you invite any collaborators, please let Flux staff know so they can approve the accounts.

Commit 1e57c218 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'core-fixes-for-linus' of...

Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  lockdep: Avoid out of bounds array reference in save_trace()
  futex: Take mmap_sem for get_user_pages in fault_in_user_writeable
  lockstat: Add usage info to Documentation/lockstat.txt
  lockstat: Fix min, max times in /proc/lock_stats
parents 75630098 ea5b41f9
...@@ -62,8 +62,20 @@ applicable). ...@@ -62,8 +62,20 @@ applicable).
It also tracks 4 contention points per class. A contention point is a call site It also tracks 4 contention points per class. A contention point is a call site
that had to wait on lock acquisition. that had to wait on lock acquisition.
- CONFIGURATION
Lock statistics are enabled via CONFIG_LOCK_STATS.
- USAGE - USAGE
Enable collection of statistics:
# echo 1 >/proc/sys/kernel/lock_stat
Disable collection of statistics:
# echo 0 >/proc/sys/kernel/lock_stat
Look at the current lock statistics: Look at the current lock statistics:
( line numbers not part of actual output, done for clarity in the explanation ( line numbers not part of actual output, done for clarity in the explanation
......
...@@ -304,8 +304,14 @@ void put_futex_key(int fshared, union futex_key *key) ...@@ -304,8 +304,14 @@ void put_futex_key(int fshared, union futex_key *key)
*/ */
static int fault_in_user_writeable(u32 __user *uaddr) static int fault_in_user_writeable(u32 __user *uaddr)
{ {
int ret = get_user_pages(current, current->mm, (unsigned long)uaddr, struct mm_struct *mm = current->mm;
1, 1, 0, NULL, NULL); int ret;
down_read(&mm->mmap_sem);
ret = get_user_pages(current, mm, (unsigned long)uaddr,
1, 1, 0, NULL, NULL);
up_read(&mm->mmap_sem);
return ret < 0 ? ret : 0; return ret < 0 ? ret : 0;
} }
......
...@@ -168,7 +168,7 @@ static void lock_time_inc(struct lock_time *lt, u64 time) ...@@ -168,7 +168,7 @@ static void lock_time_inc(struct lock_time *lt, u64 time)
if (time > lt->max) if (time > lt->max)
lt->max = time; lt->max = time;
if (time < lt->min || !lt->min) if (time < lt->min || !lt->nr)
lt->min = time; lt->min = time;
lt->total += time; lt->total += time;
...@@ -177,8 +177,15 @@ static void lock_time_inc(struct lock_time *lt, u64 time) ...@@ -177,8 +177,15 @@ static void lock_time_inc(struct lock_time *lt, u64 time)
static inline void lock_time_add(struct lock_time *src, struct lock_time *dst) static inline void lock_time_add(struct lock_time *src, struct lock_time *dst)
{ {
dst->min += src->min; if (!src->nr)
dst->max += src->max; return;
if (src->max > dst->max)
dst->max = src->max;
if (src->min < dst->min || !dst->nr)
dst->min = src->min;
dst->total += src->total; dst->total += src->total;
dst->nr += src->nr; dst->nr += src->nr;
} }
...@@ -379,7 +386,8 @@ static int save_trace(struct stack_trace *trace) ...@@ -379,7 +386,8 @@ static int save_trace(struct stack_trace *trace)
* complete trace that maxes out the entries provided will be reported * complete trace that maxes out the entries provided will be reported
* as incomplete, friggin useless </rant> * as incomplete, friggin useless </rant>
*/ */
if (trace->entries[trace->nr_entries-1] == ULONG_MAX) if (trace->nr_entries != 0 &&
trace->entries[trace->nr_entries-1] == ULONG_MAX)
trace->nr_entries--; trace->nr_entries--;
trace->max_entries = trace->nr_entries; trace->max_entries = trace->nr_entries;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment