public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [slubllv6 00/17] SLUB: Lockless freelists for objects V6
@ 2011-05-26 18:14 Christoph Lameter
  2011-05-26 18:14 ` [slubllv6 01/17] slub: Push irq disable into allocate_slab() Christoph Lameter
                   ` (16 more replies)
  0 siblings, 17 replies; 32+ messages in thread
From: Christoph Lameter @ 2011-05-26 18:14 UTC (permalink / raw)
  To: Pekka Enberg
  Cc: David Rientjes, Eric Dumazet, H. Peter Anvin, linux-kernel,
	Thomas Gleixner

V5->V6  - Diffed against current Linus for -next integration.
	- Rework descriptions
	- Patches could use some review.

V4->V5	- More cleanup. Remove gotos from __slab_alloc and __slab_free
	- Some structural changes to alloc and free to clean up the code
	- Statistics modifications folded in other patches.
	- Fixes to patches already in Pekka's slabnext.
	- Include missing upstream fixes

V3->V4	- Diffed against Pekka's slab/next tree.
	- Numerous cleanups in particular as a result of the removal of the
	  #ifdef CMPXCHG_LOCAL stuff.
	- Smaller cleanups whereever I saw something.

V2->V3
	- Provide statistics
	- Fallback logic to page lock if cmpxchg16b is not available.
	- Better counter support
	- More cleanups and clarifications

Well here is another result of my obsession with SLAB allocators. There must be
some way to get an allocator done that is faster without queueing and I hope
that we are now there (maybe only almost...). Any help with cleaning up the
rough edges would be appreciated.

This patchset implement wider lockless operations in slub affecting most of the
slowpaths. In particular the patch decreases the overhead in the performance
critical section of __slab_free.

One test that I ran was "hackbench 200 process 200" on 2.6.39-rc3 under KVM

Run	SLAB	SLUB	SLUB LL
1st	35.2	35.9	31.9
2nd	34.6	30.8	27.9
3rd	33.8	29.9	28.8

Note that the SLUB version in 2.6.29-rc1 already has an optimized allocation
and free path using this_cpu_cmpxchg_double(). SLUB LL takes it to new heights
by also using cmpxchg_double() in the slowpaths (especially in the kfree()
case where we frequently cannot use the fastpath because there is no queue).

The patch uses a cmpxchg_double (also introduced here) to do an atomic change
on the state of a slab page that includes the following pieces of information:

1. Freelist pointer
2. Number of objects inuse
3. Frozen state of a slab

Disabling of interrupts (which is a significant latency in the
allocator paths) is avoided in the __slab_free case.

There are some concerns with this patch. The use of cmpxchg_double on
fields of the page struct requires alignment of the fields to double
word boundaries. That can only be accomplished by adding some padding
to struct page which blows it up to 64 byte (on x86_64). Comments
in the source describe these things in more detail.

The cmpxchg_double() operation introduced here could also be used to
update other doublewords in the page struct in a lockless fashion. One
can envision page state changes that involved flags and mappings or
maybe do list operations locklessly (but with the current scheme we
would need to update two other words elsewhere at the same time too,
so another scheme would be needed).


^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2011-05-31 17:13 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-26 18:14 [slubllv6 00/17] SLUB: Lockless freelists for objects V6 Christoph Lameter
2011-05-26 18:14 ` [slubllv6 01/17] slub: Push irq disable into allocate_slab() Christoph Lameter
2011-05-26 22:13   ` David Rientjes
2011-05-31 16:55     ` Christoph Lameter
2011-05-26 18:14 ` [slubllv6 02/17] slub: Do not use frozen page flag but a bit in the page counters Christoph Lameter
2011-05-26 22:13   ` David Rientjes
2011-05-31 16:57     ` Christoph Lameter
2011-05-26 18:14 ` [slubllv6 03/17] slub: Move page->frozen handling near where the page->freelist handling occurs Christoph Lameter
2011-05-26 22:13   ` David Rientjes
2011-05-26 18:14 ` [slubllv6 04/17] x86: Add support for cmpxchg_double Christoph Lameter
2011-05-26 18:14 ` [slubllv6 05/17] mm: Rearrange struct page Christoph Lameter
2011-05-26 22:14   ` David Rientjes
2011-05-26 18:14 ` [slubllv6 06/17] slub: Add cmpxchg_double_slab() Christoph Lameter
2011-05-26 22:14   ` David Rientjes
2011-05-31 17:05     ` Christoph Lameter
2011-05-26 18:14 ` [slubllv6 07/17] slub: explicit list_lock taking Christoph Lameter
2011-05-26 22:15   ` David Rientjes
2011-05-31 17:11     ` Christoph Lameter
2011-05-27 19:40   ` David Rientjes
2011-05-26 18:14 ` [slubllv6 08/17] slub: Pass kmem_cache struct to lock and freeze slab Christoph Lameter
2011-05-27 19:43   ` David Rientjes
2011-05-26 18:14 ` [slubllv6 09/17] slub: Rework allocator fastpaths Christoph Lameter
2011-05-26 18:14 ` [slubllv6 10/17] slub: Invert locking and avoid slab lock Christoph Lameter
2011-05-26 18:14 ` [slubllv6 11/17] slub: Disable interrupts in free_debug processing Christoph Lameter
2011-05-26 18:14 ` [slubllv6 12/17] slub: Avoid disabling interrupts in free slowpath Christoph Lameter
2011-05-26 22:16   ` David Rientjes
2011-05-31 17:12     ` Christoph Lameter
2011-05-26 18:14 ` [slubllv6 13/17] slub: Get rid of the another_slab label Christoph Lameter
2011-05-26 18:14 ` [slubllv6 14/17] slub: Add statistics for the case that the current slab does not match the node Christoph Lameter
2011-05-26 18:14 ` [slubllv6 15/17] slub: fast release on full slab Christoph Lameter
2011-05-26 18:14 ` [slubllv6 16/17] slub: Not necessary to check for empty slab on load_freelist Christoph Lameter
2011-05-26 18:14 ` [slubllv6 17/17] slub: slabinfo update for cmpxchg handling Christoph Lameter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox