Re: [PATCH -next] slub: set PG_slab on all of slab pages

From: Namhyung Kim
Date: Fri Mar 02 2012 - 02:13:00 EST


2012-03-02 12:03 AM, Christoph Lameter wrote:
On Thu, 1 Mar 2012, Namhyung Kim wrote:

You cannot free a tail page of a compound higher order page independently.
You must free the whole compound.


I meant freeing a *slab object* resides in a compound page using buddy
system API (e.g. free_pages). I know it's definitely a programming
error. However there's no safety net to protect and/or warn such a
misbehavior AFAICS - except for head page which has PG_slab set - when
it happened by any chance.

?? One generally passed a struct page pointer to the page allocator. Slab
allocator takes pointers to object. The calls that take a pointer to an
object must have a page aligned value.


Please see free_pages(). It converts the pointer using virt_to_page().


Without it, it might be possible to free part of tail pages silently,
and cause unexpected not-so-funny results some time later. It should be
hard to find out.

Ok then fix the page allocator to BUG() on tail pages. That is an issue
with the page allocator not the slab allocator.

Adding PG_tail to the flags checked on free should do the trick (at least
for 64 bit).


Yeah, but doing it requires to change free path of compound pages. It seems freeing normal compound pages would not clear PG_head/tail bits before free_pages_check() called. I guess moving destroy_compound_page() into free_pages_prepare() will solved this issue but I want to make sure it's the right approach since I have no idea how it affects huge page behaviors.

Besides, as it has no effect on 32 bit kernels I still want add the PG_slab flag to those pages. If you care about the performance of hot path, how about adding it under debug configurations at least?


Thanks,
Namhyung Kim
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/