Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1422723AbXBPEpW (ORCPT ); Thu, 15 Feb 2007 23:45:22 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1423178AbXBPEpW (ORCPT ); Thu, 15 Feb 2007 23:45:22 -0500 Received: from dsl092-017-127.sfo4.dsl.speakeasy.net ([66.92.17.127]:36037 "EHLO mail.goop.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1422723AbXBPEpU (ORCPT ); Thu, 15 Feb 2007 23:45:20 -0500 X-Greylist: delayed 1952 seconds by postgrey-1.27 at vger.kernel.org; Thu, 15 Feb 2007 23:45:20 EST Message-Id: <20070216022531.047039320@goop.org> References: <20070216022449.739760547@goop.org> User-Agent: quilt/0.46-1 Date: Thu, 15 Feb 2007 18:24:56 -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 07/21] Xen-paravirt: remove ctor for pgd cache Content-Disposition: inline; filename=remove-pgd-ctor.patch Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3231 Lines: 105 Remove the ctor for the pgd cache. There's no point in having the cache machinery do this via an indirect call when all pgd are freed in the one place anyway. Signed-off-by: Jeremy Fitzhardinge =================================================================== --- a/arch/i386/mm/init.c +++ b/arch/i386/mm/init.c @@ -739,11 +739,9 @@ void __init pgtable_cache_init(void) panic("pgtable_cache_init(): cannot create pmd cache"); } pgd_cache = kmem_cache_create("pgd", - PTRS_PER_PGD*sizeof(pgd_t), - PTRS_PER_PGD*sizeof(pgd_t), - 0, - pgd_ctor, - PTRS_PER_PMD == 1 ? pgd_dtor : NULL); + PTRS_PER_PGD*sizeof(pgd_t), + PTRS_PER_PGD*sizeof(pgd_t), + 0, NULL, NULL); if (!pgd_cache) panic("pgtable_cache_init(): Cannot create pgd cache"); } =================================================================== --- a/arch/i386/mm/pgtable.c +++ b/arch/i386/mm/pgtable.c @@ -236,7 +236,7 @@ static inline void pgd_list_del(pgd_t *p set_page_private(next, (unsigned long)pprev); } -void pgd_ctor(void *pgd, struct kmem_cache *cache, unsigned long unused) +static void pgd_ctor(pgd_t *pgd) { unsigned long flags; @@ -245,7 +245,7 @@ void pgd_ctor(void *pgd, struct kmem_cac spin_lock_irqsave(&pgd_lock, flags); } - clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD, + clone_pgd_range(pgd + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD, KERNEL_PGD_PTRS); @@ -261,10 +261,12 @@ void pgd_ctor(void *pgd, struct kmem_cac spin_unlock_irqrestore(&pgd_lock, flags); } -/* never called when PTRS_PER_PMD > 1 */ -void pgd_dtor(void *pgd, struct kmem_cache *cache, unsigned long unused) +static void pgd_dtor(pgd_t *pgd) { unsigned long flags; /* can be called from interrupt context */ + + if (PTRS_PER_PMD == 1) + return; paravirt_release_pd(__pa(pgd) >> PAGE_SHIFT); spin_lock_irqsave(&pgd_lock, flags); @@ -276,6 +278,9 @@ pgd_t *pgd_alloc(struct mm_struct *mm) { int i; pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL); + + if (pgd) + pgd_ctor(pgd); if (PTRS_PER_PMD == 1 || !pgd) return pgd; @@ -296,6 +301,7 @@ out_oom: paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT); kmem_cache_free(pmd_cache, pmd); } + pgd_dtor(pgd); kmem_cache_free(pgd_cache, pgd); return NULL; } @@ -313,5 +319,6 @@ void pgd_free(pgd_t *pgd) kmem_cache_free(pmd_cache, pmd); } /* in the non-PAE case, free_pgtables() clears user pgd entries */ + pgd_dtor(pgd); kmem_cache_free(pgd_cache, pgd); } =================================================================== --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h @@ -41,8 +41,6 @@ extern struct page *pgd_list; extern struct page *pgd_list; void pmd_ctor(void *, struct kmem_cache *, unsigned long); -void pgd_ctor(void *, struct kmem_cache *, unsigned long); -void pgd_dtor(void *, struct kmem_cache *, unsigned long); void pgtable_cache_init(void); void paging_init(void); -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/