All of lore.kernel.org
 help / color / mirror / Atom feed
From: Huang Ying <ying.huang@intel.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Len Brown <lenb@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	Mauro Carvalho Chehab <mchehab@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH -v4 1/2] lib, Make gen_pool memory allocator lockless
Date: Wed, 17 Nov 2010 10:18:01 +0800	[thread overview]
Message-ID: <1289960281.8719.1218.camel@yhuang-dev> (raw)
In-Reply-To: <20101116135038.fcaa90ca.akpm@linux-foundation.org>

On Wed, 2010-11-17 at 05:50 +0800, Andrew Morton wrote:
> On Tue, 16 Nov 2010 08:53:10 +0800
> Huang Ying <ying.huang@intel.com> wrote:
> 
> > This version of the gen_pool memory allocator supports lockless
> > operation.
> > 
> > This makes it safe to use in NMI handlers and other special
> > unblockable contexts that could otherwise deadlock on locks.  This is
> > implemented by using atomic operations and retries on any conflicts.
> > The disadvantage is that there may be livelocks in extreme cases.  For
> > better scalability, one gen_pool allocator can be used for each CPU.
> > 
> > The lockless operation only works if there is enough memory available.
> > If new memory is added to the pool a lock has to be still taken.  So
> > any user relying on locklessness has to ensure that sufficient memory
> > is preallocated.
> > 
> > The basic atomic operation of this allocator is cmpxchg on long.  On
> > architectures that don't support cmpxchg natively a fallback is used.
> > If the fallback uses locks it may not be safe to use it in NMI
> > contexts on these architectures.
> 
> The code assumes that cmpxchg is atomic wrt NMI.  That would be news to
> me - at present an architecture can legitimately implement cmpxchg()
> with, say, spin_lock_irqsave() on a hashed spinlock.  I don't know
> whether any architectures _do_ do anything like that.  If so then
> that's a problem.  If not, it's an additional requirement on future
> architecture ports.

cmpxchg has been used in that way by ftrace and perf for a long time. So
I agree to make it a requirement on future architecture ports.

> > Signed-off-by: Huang Ying <ying.huang@intel.com>
> > Reviewed-by: Andi Kleen <ak@linux.intel.com>
> > ---
> >  include/linux/bitmap.h   |    1 
> >  include/linux/genalloc.h |   35 +++++--
> >  lib/bitmap.c             |    2 
> >  lib/genalloc.c           |  228 ++++++++++++++++++++++++++++++++++++++---------
> >  4 files changed, 215 insertions(+), 51 deletions(-)
> > 
> > --- a/include/linux/bitmap.h
> > +++ b/include/linux/bitmap.h
> > @@ -142,6 +142,7 @@ extern void bitmap_release_region(unsign
> >  extern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order);
> >  extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits);
> >  
> > +#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG))
> >  #define BITMAP_LAST_WORD_MASK(nbits)					\
> >  (									\
> >  	((nbits) % BITS_PER_LONG) ?					\
> > --- a/include/linux/genalloc.h
> > +++ b/include/linux/genalloc.h
> > @@ -1,19 +1,26 @@
> > +#ifndef GENALLOC_H
> > +#define GENALLOC_H
> >  /*
> > - * Basic general purpose allocator for managing special purpose memory
> > - * not managed by the regular kmalloc/kfree interface.
> > - * Uses for this includes on-device special memory, uncached memory
> > - * etc.
> > + * Basic general purpose allocator for managing special purpose
> > + * memory, for example, memory not managed by the regular
> > + * kmalloc/kfree interface.  Uses for this includes on-device special
> > + * memory, uncached memory etc.
> > + *
> > + * The gen_pool_alloc, gen_pool_free, gen_pool_avail and gen_pool_size
> > + * implementation is lockless, that is, multiple users can
> > + * allocate/free memory in the pool simultaneously without lock.  This
> > + * also makes the gen_pool memory allocator can be used to
> 
> That sentence needs a fixup.

Yes. I will fix it.
  
> > +static inline int set_bits_ll(unsigned long *addr, unsigned long mask_to_set)
> > +{
> > +	unsigned long val, nval;
> > +
> > +	nval = *addr;
> > +	do {
> > +		val = nval;
> > +		if (val & mask_to_set)
> > +			return -EBUSY;
> > +	} while ((nval = cmpxchg(addr, val, val | mask_to_set)) != val);
> > +
> > +	return 0;
> > +}
> > +
> > +static inline int clear_bits_ll(unsigned long *addr,
> > +				unsigned long mask_to_clear)
> > +{
> > +	unsigned long val, nval;
> > +
> > +	nval = *addr;
> > +	do {
> > +		val = nval;
> > +		if ((val & mask_to_clear) != mask_to_clear)
> > +			return -EBUSY;
> > +	} while ((nval = cmpxchg(addr, val, val & ~mask_to_clear)) != val);
> > +
> > +	return 0;
> > +}
> 
> These are waaaay too big to be inlined.  Let the compiler decide.

Yes. Will change it.

Best Regards,
Huang Ying



  reply	other threads:[~2010-11-17  2:18 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-16  0:53 [PATCH -v4 0/2] Lockless memory allocator and list Huang Ying
2010-11-16  0:53 ` [PATCH -v4 1/2] lib, Make gen_pool memory allocator lockless Huang Ying
2010-11-16 21:50   ` Andrew Morton
2010-11-17  2:18     ` Huang Ying [this message]
2010-11-17  2:35       ` Andrew Morton
2010-11-17  3:03         ` Huang Ying
2010-11-17  3:57           ` Andrew Morton
2010-11-17  6:05             ` Huang Ying
2010-11-17 10:49               ` Peter Zijlstra
2010-11-17 11:16                 ` huang ying
2010-11-17 11:16                   ` huang ying
2010-11-17 11:38                   ` Peter Zijlstra
2010-11-17 10:40       ` Peter Zijlstra
2010-11-17 11:47         ` huang ying
2010-11-17 11:53           ` Peter Zijlstra
2010-11-18  1:14             ` Huang Ying
2010-11-18  8:34               ` Peter Zijlstra
2010-11-18  8:43                 ` Paul Mundt
2010-11-18  8:57                   ` Peter Zijlstra
2010-11-18  9:03                     ` Paul Mundt
2010-11-16  0:53 ` [PATCH -v4 2/2] lib, Add lock-less NULL terminated single list Huang Ying
2010-11-16 11:50   ` Peter Zijlstra
2010-11-16 16:33     ` Linus Torvalds
2010-11-16 16:33       ` Linus Torvalds
2010-11-16 11:49 ` [PATCH -v4 0/2] Lockless memory allocator and list Peter Zijlstra
2010-11-16 16:38   ` Linus Torvalds
2010-11-16 18:04     ` Peter Zijlstra
2010-11-17  1:45       ` Huang Ying
2010-11-17  1:03     ` Huang Ying

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=1289960281.8719.1218.camel@yhuang-dev \
    --to=ying.huang@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mchehab@redhat.com \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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.