Skip to content

Commit

Permalink
Merge branch 'locking-urgent-for-linus' of git://git.kernel.org/pub/s…
Browse files Browse the repository at this point in the history
…cm/linux/kernel/git/tip/tip

Pull locking fixes from Ingo Molnar:

 - Change the new refcount_t warnings from WARN() to WARN_ONCE()

 - two ww_mutex fixes

 - plus a new lockdep self-consistency check for a bug that triggered in
   practice

* 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  locking/ww_mutex: Adjust the lock number for stress test
  locking/lockdep: Add nest_lock integrity test
  locking/ww_mutex: Replace cpu_relax() with cond_resched() for tests
  locking/refcounts: Change WARN() to WARN_ONCE()
  • Loading branch information
torvalds committed Mar 7, 2017
2 parents 26db8f9 + 857811a commit 500e1af
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 12 deletions.
11 changes: 9 additions & 2 deletions kernel/locking/lockdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -3262,10 +3262,17 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
if (depth) {
hlock = curr->held_locks + depth - 1;
if (hlock->class_idx == class_idx && nest_lock) {
if (hlock->references)
if (hlock->references) {
/*
* Check: unsigned int references:12, overflow.
*/
if (DEBUG_LOCKS_WARN_ON(hlock->references == (1 << 12)-1))
return 0;

hlock->references++;
else
} else {
hlock->references = 2;
}

return 1;
}
Expand Down
6 changes: 3 additions & 3 deletions kernel/locking/test-ww_mutex.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static void test_mutex_work(struct work_struct *work)

if (mtx->flags & TEST_MTX_TRY) {
while (!ww_mutex_trylock(&mtx->mutex))
cpu_relax();
cond_resched();
} else {
ww_mutex_lock(&mtx->mutex, NULL);
}
Expand Down Expand Up @@ -88,7 +88,7 @@ static int __test_mutex(unsigned int flags)
ret = -EINVAL;
break;
}
cpu_relax();
cond_resched();
} while (time_before(jiffies, timeout));
} else {
ret = wait_for_completion_timeout(&mtx.done, TIMEOUT);
Expand Down Expand Up @@ -627,7 +627,7 @@ static int __init test_ww_mutex_init(void)
if (ret)
return ret;

ret = stress(4096, hweight32(STRESS_ALL)*ncpus, 1<<12, STRESS_ALL);
ret = stress(4095, hweight32(STRESS_ALL)*ncpus, 1<<12, STRESS_ALL);
if (ret)
return ret;

Expand Down
14 changes: 7 additions & 7 deletions lib/refcount.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,15 @@ bool refcount_add_not_zero(unsigned int i, refcount_t *r)
val = old;
}

WARN(new == UINT_MAX, "refcount_t: saturated; leaking memory.\n");
WARN_ONCE(new == UINT_MAX, "refcount_t: saturated; leaking memory.\n");

return true;
}
EXPORT_SYMBOL_GPL(refcount_add_not_zero);

void refcount_add(unsigned int i, refcount_t *r)
{
WARN(!refcount_add_not_zero(i, r), "refcount_t: addition on 0; use-after-free.\n");
WARN_ONCE(!refcount_add_not_zero(i, r), "refcount_t: addition on 0; use-after-free.\n");
}
EXPORT_SYMBOL_GPL(refcount_add);

Expand Down Expand Up @@ -97,7 +97,7 @@ bool refcount_inc_not_zero(refcount_t *r)
val = old;
}

WARN(new == UINT_MAX, "refcount_t: saturated; leaking memory.\n");
WARN_ONCE(new == UINT_MAX, "refcount_t: saturated; leaking memory.\n");

return true;
}
Expand All @@ -111,7 +111,7 @@ EXPORT_SYMBOL_GPL(refcount_inc_not_zero);
*/
void refcount_inc(refcount_t *r)
{
WARN(!refcount_inc_not_zero(r), "refcount_t: increment on 0; use-after-free.\n");
WARN_ONCE(!refcount_inc_not_zero(r), "refcount_t: increment on 0; use-after-free.\n");
}
EXPORT_SYMBOL_GPL(refcount_inc);

Expand All @@ -125,7 +125,7 @@ bool refcount_sub_and_test(unsigned int i, refcount_t *r)

new = val - i;
if (new > val) {
WARN(new > val, "refcount_t: underflow; use-after-free.\n");
WARN_ONCE(new > val, "refcount_t: underflow; use-after-free.\n");
return false;
}

Expand Down Expand Up @@ -164,7 +164,7 @@ EXPORT_SYMBOL_GPL(refcount_dec_and_test);

void refcount_dec(refcount_t *r)
{
WARN(refcount_dec_and_test(r), "refcount_t: decrement hit 0; leaking memory.\n");
WARN_ONCE(refcount_dec_and_test(r), "refcount_t: decrement hit 0; leaking memory.\n");
}
EXPORT_SYMBOL_GPL(refcount_dec);

Expand Down Expand Up @@ -204,7 +204,7 @@ bool refcount_dec_not_one(refcount_t *r)

new = val - 1;
if (new > val) {
WARN(new > val, "refcount_t: underflow; use-after-free.\n");
WARN_ONCE(new > val, "refcount_t: underflow; use-after-free.\n");
return true;
}

Expand Down

0 comments on commit 500e1af

Please sign in to comment.