Commit 124b5547 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull locking fixes from Ingo Molnar:
 "Three fixes:

    - Fix an rwsem spin-on-owner crash, introduced in v5.4

    - Fix a lockdep bug when running out of stack_trace entries,
      introduced in v5.4

    - Docbook fix"

* 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  locking/rwsem: Fix kernel crash when spinning on RWSEM_OWNER_UNKNOWN
  futex: Fix kernel-doc notation warning
  locking/lockdep: Fix buffer overrun problem in stack_trace[]
parents a1c6f87e 39e7234f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1178,6 +1178,7 @@ out_error:

/**
 * wait_for_owner_exiting - Block until the owner has exited
 * @ret: owner's current futex lock status
 * @exiting:	Pointer to the exiting task
 *
 * Caller must hold a refcount on @exiting.
+3 −4
Original line number Diff line number Diff line
@@ -482,7 +482,7 @@ static struct lock_trace *save_trace(void)
	struct lock_trace *trace, *t2;
	struct hlist_head *hash_head;
	u32 hash;
	unsigned int max_entries;
	int max_entries;

	BUILD_BUG_ON_NOT_POWER_OF_2(STACK_TRACE_HASH_SIZE);
	BUILD_BUG_ON(LOCK_TRACE_SIZE_IN_LONGS >= MAX_STACK_TRACE_ENTRIES);
@@ -490,10 +490,8 @@ static struct lock_trace *save_trace(void)
	trace = (struct lock_trace *)(stack_trace + nr_stack_trace_entries);
	max_entries = MAX_STACK_TRACE_ENTRIES - nr_stack_trace_entries -
		LOCK_TRACE_SIZE_IN_LONGS;
	trace->nr_entries = stack_trace_save(trace->entries, max_entries, 3);

	if (nr_stack_trace_entries >= MAX_STACK_TRACE_ENTRIES -
	    LOCK_TRACE_SIZE_IN_LONGS - 1) {
	if (max_entries <= 0) {
		if (!debug_locks_off_graph_unlock())
			return NULL;

@@ -502,6 +500,7 @@ static struct lock_trace *save_trace(void)

		return NULL;
	}
	trace->nr_entries = stack_trace_save(trace->entries, max_entries, 3);

	hash = jhash(trace->entries, trace->nr_entries *
		     sizeof(trace->entries[0]), 0);
+2 −2
Original line number Diff line number Diff line
@@ -1226,8 +1226,8 @@ wait:
		 * In this case, we attempt to acquire the lock again
		 * without sleeping.
		 */
		if ((wstate == WRITER_HANDOFF) &&
		    (rwsem_spin_on_owner(sem, 0) == OWNER_NULL))
		if (wstate == WRITER_HANDOFF &&
		    rwsem_spin_on_owner(sem, RWSEM_NONSPINNABLE) == OWNER_NULL)
			goto trylock_again;

		/* Block until there are no active lockers. */