Messages in this thread | | | Date | Wed, 16 Jan 2013 17:41:14 +0900 | From | Joonsoo Kim <> | Subject | Re: [PATCH 1/3] slub: correct to calculate num of acquired objects in get_partial_node() |
| |
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@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
| |