• Christoph Lameter's avatar
    SLUB: Use unique end pointer for each slab page. · 683d0baa
    Christoph Lameter authored
    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: default avatarChristoph Lameter <clameter@sgi.com>
    Cc: Pekka Enberg <penberg@cs.helsinki.fi>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    683d0baa
slub.c 98.1 KB