Re: [PATCH V5 3/4] mm/sparse-vmemmap: Generalise vmemmap_populate_hugepages()

From: Will Deacon
Date: Fri Jul 22 2022 - 05:26:04 EST


On Thu, Jul 21, 2022 at 09:04:18PM +0800, Huacai Chen wrote:
> diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
> index 0abcb0a5f1b5..eafd084b8e19 100644
> --- a/mm/sparse-vmemmap.c
> +++ b/mm/sparse-vmemmap.c
> @@ -694,6 +694,69 @@ int __meminit vmemmap_populate_basepages(unsigned long start, unsigned long end,
> return vmemmap_populate_range(start, end, node, altmap, NULL);
> }
>
> +void __weak __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node,
> + unsigned long addr, unsigned long next)
> +{
> +}
> +
> +int __weak __meminit vmemmap_check_pmd(pmd_t *pmd, int node, unsigned long addr,
> + unsigned long next)
> +{
> + return 0;
> +}
> +
> +int __meminit vmemmap_populate_hugepages(unsigned long start, unsigned long end,
> + int node, struct vmem_altmap *altmap)
> +{
> + unsigned long addr;
> + unsigned long next;
> + pgd_t *pgd;
> + p4d_t *p4d;
> + pud_t *pud;
> + pmd_t *pmd;
> +
> + for (addr = start; addr < end; addr = next) {
> + next = pmd_addr_end(addr, end);
> +
> + pgd = vmemmap_pgd_populate(addr, node);
> + if (!pgd)
> + return -ENOMEM;
> +
> + p4d = vmemmap_p4d_populate(pgd, addr, node);
> + if (!p4d)
> + return -ENOMEM;
> +
> + pud = vmemmap_pud_populate(p4d, addr, node);
> + if (!pud)
> + return -ENOMEM;
> +
> + pmd = pmd_offset(pud, addr);
> + if (pmd_none(READ_ONCE(*pmd))) {
> + void *p;
> +
> + p = vmemmap_alloc_block_buf(PMD_SIZE, node, altmap);
> + if (p) {
> + vmemmap_set_pmd(pmd, p, node, addr, next);
> + continue;
> + } else if (altmap) {
> + /*
> + * No fallback: In any case we care about, the
> + * altmap should be reasonably sized and aligned
> + * such that vmemmap_alloc_block_buf() will always
> + * succeed. If there is no more space in the altmap
> + * and we'd have to fallback to PTE (highly unlikely).

Can you tweak the last couple of sentences please, as they don't make sense
to me? To be specific, I'd suggest replacing:

"If there is no more space in the altmap and we'd have to fallback to PTE
(highly unlikely). That could indicate an altmap-size configuration
issue."

with something like:

"For consistency with the PTE case, return an error here as failure could
indicate a configuration issue with the size of the altmap."

With that:

Acked-by: Will Deacon <will@xxxxxxxxxx>

Will