On 07/01/18 at 10:04pm, Pavel Tatashin wrote:
> +/*
> + * Initialize sparse on a specific node. The node spans [pnum_begin, 
> pnum_end)
> + * And number of present sections in this node is map_count.
> + */
> +void __init sparse_init_nid(int nid, unsigned long pnum_begin,
> +                                unsigned long pnum_end,
> +                                unsigned long map_count)
> +{
> +     unsigned long pnum, usemap_longs, *usemap, map_index;
> +     struct page *map, *map_base;
> +
> +     usemap_longs = BITS_TO_LONGS(SECTION_BLOCKFLAGS_BITS);
> +     usemap = sparse_early_usemaps_alloc_pgdat_section(NODE_DATA(nid),
> +                                                       usemap_size() *
> +                                                       map_count);
> +     if (!usemap) {
> +             pr_err("%s: usemap allocation failed", __func__);

Wondering if we can provide more useful information for better debugging
if failed. E.g here tell on what nid the usemap allocation failed.

> +             goto failed;
> +     }
> +     map_base = sparse_populate_node(pnum_begin, pnum_end,
> +                                     map_count, nid);
> +     map_index = 0;
> +     for_each_present_section_nr(pnum_begin, pnum) {
> +             if (pnum >= pnum_end)
> +                     break;
> +
> +             BUG_ON(map_index == map_count);
> +             map = sparse_populate_node_section(map_base, map_index,
> +                                                pnum, nid);
> +             if (!map) {
> +                     pr_err("%s: memory map backing failed. Some memory will 
> not be available.",
> +                            __func__);
And here tell nid and the memory section nr failed.

> +                     pnum_begin = pnum;
> +                     goto failed;
> +             }
> +             check_usemap_section_nr(nid, usemap);
> +             sparse_init_one_section(__nr_to_section(pnum), pnum, map,
> +                                     usemap);
> +             map_index++;
> +             usemap += usemap_longs;
> +     }
> +     return;
> +failed:
> +     /* We failed to allocate, mark all the following pnums as not present */
> +     for_each_present_section_nr(pnum_begin, pnum) {
> +             struct mem_section *ms;
> +
> +             if (pnum >= pnum_end)
> +                     break;
> +             ms = __nr_to_section(pnum);
> +             ms->section_mem_map = 0;
> +     }
> +}
> +
>  /*
>   * Allocate the accumulated non-linear sections, allocate a mem_map
>   * for each and record the physical to section mapping.
> -- 
> 2.18.0
> 

Reply via email to