Revision c2471e79a7ea0f48e3ae9253e1f3688a44cc944d authored by Mike Rapoport on 12 July 2019, 03:58:39 UTC, committed by Linus Torvalds on 12 July 2019, 18:05:46 UTC
Replace __get_free_page() and alloc_pages() calls with the generic __pte_alloc_one_kernel() and __pte_alloc_one(). There is no functional change for the kernel PTE allocation. The difference for the user PTEs, is that the clear_pte_table() is now called after pgtable_page_ctor() and the addition of __GFP_ACCOUNT to the GFP flags. The pte_free() and pte_free_kernel() versions are identical to the generic ones and can be simply dropped. Link: http://lkml.kernel.org/r/1557296232-15361-15-git-send-email-rppt@linux.ibm.com Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Anshuman Khandual <anshuman.khandual@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Greentime Hu <green.hu@gmail.com> Cc: Guan Xuetao <gxt@pku.edu.cn> Cc: Guo Ren <guoren@kernel.org> Cc: Helge Deller <deller@gmx.de> Cc: Ley Foon Tan <lftan@altera.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Matt Turner <mattst88@gmail.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Michal Hocko <mhocko@suse.com> Cc: Palmer Dabbelt <palmer@sifive.com> Cc: Paul Burton <paul.burton@mips.com> Cc: Richard Kuo <rkuo@codeaurora.org> Cc: Richard Weinberger <richard@nod.at> Cc: Russell King <linux@armlinux.org.uk> Cc: Sam Creasey <sammy@sammy.net> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Vincent Chen <deanbo422@gmail.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com> Cc: Guo Ren <ren_guo@c-sky.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent f32848e
percpu_test.c
// SPDX-License-Identifier: GPL-2.0-only
#include <linux/module.h>
/* validate @native and @pcp counter values match @expected */
#define CHECK(native, pcp, expected) \
do { \
WARN((native) != (expected), \
"raw %ld (0x%lx) != expected %lld (0x%llx)", \
(native), (native), \
(long long)(expected), (long long)(expected)); \
WARN(__this_cpu_read(pcp) != (expected), \
"pcp %ld (0x%lx) != expected %lld (0x%llx)", \
__this_cpu_read(pcp), __this_cpu_read(pcp), \
(long long)(expected), (long long)(expected)); \
} while (0)
static DEFINE_PER_CPU(long, long_counter);
static DEFINE_PER_CPU(unsigned long, ulong_counter);
static int __init percpu_test_init(void)
{
/*
* volatile prevents compiler from optimizing it uses, otherwise the
* +ul_one/-ul_one below would replace with inc/dec instructions.
*/
volatile unsigned int ui_one = 1;
long l = 0;
unsigned long ul = 0;
pr_info("percpu test start\n");
preempt_disable();
l += -1;
__this_cpu_add(long_counter, -1);
CHECK(l, long_counter, -1);
l += 1;
__this_cpu_add(long_counter, 1);
CHECK(l, long_counter, 0);
ul = 0;
__this_cpu_write(ulong_counter, 0);
ul += 1UL;
__this_cpu_add(ulong_counter, 1UL);
CHECK(ul, ulong_counter, 1);
ul += -1UL;
__this_cpu_add(ulong_counter, -1UL);
CHECK(ul, ulong_counter, 0);
ul += -(unsigned long)1;
__this_cpu_add(ulong_counter, -(unsigned long)1);
CHECK(ul, ulong_counter, -1);
ul = 0;
__this_cpu_write(ulong_counter, 0);
ul -= 1;
__this_cpu_dec(ulong_counter);
CHECK(ul, ulong_counter, -1);
CHECK(ul, ulong_counter, ULONG_MAX);
l += -ui_one;
__this_cpu_add(long_counter, -ui_one);
CHECK(l, long_counter, 0xffffffff);
l += ui_one;
__this_cpu_add(long_counter, ui_one);
CHECK(l, long_counter, (long)0x100000000LL);
l = 0;
__this_cpu_write(long_counter, 0);
l -= ui_one;
__this_cpu_sub(long_counter, ui_one);
CHECK(l, long_counter, -1);
l = 0;
__this_cpu_write(long_counter, 0);
l += ui_one;
__this_cpu_add(long_counter, ui_one);
CHECK(l, long_counter, 1);
l += -ui_one;
__this_cpu_add(long_counter, -ui_one);
CHECK(l, long_counter, (long)0x100000000LL);
l = 0;
__this_cpu_write(long_counter, 0);
l -= ui_one;
this_cpu_sub(long_counter, ui_one);
CHECK(l, long_counter, -1);
CHECK(l, long_counter, ULONG_MAX);
ul = 0;
__this_cpu_write(ulong_counter, 0);
ul += ui_one;
__this_cpu_add(ulong_counter, ui_one);
CHECK(ul, ulong_counter, 1);
ul = 0;
__this_cpu_write(ulong_counter, 0);
ul -= ui_one;
__this_cpu_sub(ulong_counter, ui_one);
CHECK(ul, ulong_counter, -1);
CHECK(ul, ulong_counter, ULONG_MAX);
ul = 3;
__this_cpu_write(ulong_counter, 3);
ul = this_cpu_sub_return(ulong_counter, ui_one);
CHECK(ul, ulong_counter, 2);
ul = __this_cpu_sub_return(ulong_counter, ui_one);
CHECK(ul, ulong_counter, 1);
preempt_enable();
pr_info("percpu test done\n");
return -EAGAIN; /* Fail will directly unload the module */
}
static void __exit percpu_test_exit(void)
{
}
module_init(percpu_test_init)
module_exit(percpu_test_exit)
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Greg Thelen");
MODULE_DESCRIPTION("percpu operations test");
Computing file changes ...