Messages in this thread Patch in this message | | | Date | Tue, 22 Jan 2008 15:12:20 -0800 (PST) | From | Christoph Lameter <> | Subject | Re: crash in kmem_cache_init |
| |
On Wed, 23 Jan 2008, Pekka Enberg wrote:
> When we call fallback_alloc() because the current node has ->nodelists set to > NULL, we end up calling kmem_getpages() with -1 as the node id which is then > translated to numa_node_id() by alloc_pages_node. But the reason we called > fallback_alloc() in the first place is because numa_node_id() doesn't have a > ->nodelist which makes cache_grow() oops.
Right, if nodeid == -1 then we need to call alloc_pages... Essentiall a revert of 50c85a19e7b3928b5b5188524c44ffcbacdd4e35 from 2005.
But I doubt that this is it. The fallback logic was added later and it worked fine.
--- mm/slab.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
Index: linux-2.6/mm/slab.c =================================================================== --- linux-2.6.orig/mm/slab.c 2008-01-22 15:05:26.185452369 -0800 +++ linux-2.6/mm/slab.c 2008-01-22 15:05:59.301637009 -0800 @@ -1668,7 +1668,11 @@ static void *kmem_getpages(struct kmem_c if (cachep->flags & SLAB_RECLAIM_ACCOUNT) flags |= __GFP_RECLAIMABLE; - page = alloc_pages_node(nodeid, flags, cachep->gfporder); + if (nodeid == -1) + page = alloc_pages(flags, cachep->gfporder); + else + page = alloc_pages_node(nodeid, flags, cachep->gfporder); + if (!page) return NULL;
| |