android_kernel_xiaomi_sm8350/arch/x86/mm
Linus Torvalds 891cffbd6b x86/mm: do not trigger a kernel warning if user-space disables interrupts and generates a page fault
Arjan reported a spike in the following bug pattern in v2.6.27:

   http://www.kerneloops.org/searchweek.php?search=lock_page

which happens because hwclock started triggering warnings due to
a (correct) might_sleep() check in the MM code.

The warning occurs because hwclock uses this dubious sequence of
code to run "atomic" code:

  static unsigned long
  atomic(const char *name, unsigned long (*op)(unsigned long),
         unsigned long arg)
  {
    unsigned long v;
    __asm__ volatile ("cli");
    v = (*op)(arg);
    __asm__ volatile ("sti");
    return v;
  }

Then it pagefaults in that "atomic" section, triggering the warning.

There is no way the kernel could provide "atomicity" in this path,
a page fault is a cannot-continue machine event so the kernel has to
wait for the page to be filled in.

Even if it was just a minor fault we'd have to take locks and might have
to spend quite a bit of time with interrupts disabled - not nice to irq
latencies in general.

So instead just enable interrupts in the pagefault path unconditionally
if we come from user-space, and handle the fault.

Also, while touching this code, unify some trivial parts of the x86
VM paths at the same time.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Reported-by: Arjan van de Ven <arjan@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-10-13 17:46:39 +02:00
..
discontig_32.c x86: convert discontig_32.c from round_up to roundup 2008-07-26 15:39:22 +02:00
dump_pagetables.c x86: another user of PTE_FLAGS_MASK 2008-08-20 12:38:41 +02:00
extable.c
fault.c x86/mm: do not trigger a kernel warning if user-space disables interrupts and generates a page fault 2008-10-13 17:46:39 +02:00
gup.c Fix 'get_user_pages_fast()' with non-page-aligned start address 2008-07-28 17:54:21 -07:00
highmem_32.c
hugetlbpage.c x86: add hugepagesz option on 64-bit 2008-07-24 10:47:19 -07:00
init_32.c x86: memory corruption check - cleanup 2008-10-12 15:09:23 +02:00
init_64.c x86: memory corruption check - cleanup 2008-10-12 15:09:23 +02:00
ioremap.c Merge branches 'x86/xen', 'x86/build', 'x86/microcode', 'x86/mm-debug-v2', 'x86/memory-corruption-check', 'x86/early-printk', 'x86/xsave', 'x86/ptrace-v2', 'x86/quirks', 'x86/setup', 'x86/spinlocks' and 'x86/signal' into x86/core-v2 2008-10-12 15:50:02 +02:00
k8topology_64.c x86: remove end_pfn in 64bit 2008-07-08 13:10:38 +02:00
kmmio.c - fix mmioftrace + rcu merge interaction 2008-05-25 09:51:43 +02:00
Makefile mm: Make generic weak get_user_pages_fast and EXPORT_GPL it 2008-08-12 17:52:53 +10:00
memtest.c x86: seperate memtest from init_64.c 2008-07-18 14:10:27 +02:00
mmap.c
mmio-mod.c x86, mmiotrace: silence section mismatch warning - leave_uniprocessor 2008-08-21 12:35:16 +02:00
numa_64.c x86: convert numa_64.c from round_up to roundup 2008-07-26 15:39:21 +02:00
pageattr-test.c x86: make sure the CPA test code's use of _PAGE_UNUSED1 is obvious 2008-09-05 17:09:57 +02:00
pageattr.c Merge branch 'linus' into x86/pat2 2008-10-10 19:30:08 +02:00
pat.c x86, pat: cleanups 2008-10-10 19:29:20 +02:00
pf_in.c x86 mmiotrace: move files into arch/x86/mm/. 2008-05-24 11:25:37 +02:00
pf_in.h x86 mmiotrace: move files into arch/x86/mm/. 2008-05-24 11:25:37 +02:00
pgtable_32.c i386: vmalloc size fix 2008-08-21 10:13:21 +02:00
pgtable.c x86: pgd_{c,d}tor() cleanup 2008-09-06 19:47:09 +02:00
srat_32.c x86: don't call e820_regiter_active_regions if out of range on node 2008-08-14 11:35:52 +02:00
srat_64.c x86: reserve SLIT 2008-07-11 10:22:33 +02:00
testmmiotrace.c mmiotrace: code style cleanups 2008-05-24 11:27:28 +02:00