Re: [PATCH v3] mm: fix panic in __alloc_pages

Michal Hocko
2021-12-08T08:29:04Z

On Tue 07-12-21 17:40:36, David Hildenbrand wrote:
> On 07.12.21 17:36, Michal Hocko wrote:
> > On Tue 07-12-21 17:27:29, Michal Hocko wrote:
> > [...]
> >> So your proposal is to drop set_node_online from the patch and add it as
> >> a separate one which handles
> >> - sysfs part (i.e. do not register a node which doesn't span a
> >> physical address space)
> >> - hotplug side of (drop the pgd allocation, register node lazily
> >> when a first memblocks are registered)
> >
>
> > In other words, the first stage
> > diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> > index c5952749ad40..f9024ba09c53 100644
> > --- a/mm/page_alloc.c
> > +++ b/mm/page_alloc.c
> > @@ -6382,7 +6382,11 @@ static void __build_all_zonelists(void *data)
> > if (self && !node_online(self->node_id)) {
> > build_zonelists(self);
> > } else {
> > - for_each_online_node(nid) {
> > + /*
> > + * All possible nodes have pgdat preallocated
> > + * free_area_init
> > + */
> > + for_each_node(nid) {
> > pg_data_t *pgdat = NODE_DATA(nid);
> >
> > build_zonelists(pgdat);
> > @@ -8032,8 +8036,24 @@ void __init free_area_init(unsigned long *max_zone_pfn)
> > /* Initialise every node */
> > mminit_verify_pageflags_layout();
> > setup_nr_node_ids();
> > - for_each_online_node(nid) {
> > - pg_data_t *pgdat = NODE_DATA(nid);
> > + for_each_node(nid) {
> > + pg_data_t *pgdat;
> > +
> > + if (!node_online(nid)) {
> > + pr_warn("Node %d uninitialized by the platform. Please report with boot dmesg.\n", nid);
> > + pgdat = arch_alloc_nodedata(nid);
>
> Is the buddy fully up an running at that point? I don't think so, so we
> might have to allocate via memblock instead. But I might be wrong.

No, not only the page allocator is not ready but slab allocator used by
the generic implementation is not up yet either. I will look deeper into
this later today but I suspect the only choice is to use the memblock
allocator - same way the arch specific code allocates pgdats.

--
Michal Hocko
SUSE Labs