SLUB: Use unique end pointer for each slab page.
authorChristoph Lameter <clameter@sgi.com>
Tue, 8 Jan 2008 07:20:29 +0000 (23:20 -0800)
committerChristoph Lameter <christoph@stapp.engr.sgi.com>
Fri, 8 Feb 2008 01:47:41 +0000 (17:47 -0800)
commit683d0baad3d6e18134927f8c28ee804dbe10fe71
treea1ef69f9cde406492b5deedc6874312cbeb3b357
parent5bb983b0cce9b7b281af15730f7019116dd42568
SLUB: Use unique end pointer for each slab page.

We use a NULL pointer on freelists to signal that there are no more objects.
However the NULL pointers of all slabs match in contrast to the pointers to
the real objects which are in different ranges for different slab pages.

Change the end pointer to be a pointer to the first object and set bit 0.
Every slab will then have a different end pointer. This is necessary to ensure
that end markers can be matched to the source slab during cmpxchg_local.

Bring back the use of the mapping field by SLUB since we would otherwise have
to call a relatively expensive function page_address() in __slab_alloc().  Use
of the mapping field allows avoiding a call to page_address() in various other
functions as well.

There is no need to change the page_mapping() function since bit 0 is set on
the mapping as also for anonymous pages.  page_mapping(slab_page) will
therefore still return NULL although the mapping field is overloaded.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/mm_types.h
mm/slub.c