Re: [RFC 2/7] mm/vmalloc: Support non-blocking GFP flags in alloc_vmap_area()

Michal Hocko
2025-07-07T07:11:41Z

On Fri 04-07-25 17:25:32, Uladzislau Rezki wrote:
[...]
> @@ -2030,7 +2033,8 @@ static struct vmap_area *alloc_vmap_area(unsigned long size,
> */
> va = node_alloc(size, align, vstart, vend, &addr, &vn_id);
> if (!va) {
> - gfp_mask = gfp_mask & GFP_RECLAIM_MASK;
> + if (allow_block)
> + gfp_mask = gfp_mask & GFP_RECLAIM_MASK;

I don't follow here and is this even correct?

>
> va = kmem_cache_alloc_node(vmap_area_cachep, gfp_mask, node);
> if (unlikely(!va))
> @@ -2057,8 +2061,14 @@ static struct vmap_area *alloc_vmap_area(unsigned long size,
> * If an allocation fails, the error value is
> * returned. Therefore trigger the overflow path.
> */
> - if (IS_ERR_VALUE(addr))
> + if (IS_ERR_VALUE(addr)) {
> + if (!allow_block) {
> + kmem_cache_free(vmap_area_cachep, va);
> + return ERR_PTR(-ENOMEM);

I would suggest to add a comment for this. Something like

for blockable requests trigger the overflow paths because that
relies on vmap_purge_lock mutex and blocking notifiers.

> + }
> +
> goto overflow;
> + }
>
> va->va_start = addr;
> va->va_end = addr + size;
> --
> 2.39.5

--
Michal Hocko
SUSE Labs