From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> To: Max Filippov <jcmvbkbc@gmail.com> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>, Andrew Morton <akpm@linux-foundation.org>, Peter Zijlstra <peterz@infradead.org>, Chris Zankel <chris@zankel.net>, Christoph Lameter <cl@linux-foundation.org>, Pekka Enberg <penberg@kernel.org>, Matt Mackall <mpm@selenic.com>, LKML <linux-kernel@vger.kernel.org>, "linux-mm@kvack.org" <linux-mm@kvack.org>, Linux-Arch <linux-arch@vger.kernel.org>, "linux-xtensa@linux-xtensa.org" <linux-xtensa@linux-xtensa.org> Subject: Re: [PATCHv2 2/2] xtensa: use buddy allocator for PTE table Date: Mon, 14 Oct 2013 18:44:03 +0300 (EEST) [thread overview] Message-ID: <20131014154403.562B2E0090@blue.fi.intel.com> (raw) In-Reply-To: <CAMo8Bf+oo4WCE366+bPoD5Y=Q3pCF0NVnfjXVqz8=nZ45_XY7Q@mail.gmail.com> Max Filippov wrote: > On Mon, Oct 14, 2013 at 6:32 PM, Kirill A. Shutemov > <kirill.shutemov@linux.intel.com> wrote: > > At the moment xtensa uses slab allocator for PTE table. It doesn't work > > with enabled split page table lock: slab uses page->slab_cache and > > page->first_page for its pages. These fields share stroage with > > page->ptl. > > > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > > Cc: Chris Zankel <chris@zankel.net> > > Cc: Max Filippov <jcmvbkbc@gmail.com> > > --- > > v2: > > - add missed return in pte_alloc_one_kernel; > > > > arch/xtensa/include/asm/pgalloc.h | 20 ++++++++++++-------- > > arch/xtensa/include/asm/pgtable.h | 3 +-- > > arch/xtensa/mm/mmu.c | 20 -------------------- > > 3 files changed, 13 insertions(+), 30 deletions(-) > > > > diff --git a/arch/xtensa/include/asm/pgalloc.h b/arch/xtensa/include/asm/pgalloc.h > > index b8774f1e21..8507b32d6e 100644 > > --- a/arch/xtensa/include/asm/pgalloc.h > > +++ b/arch/xtensa/include/asm/pgalloc.h > > @@ -38,14 +38,18 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) > > free_page((unsigned long)pgd); > > } > > > > -/* Use a slab cache for the pte pages (see also sparc64 implementation) */ > > - > > -extern struct kmem_cache *pgtable_cache; > > - > > static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, > > unsigned long address) > > { > > - return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); > > + pte_t *ptep; > > + int i; > > + > > + ptep = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); > > + if (!ptep) > > + return NULL; > > + for (i = 0; i < 1024; i++, ptep++) > > + pte_clear(NULL, 0, ptep); > > + return ptep; > > You're returning modified ptep, not the allocated one. Erghh.. Stupid me. Corrected patch below. From 0ba2ac687321f5ad7bac5f5c141da5b65b957fdc Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Date: Mon, 14 Oct 2013 13:38:21 +0300 Subject: [PATCHv3] xtensa: use buddy allocator for PTE table At the moment xtensa uses slab allocator for PTE table. It doesn't work with enabled split page table lock: slab uses page->slab_cache and page->first_page for its pages. These fields share stroage with page->ptl. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Chris Zankel <chris@zankel.net> Cc: Max Filippov <jcmvbkbc@gmail.com> --- v3: - return correct value from pte_alloc_one_kernel(); v2: - add missed return in pte_alloc_one_kernel(); arch/xtensa/include/asm/pgalloc.h | 20 ++++++++++++-------- arch/xtensa/include/asm/pgtable.h | 3 +-- arch/xtensa/mm/mmu.c | 20 -------------------- 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/arch/xtensa/include/asm/pgalloc.h b/arch/xtensa/include/asm/pgalloc.h index b8774f1e21..d38eb9237e 100644 --- a/arch/xtensa/include/asm/pgalloc.h +++ b/arch/xtensa/include/asm/pgalloc.h @@ -38,14 +38,18 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) free_page((unsigned long)pgd); } -/* Use a slab cache for the pte pages (see also sparc64 implementation) */ - -extern struct kmem_cache *pgtable_cache; - static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { - return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); + pte_t *ptep; + int i; + + ptep = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); + if (!ptep) + return NULL; + for (i = 0; i < 1024; i++) + pte_clear(NULL, 0, ptep + i); + return ptep; } static inline pgtable_t pte_alloc_one(struct mm_struct *mm, @@ -59,7 +63,7 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, return NULL; page = virt_to_page(pte); if (!pgtable_page_ctor(page)) { - kmem_cache_free(pgtable_cache, pte); + __free_page(page); return NULL; } return page; @@ -67,13 +71,13 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) { - kmem_cache_free(pgtable_cache, pte); + free_page((unsigned long)pte); } static inline void pte_free(struct mm_struct *mm, pgtable_t pte) { pgtable_page_dtor(pte); - kmem_cache_free(pgtable_cache, page_address(pte)); + __free_page(pte); } #define pmd_pgtable(pmd) pmd_page(pmd) diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h index 0fdf5d043f..216446295a 100644 --- a/arch/xtensa/include/asm/pgtable.h +++ b/arch/xtensa/include/asm/pgtable.h @@ -220,12 +220,11 @@ extern unsigned long empty_zero_page[1024]; #ifdef CONFIG_MMU extern pgd_t swapper_pg_dir[PAGE_SIZE/sizeof(pgd_t)]; extern void paging_init(void); -extern void pgtable_cache_init(void); #else # define swapper_pg_dir NULL static inline void paging_init(void) { } -static inline void pgtable_cache_init(void) { } #endif +static inline void pgtable_cache_init(void) { } /* * The pmd contains the kernel virtual address of the pte page. diff --git a/arch/xtensa/mm/mmu.c b/arch/xtensa/mm/mmu.c index a1077570e3..c43771c974 100644 --- a/arch/xtensa/mm/mmu.c +++ b/arch/xtensa/mm/mmu.c @@ -50,23 +50,3 @@ void __init init_mmu(void) */ set_ptevaddr_register(PGTABLE_START); } - -struct kmem_cache *pgtable_cache __read_mostly; - -static void pgd_ctor(void *addr) -{ - pte_t *ptep = (pte_t *)addr; - int i; - - for (i = 0; i < 1024; i++, ptep++) - pte_clear(NULL, 0, ptep); - -} - -void __init pgtable_cache_init(void) -{ - pgtable_cache = kmem_cache_create("pgd", - PAGE_SIZE, PAGE_SIZE, - SLAB_HWCACHE_ALIGN, - pgd_ctor); -} -- Kirill A. Shutemov -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> To: Max Filippov <jcmvbkbc@gmail.com> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>, Andrew Morton <akpm@linux-foundation.org>, Peter Zijlstra <peterz@infradead.org>, Chris Zankel <chris@zankel.net>, Christoph Lameter <cl@linux-foundation.org>, Pekka Enberg <penberg@kernel.org>, Matt Mackall <mpm@selenic.com>, LKML <linux-kernel@vger.kernel.org>, "linux-mm@kvack.org" <linux-mm@kvack.org>, Linux-Arch <linux-arch@vger.kernel.org>, "linux-xtensa@linux-xtensa.org" <linux-xtensa@linux-xtensa.org> Subject: Re: [PATCHv2 2/2] xtensa: use buddy allocator for PTE table Date: Mon, 14 Oct 2013 18:44:03 +0300 (EEST) [thread overview] Message-ID: <20131014154403.562B2E0090@blue.fi.intel.com> (raw) Message-ID: <20131014154403.FD0vi8S6vdpwQHnZtWMpDRnwblG2yC9CJD4s_JVqNak@z> (raw) In-Reply-To: <CAMo8Bf+oo4WCE366+bPoD5Y=Q3pCF0NVnfjXVqz8=nZ45_XY7Q@mail.gmail.com> Max Filippov wrote: > On Mon, Oct 14, 2013 at 6:32 PM, Kirill A. Shutemov > <kirill.shutemov@linux.intel.com> wrote: > > At the moment xtensa uses slab allocator for PTE table. It doesn't work > > with enabled split page table lock: slab uses page->slab_cache and > > page->first_page for its pages. These fields share stroage with > > page->ptl. > > > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > > Cc: Chris Zankel <chris@zankel.net> > > Cc: Max Filippov <jcmvbkbc@gmail.com> > > --- > > v2: > > - add missed return in pte_alloc_one_kernel; > > > > arch/xtensa/include/asm/pgalloc.h | 20 ++++++++++++-------- > > arch/xtensa/include/asm/pgtable.h | 3 +-- > > arch/xtensa/mm/mmu.c | 20 -------------------- > > 3 files changed, 13 insertions(+), 30 deletions(-) > > > > diff --git a/arch/xtensa/include/asm/pgalloc.h b/arch/xtensa/include/asm/pgalloc.h > > index b8774f1e21..8507b32d6e 100644 > > --- a/arch/xtensa/include/asm/pgalloc.h > > +++ b/arch/xtensa/include/asm/pgalloc.h > > @@ -38,14 +38,18 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) > > free_page((unsigned long)pgd); > > } > > > > -/* Use a slab cache for the pte pages (see also sparc64 implementation) */ > > - > > -extern struct kmem_cache *pgtable_cache; > > - > > static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, > > unsigned long address) > > { > > - return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); > > + pte_t *ptep; > > + int i; > > + > > + ptep = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); > > + if (!ptep) > > + return NULL; > > + for (i = 0; i < 1024; i++, ptep++) > > + pte_clear(NULL, 0, ptep); > > + return ptep; > > You're returning modified ptep, not the allocated one. Erghh.. Stupid me. Corrected patch below. From 0ba2ac687321f5ad7bac5f5c141da5b65b957fdc Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Date: Mon, 14 Oct 2013 13:38:21 +0300 Subject: [PATCHv3] xtensa: use buddy allocator for PTE table At the moment xtensa uses slab allocator for PTE table. It doesn't work with enabled split page table lock: slab uses page->slab_cache and page->first_page for its pages. These fields share stroage with page->ptl. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Chris Zankel <chris@zankel.net> Cc: Max Filippov <jcmvbkbc@gmail.com> --- v3: - return correct value from pte_alloc_one_kernel(); v2: - add missed return in pte_alloc_one_kernel(); arch/xtensa/include/asm/pgalloc.h | 20 ++++++++++++-------- arch/xtensa/include/asm/pgtable.h | 3 +-- arch/xtensa/mm/mmu.c | 20 -------------------- 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/arch/xtensa/include/asm/pgalloc.h b/arch/xtensa/include/asm/pgalloc.h index b8774f1e21..d38eb9237e 100644 --- a/arch/xtensa/include/asm/pgalloc.h +++ b/arch/xtensa/include/asm/pgalloc.h @@ -38,14 +38,18 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) free_page((unsigned long)pgd); } -/* Use a slab cache for the pte pages (see also sparc64 implementation) */ - -extern struct kmem_cache *pgtable_cache; - static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { - return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); + pte_t *ptep; + int i; + + ptep = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); + if (!ptep) + return NULL; + for (i = 0; i < 1024; i++) + pte_clear(NULL, 0, ptep + i); + return ptep; } static inline pgtable_t pte_alloc_one(struct mm_struct *mm, @@ -59,7 +63,7 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, return NULL; page = virt_to_page(pte); if (!pgtable_page_ctor(page)) { - kmem_cache_free(pgtable_cache, pte); + __free_page(page); return NULL; } return page; @@ -67,13 +71,13 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) { - kmem_cache_free(pgtable_cache, pte); + free_page((unsigned long)pte); } static inline void pte_free(struct mm_struct *mm, pgtable_t pte) { pgtable_page_dtor(pte); - kmem_cache_free(pgtable_cache, page_address(pte)); + __free_page(pte); } #define pmd_pgtable(pmd) pmd_page(pmd) diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h index 0fdf5d043f..216446295a 100644 --- a/arch/xtensa/include/asm/pgtable.h +++ b/arch/xtensa/include/asm/pgtable.h @@ -220,12 +220,11 @@ extern unsigned long empty_zero_page[1024]; #ifdef CONFIG_MMU extern pgd_t swapper_pg_dir[PAGE_SIZE/sizeof(pgd_t)]; extern void paging_init(void); -extern void pgtable_cache_init(void); #else # define swapper_pg_dir NULL static inline void paging_init(void) { } -static inline void pgtable_cache_init(void) { } #endif +static inline void pgtable_cache_init(void) { } /* * The pmd contains the kernel virtual address of the pte page. diff --git a/arch/xtensa/mm/mmu.c b/arch/xtensa/mm/mmu.c index a1077570e3..c43771c974 100644 --- a/arch/xtensa/mm/mmu.c +++ b/arch/xtensa/mm/mmu.c @@ -50,23 +50,3 @@ void __init init_mmu(void) */ set_ptevaddr_register(PGTABLE_START); } - -struct kmem_cache *pgtable_cache __read_mostly; - -static void pgd_ctor(void *addr) -{ - pte_t *ptep = (pte_t *)addr; - int i; - - for (i = 0; i < 1024; i++, ptep++) - pte_clear(NULL, 0, ptep); - -} - -void __init pgtable_cache_init(void) -{ - pgtable_cache = kmem_cache_create("pgd", - PAGE_SIZE, PAGE_SIZE, - SLAB_HWCACHE_ALIGN, - pgd_ctor); -} -- Kirill A. Shutemov
next prev parent reply other threads:[~2013-10-14 15:44 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-10-14 14:32 [PATCHv2 1/2] mm: try to detect that page->ptl is in use Kirill A. Shutemov 2013-10-14 14:32 ` [PATCHv2 2/2] xtensa: use buddy allocator for PTE table Kirill A. Shutemov 2013-10-14 14:32 ` Kirill A. Shutemov 2013-10-14 15:19 ` Max Filippov 2013-10-14 15:19 ` Max Filippov 2013-10-14 15:44 ` Kirill A. Shutemov [this message] 2013-10-14 15:44 ` Kirill A. Shutemov 2013-10-15 20:44 ` Max Filippov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20131014154403.562B2E0090@blue.fi.intel.com \ --to=kirill.shutemov@linux.intel.com \ --cc=akpm@linux-foundation.org \ --cc=chris@zankel.net \ --cc=cl@linux-foundation.org \ --cc=jcmvbkbc@gmail.com \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-xtensa@linux-xtensa.org \ --cc=mpm@selenic.com \ --cc=penberg@kernel.org \ --cc=peterz@infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).