On Tue, Jan 15, 2013 at 03:46:17PM +0000, Christoph Lameter wrote: > On Tue, 15 Jan 2013, Joonsoo Kim wrote: > > > There is a subtle bug when calculating a number of acquired objects. > > After acquire_slab() is executed at first, page->inuse is same as > > page->objects, then, available is always 0. So, we always go next > > iteration. > > page->inuse is always < page->objects because the partial list is not used > for slabs that are fully allocated. page->inuse == page->objects means > that no objects are available on the slab and therefore the slab would > have been removed from the partial list. Currently, we calculate "available = page->objects - page->inuse", after acquire_slab() is called in get_partial_node(). In acquire_slab() with mode = 1, we always set new.inuse = page->objects. So acquire_slab(s, n, page, object == NULL); if (!object) { c->page = page; stat(s, ALLOC_FROM_PARTIAL); object = t; available = page->objects - page->inuse; !!!!!! available is always 0 !!!!!! } else { available = put_cpu_partial(s, page, 0); stat(s, CPU_PARTIAL_NODE); } Therefore, "available > s->cpu_partial / 2" is always false and we always go to second iteration. This patch correct this problem. > > After that, we don't need return value of put_cpu_partial(). > > So remove it. > > Hmmm... The code looks a bit easier to understand than what we have right now. > > Could you try to explain it better? > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@xxxxxxxxx. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>