From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1423175AbXBPEpq (ORCPT ); Thu, 15 Feb 2007 23:45:46 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1423173AbXBPEpc (ORCPT ); Thu, 15 Feb 2007 23:45:32 -0500 Received: from dsl092-017-127.sfo4.dsl.speakeasy.net ([66.92.17.127]:36056 "EHLO mail.goop.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1423175AbXBPEpV (ORCPT ); Thu, 15 Feb 2007 23:45:21 -0500 Message-Id: <20070216022531.194731142@goop.org> References: <20070216022449.739760547@goop.org> User-Agent: quilt/0.46-1 Date: Thu, 15 Feb 2007 18:24:58 -0800 From: Jeremy Fitzhardinge To: Andi Kleen Cc: Andrew Morton , linux-kernel@vger.kernel.org, virtualization@lists.osdl.org, xen-devel@lists.xensource.com, Chris Wright , Zachary Amsden Subject: [patch 09/21] Xen-paravirt: Allow paravirt backend to select PGD allocation alignment Content-Disposition: inline; filename=pgd-alignment.patch Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Xen requires pgds to be page-aligned, so make this a parameter which can be set in the paravirt_ops structure. Signed-off-by: Jeremy Fitzhardinge -- arch/i386/kernel/paravirt.c | 1 + arch/i386/mm/init.c | 2 +- include/asm-i386/paravirt.h | 5 ++++- include/asm-i386/pgtable.h | 6 ++++++ 4 files changed, 12 insertions(+), 2 deletions(-) =================================================================== --- a/arch/i386/kernel/paravirt.c +++ b/arch/i386/kernel/paravirt.c @@ -573,6 +573,7 @@ struct paravirt_ops paravirt_ops = { .paravirt_enabled = 0, .kernel_rpl = 0, .shared_kernel_pmd = 1, /* Only used when CONFIG_X86_PAE is set */ + .pgd_alignment = sizeof(pgd_t) * PTRS_PER_PGD, .patch = native_patch, .banner = default_banner, =================================================================== --- a/arch/i386/mm/init.c +++ b/arch/i386/mm/init.c @@ -745,7 +745,7 @@ void __init pgtable_cache_init(void) } pgd_cache = kmem_cache_create("pgd", PTRS_PER_PGD*sizeof(pgd_t), - PTRS_PER_PGD*sizeof(pgd_t), + PGD_ALIGNMENT, 0, NULL, NULL); if (!pgd_cache) panic("pgtable_cache_init(): Cannot create pgd cache"); =================================================================== --- a/include/asm-i386/paravirt.h +++ b/include/asm-i386/paravirt.h @@ -33,9 +33,12 @@ struct mm_struct; struct mm_struct; struct paravirt_ops { + int paravirt_enabled; unsigned int kernel_rpl; + int shared_kernel_pmd; - int paravirt_enabled; + int pgd_alignment; + const char *name; /* =================================================================== --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h @@ -270,6 +270,12 @@ static inline void vmalloc_sync_all(void #define pte_update_defer(mm, addr, ptep) do { } while (0) #endif +#ifdef CONFIG_PARAVIRT +#define PGD_ALIGNMENT (paravirt_ops.pgd_alignment) +#else +#define PGD_ALIGNMENT (sizeof(pgd_t) * PTRS_PER_PGD) +#endif + /* * We only update the dirty/accessed state if we set * the dirty bit by hand in the kernel, since the hardware --