android_kernel_sony_sdm845/arch/um/include/asm
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Johannes Berg 20756b7096 um: Silence lockdep complaint about mmap_sem
[ Upstream commit 80bf6ceaf9310b3f61934c69b382d4912deee049 ]

When we get into activate_mm(), lockdep complains that we're doing
something strange:

    WARNING: possible circular locking dependency detected
    5.1.0-10252-gb00152307319-dirty #121 Not tainted
    ------------------------------------------------------
    inside.sh/366 is trying to acquire lock:
    (____ptrval____) (&(&p->alloc_lock)->rlock){+.+.}, at: flush_old_exec+0x703/0x8d7

    but task is already holding lock:
    (____ptrval____) (&mm->mmap_sem){++++}, at: flush_old_exec+0x6c5/0x8d7

    which lock already depends on the new lock.

    the existing dependency chain (in reverse order) is:

    -> #1 (&mm->mmap_sem){++++}:
           [...]
           __lock_acquire+0x12ab/0x139f
           lock_acquire+0x155/0x18e
           down_write+0x3f/0x98
           flush_old_exec+0x748/0x8d7
           load_elf_binary+0x2ca/0xddb
           [...]

    -> #0 (&(&p->alloc_lock)->rlock){+.+.}:
           [...]
           __lock_acquire+0x12ab/0x139f
           lock_acquire+0x155/0x18e
           _raw_spin_lock+0x30/0x83
           flush_old_exec+0x703/0x8d7
           load_elf_binary+0x2ca/0xddb
           [...]

    other info that might help us debug this:

     Possible unsafe locking scenario:

           CPU0                    CPU1
           ----                    ----
      lock(&mm->mmap_sem);
                                   lock(&(&p->alloc_lock)->rlock);
                                   lock(&mm->mmap_sem);
      lock(&(&p->alloc_lock)->rlock);

     *** DEADLOCK ***

    2 locks held by inside.sh/366:
     #0: (____ptrval____) (&sig->cred_guard_mutex){+.+.}, at: __do_execve_file+0x12d/0x869
     #1: (____ptrval____) (&mm->mmap_sem){++++}, at: flush_old_exec+0x6c5/0x8d7

    stack backtrace:
    CPU: 0 PID: 366 Comm: inside.sh Not tainted 5.1.0-10252-gb00152307319-dirty #121
    Stack:
     [...]
    Call Trace:
     [<600420de>] show_stack+0x13b/0x155
     [<6048906b>] dump_stack+0x2a/0x2c
     [<6009ae64>] print_circular_bug+0x332/0x343
     [<6009c5c6>] check_prev_add+0x669/0xdad
     [<600a06b4>] __lock_acquire+0x12ab/0x139f
     [<6009f3d0>] lock_acquire+0x155/0x18e
     [<604a07e0>] _raw_spin_lock+0x30/0x83
     [<60151e6a>] flush_old_exec+0x703/0x8d7
     [<601a8eb8>] load_elf_binary+0x2ca/0xddb
     [...]

I think it's because in exec_mmap() we have

	down_read(&old_mm->mmap_sem);
...
        task_lock(tsk);
...
	activate_mm(active_mm, mm);
	(which does down_write(&mm->mmap_sem))

I'm not really sure why lockdep throws in the whole knowledge
about the task lock, but it seems that old_mm and mm shouldn't
ever be the same (and it doesn't deadlock) so tell lockdep that
they're different.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2019-08-04 09:33:39 +02:00
..
a.out-core.h
bugs.h
cache.h
common.lds.S um: Don't discard .text.exit section 2016-08-23 23:16:16 +02:00
dma.h
fixmap.h um: Remove broken highmem support 2015-04-13 21:01:02 +02:00
hardirq.h um: Do not change hard IRQ flags in soft IRQ processing 2016-01-10 21:49:48 +01:00
irq.h
irqflags.h um: Use asm-generic/irqflags.h 2016-08-04 00:18:04 +02:00
Kbuild Merge branch 'strscpy' of git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile 2015-10-04 16:31:13 +01:00
kmap_types.h
kvm_para.h
mmu.h
mmu_context.h um: Silence lockdep complaint about mmap_sem 2019-08-04 09:33:39 +02:00
page.h um: asm/page.h: remove the pte_high member from struct pte_t 2016-02-05 18:10:40 -08:00
pgalloc.h
pgtable-2level.h mm: make FIRST_USER_ADDRESS unsigned long on all archs 2015-02-11 17:06:03 -08:00
pgtable-3level.h um: kill pfn_t 2016-01-15 17:56:32 -08:00
pgtable.h um: Avoid marking pages with "changed protection" 2019-02-12 19:44:58 +01:00
processor-generic.h um: Remove broken SMP support 2015-04-13 21:00:58 +02:00
ptrace-generic.h um: Define PTRACE_OLDSETOPTIONS 2015-11-06 22:49:09 +01:00
sections.h um: Use char[] for linker script address declarations 2015-05-31 13:14:06 +02:00
setup.h
smp.h um: Remove broken SMP support 2015-04-13 21:00:58 +02:00
stacktrace.h um: Add support for CONFIG_STACKTRACE 2014-10-13 21:46:25 +02:00
syscall-generic.h um: Add full asm/syscall.h support 2016-01-10 21:49:49 +01:00
sysrq.h
thread_info.h um: Fix FP register size for XSTATE/XSAVE 2019-08-04 09:33:31 +02:00
timex.h
tlb.h mm/mmu_gather: track page size with mmu gather and force flush if page size change 2016-07-26 16:19:19 -07:00
tlbflush.h
uaccess.h um: Rework uaccess code 2015-05-31 17:32:36 +02:00