]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
um: Remove unnecessary faulted check in uaccess.c
authorAnton Ivanov <anton.ivanov@cambridgegreys.com>
Thu, 22 Nov 2018 14:45:13 +0000 (14:45 +0000)
committerRichard Weinberger <richard@nod.at>
Thu, 27 Dec 2018 21:48:20 +0000 (22:48 +0100)
It is not necessary to check if a fault has occured or not
after disabling pagefaults. kmap_atomic does that in all
cases and we can disable it for 64 bit where kmap is not needed
and a simple page_address would suffice.

dd if=/dev/zero of=/dev/null bs=1M count=1M
Before: 3.1GB/s. After: 3.5GB/s

There is a noticeable difference for file disk read and write
as well as less noticeable difference for network IO.

Signed-off-by: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/kernel/skas/uaccess.c

index d450797a3a7cd478e3cdcec2308043ffc9537684..7f06fdbc7ee110468e70ba9fbb4670253d655d63 100644 (file)
@@ -62,27 +62,28 @@ static int do_op_one_page(unsigned long addr, int len, int is_write,
        jmp_buf buf;
        struct page *page;
        pte_t *pte;
-       int n, faulted;
+       int n;
 
        pte = maybe_map(addr, is_write);
        if (pte == NULL)
                return -1;
 
        page = pte_page(*pte);
+#ifdef CONFIG_64BIT
+       pagefault_disable();
+       addr = (unsigned long) page_address(page) +
+               (addr & ~PAGE_MASK);
+#else
        addr = (unsigned long) kmap_atomic(page) +
                (addr & ~PAGE_MASK);
+#endif
+       n = (*op)(addr, len, arg);
 
-       current->thread.fault_catcher = &buf;
-
-       faulted = UML_SETJMP(&buf);
-       if (faulted == 0)
-               n = (*op)(addr, len, arg);
-       else
-               n = -1;
-
-       current->thread.fault_catcher = NULL;
-
+#ifdef CONFIG_64BIT
+       pagefault_enable();
+#else
        kunmap_atomic((void *)addr);
+#endif
 
        return n;
 }