All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kirill A. Shutemov" <kirill@shutemov.name>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	linux-arch@vger.kernel.org
Subject: Re: [PATCH] mm: create a separate slab for page->ptl allocation
Date: Wed, 6 Nov 2013 00:42:17 +0200	[thread overview]
Message-ID: <20131105224217.GC20167@shutemov.name> (raw)
In-Reply-To: <20131105150145.734a5dd5b5d455800ebfa0d3@linux-foundation.org>


[ sorry, resend to all ]

On Tue, Nov 05, 2013 at 03:01:45PM -0800, Andrew Morton wrote:
> On Tue, 22 Oct 2013 14:53:59 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote:
> 
> > If DEBUG_SPINLOCK and DEBUG_LOCK_ALLOC are enabled spinlock_t on x86_64
> > is 72 bytes. For page->ptl they will be allocated from kmalloc-96 slab,
> > so we loose 24 on each. An average system can easily allocate few tens
> > thousands of page->ptl and overhead is significant.
> > 
> > Let's create a separate slab for page->ptl allocation to solve this.
> > 
> > ...
> >
> > --- a/mm/memory.c
> > +++ b/mm/memory.c
> > @@ -4332,11 +4332,19 @@ void copy_user_huge_page(struct page *dst, struct page *src,
> >  #endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */
> >  
> >  #if USE_SPLIT_PTE_PTLOCKS
> > +struct kmem_cache *page_ptl_cachep;
> > +void __init ptlock_cache_init(void)
> > +{
> > +	if (sizeof(spinlock_t) > sizeof(long))
> > +		page_ptl_cachep = kmem_cache_create("page->ptl",
> > +				sizeof(spinlock_t), 0, SLAB_PANIC, NULL);
> > +}
> 
> Confused.  If (sizeof(spinlock_t) > sizeof(long)) happens to be false
> then the kernel will later crash.  It would be better to use BUILD_BUG_ON()
> here, if that works.  Otherwise BUG_ON.

if (sizeof(spinlock_t) > sizeof(long)) is false, we don't need dynamicly
allocate page->ptl. It's embedded to struct page itself. __ptlock_alloc()
never called in this case.

> Also, we have the somewhat silly KMEM_CACHE() macro, but it looks
> inapplicable here?

The first argument of KMEM_CACHE() is struct name, but we have typedef
here.

> >  bool __ptlock_alloc(struct page *page)
> >  {
> >  	spinlock_t *ptl;
> >  
> > -	ptl = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
> > +	ptl = kmem_cache_alloc(page_ptl_cachep, GFP_KERNEL);
> >  	if (!ptl)
> >  		return false;
> >  	page->ptl = (unsigned long)ptl;
> > @@ -4346,6 +4354,6 @@ bool __ptlock_alloc(struct page *page)
> >  void __ptlock_free(struct page *page)
> >  {
> >  	if (sizeof(spinlock_t) > sizeof(page->ptl))
> > -		kfree((spinlock_t *)page->ptl);
> > +		kmem_cache_free(page_ptl_cachep, (spinlock_t *)page->ptl);
> 
> A void* cast would suffice here, but I suppose the spinlock_t* cast has
> some documentation value.

Right.

-- 
 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.name>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	linux-arch@vger.kernel.org
Subject: Re: [PATCH] mm: create a separate slab for page->ptl allocation
Date: Wed, 6 Nov 2013 00:42:17 +0200	[thread overview]
Message-ID: <20131105224217.GC20167@shutemov.name> (raw)
Message-ID: <20131105224217.h_bpoOX0jffTkG03bo374nAQ0G3q-09YaC3l_w_GXWM@z> (raw)
In-Reply-To: <20131105150145.734a5dd5b5d455800ebfa0d3@linux-foundation.org>


[ sorry, resend to all ]

On Tue, Nov 05, 2013 at 03:01:45PM -0800, Andrew Morton wrote:
> On Tue, 22 Oct 2013 14:53:59 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote:
> 
> > If DEBUG_SPINLOCK and DEBUG_LOCK_ALLOC are enabled spinlock_t on x86_64
> > is 72 bytes. For page->ptl they will be allocated from kmalloc-96 slab,
> > so we loose 24 on each. An average system can easily allocate few tens
> > thousands of page->ptl and overhead is significant.
> > 
> > Let's create a separate slab for page->ptl allocation to solve this.
> > 
> > ...
> >
> > --- a/mm/memory.c
> > +++ b/mm/memory.c
> > @@ -4332,11 +4332,19 @@ void copy_user_huge_page(struct page *dst, struct page *src,
> >  #endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */
> >  
> >  #if USE_SPLIT_PTE_PTLOCKS
> > +struct kmem_cache *page_ptl_cachep;
> > +void __init ptlock_cache_init(void)
> > +{
> > +	if (sizeof(spinlock_t) > sizeof(long))
> > +		page_ptl_cachep = kmem_cache_create("page->ptl",
> > +				sizeof(spinlock_t), 0, SLAB_PANIC, NULL);
> > +}
> 
> Confused.  If (sizeof(spinlock_t) > sizeof(long)) happens to be false
> then the kernel will later crash.  It would be better to use BUILD_BUG_ON()
> here, if that works.  Otherwise BUG_ON.

if (sizeof(spinlock_t) > sizeof(long)) is false, we don't need dynamicly
allocate page->ptl. It's embedded to struct page itself. __ptlock_alloc()
never called in this case.

> Also, we have the somewhat silly KMEM_CACHE() macro, but it looks
> inapplicable here?

The first argument of KMEM_CACHE() is struct name, but we have typedef
here.

> >  bool __ptlock_alloc(struct page *page)
> >  {
> >  	spinlock_t *ptl;
> >  
> > -	ptl = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
> > +	ptl = kmem_cache_alloc(page_ptl_cachep, GFP_KERNEL);
> >  	if (!ptl)
> >  		return false;
> >  	page->ptl = (unsigned long)ptl;
> > @@ -4346,6 +4354,6 @@ bool __ptlock_alloc(struct page *page)
> >  void __ptlock_free(struct page *page)
> >  {
> >  	if (sizeof(spinlock_t) > sizeof(page->ptl))
> > -		kfree((spinlock_t *)page->ptl);
> > +		kmem_cache_free(page_ptl_cachep, (spinlock_t *)page->ptl);
> 
> A void* cast would suffice here, but I suppose the spinlock_t* cast has
> some documentation value.

Right.

-- 
 Kirill A. Shutemov

  reply	other threads:[~2013-11-05 22:42 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-22 11:53 [PATCH] mm: create a separate slab for page->ptl allocation Kirill A. Shutemov
2013-10-22 11:53 ` Kirill A. Shutemov
2013-10-22 12:55 ` Fengguang Wu
2013-10-22 12:55   ` Fengguang Wu
2013-11-04 10:42 ` Kirill A. Shutemov
2013-11-04 10:42   ` Kirill A. Shutemov
2013-11-05 23:01 ` Andrew Morton
2013-11-05 23:01   ` Andrew Morton
2013-11-05 22:42   ` Kirill A. Shutemov [this message]
2013-11-05 22:42     ` Kirill A. Shutemov
2013-11-05 23:56     ` Andrew Morton
2013-11-05 23:56       ` Andrew Morton
2013-11-05 23:13       ` Kirill A. Shutemov
2013-11-05 23:13         ` Kirill A. Shutemov
2013-11-06  0:43         ` Andrew Morton
2013-11-06  0:43           ` Andrew Morton
2013-11-06  9:31         ` Peter Zijlstra
2013-11-06  9:31           ` Peter Zijlstra
2013-11-06 11:18           ` Peter Zijlstra
2013-11-06 11:18             ` Peter Zijlstra
2013-11-06 13:31             ` lockref: Use bloated_spinlocks to avoid explicit config dependencies Kirill A. Shutemov
2013-11-06 13:31               ` Kirill A. Shutemov
2013-11-06 14:32               ` Peter Zijlstra
2013-11-06 14:32                 ` Peter Zijlstra
2013-11-06 13:21           ` [PATCH] mm: create a separate slab for page->ptl allocation Kirill A. Shutemov
2013-11-06 13:21             ` Kirill A. Shutemov
2013-11-06 14:30             ` Peter Zijlstra
2013-11-06 14:30               ` Peter Zijlstra
2013-11-06 10:34         ` Will Deacon
2013-11-06 10:34           ` Will Deacon
2013-11-06 10:49           ` Geert Uytterhoeven
2013-11-06 10:49             ` Geert Uytterhoeven
2013-11-06 11:02           ` Peter Zijlstra
2013-11-06 11:02             ` Peter Zijlstra

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=20131105224217.GC20167@shutemov.name \
    --to=kirill@shutemov.name \
    --cc=akpm@linux-foundation.org \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mingo@redhat.com \
    --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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.