From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755951AbcBINQL (ORCPT ); Tue, 9 Feb 2016 08:16:11 -0500 Received: from mail-lb0-f195.google.com ([209.85.217.195]:36575 "EHLO mail-lb0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751197AbcBINQI (ORCPT ); Tue, 9 Feb 2016 08:16:08 -0500 From: Alexander Kuleshov To: Ingo Molnar , Thomas Gleixner , "H . Peter Anvin" Cc: Andrey Ryabinin , Andy Lutomirski , Andy Shevchenko , Alexander Popov , linux-kernel@vger.kernel.org, Alexander Kuleshov Subject: [PATCH v2] x86/head64: micro optimization: use memset instead of for loop Date: Tue, 9 Feb 2016 19:11:57 +0600 Message-Id: <1455023517-7620-1-git-send-email-kuleshovmail@gmail.com> X-Mailer: git-send-email 2.7.0.25.gfc10eb5 In-Reply-To: <20160209122809.GA5186@gmail.com> References: <20160209122809.GA5186@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch simplifies clearing of page table directories, by the using of the fast memset() from the arch/x86/lib/memset_64.S. Besides this, we 25 bytes is 25 bytes less than original. text data bss dec hex filename 9735144 4970776 15474688 30180608 1cc8500 vmlinux.old 9735119 4970776 15474688 30180583 1cc84e7 vmlinux Signed-off-by: Alexander Kuleshov --- Changelog: v2: We got sizeof pud_p/pmd_p in the v1, but actually we need to take sizeof of pud_p/pmd_p pointer, although their sizes are the same. arch/x86/kernel/head64.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 2c0f340..1f4422d 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -40,13 +40,8 @@ pmdval_t early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX); /* Wipe all early page tables except for the kernel symbol map */ static void __init reset_early_page_tables(void) { - unsigned long i; - - for (i = 0; i < PTRS_PER_PGD-1; i++) - early_level4_pgt[i].pgd = 0; - + memset(early_level4_pgt, 0, sizeof(pgd_t)*(PTRS_PER_PGD-1)); next_early_pgt = 0; - write_cr3(__pa_nodebug(early_level4_pgt)); } @@ -54,7 +49,6 @@ static void __init reset_early_page_tables(void) int __init early_make_pgtable(unsigned long address) { unsigned long physaddr = address - __PAGE_OFFSET; - unsigned long i; pgdval_t pgd, *pgd_p; pudval_t pud, *pud_p; pmdval_t pmd, *pmd_p; @@ -81,8 +75,7 @@ again: } pud_p = (pudval_t *)early_dynamic_pgts[next_early_pgt++]; - for (i = 0; i < PTRS_PER_PUD; i++) - pud_p[i] = 0; + memset(pud_p, 0, sizeof(*pud_p) * PTRS_PER_PUD); *pgd_p = (pgdval_t)pud_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; } pud_p += pud_index(address); @@ -97,8 +90,7 @@ again: } pmd_p = (pmdval_t *)early_dynamic_pgts[next_early_pgt++]; - for (i = 0; i < PTRS_PER_PMD; i++) - pmd_p[i] = 0; + memset(pmd_p, 0, sizeof(*pmd_p) * PTRS_PER_PMD); *pud_p = (pudval_t)pmd_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; } pmd = (physaddr & PMD_MASK) + early_pmd_flags; -- 2.7.0.25.gfc10eb5