Hello, Tang.
On Sat, Sep 26, 2015 at 05:31:07PM +0800, Tang Chen wrote:
Correct me if I'm wrong but the zonelist dictates which memory areaszonelist will be rebuilt in __offline_pages() when the zone is not populated@@ -307,13 +307,19 @@ static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask,Why not just update node_data[]->node_zonelist in the first place?
if (nid < 0)
nid = numa_node_id();
+ if (!node_online(nid))
+ nid = get_near_online_node(nid);
+
return __alloc_pages(gfp_mask, order, node_zonelist(nid, gfp_mask));
}
any more.
Here, getting the best near online node is for those cpus on memory-less
nodes.
In the original code, if nid is NUMA_NO_NODE, the node the current cpu
resides in
will be chosen. And if the node is memory-less node, the cpu will be mapped
to its
best near online node.
But this patch-set will map the cpu to its original node, so numa_node_id()
may return
a memory-less node to allocator. And then memory allocation may fail.
the page allocator is gonna try to from, right? What I'm wondering is
why we aren't handling memory-less nodes by simply updating their
zonelists. I mean, if, say, node 2 is memory-less, its zonelist can
simply point to zones from other nodes, right? What am I missing
here?
Thanks.