Re: [PATCH v4 1/4] mm,page_alloc: Bail out earlier on -ENOMEM in alloc_contig_migrate_range

From: Vlastimil Babka
Date: Mon Mar 15 2021 - 07:01:40 EST


On 3/10/21 4:08 PM, Oscar Salvador wrote:
> Currently, __alloc_contig_migrate_range can generate -EINTR, -ENOMEM or -EBUSY,
> and report them down the chain.
> The problem is that when migrate_pages() reports -ENOMEM, we keep going till we
> exhaust all the try-attempts (5 at the moment) instead of bailing out.
>
> migrate_pages bails out right away on -ENOMEM because it is considered a fatal
> error. Do the same here instead of keep going and retrying.
>
> Signed-off-by: Oscar Salvador <osalvador@xxxxxxx>

Acked-by: Vlastimil Babka <vbabka@xxxxxxx>

> ---
> mm/page_alloc.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 3e4b29ee2b1e..94467f1b85ff 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -8484,7 +8484,7 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
> }
> tries = 0;
> } else if (++tries == 5) {
> - ret = ret < 0 ? ret : -EBUSY;
> + ret = -EBUSY;
> break;
> }
>
> @@ -8494,6 +8494,12 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
>
> ret = migrate_pages(&cc->migratepages, alloc_migration_target,
> NULL, (unsigned long)&mtc, cc->mode, MR_CONTIG_RANGE);
> + /*
> + * On -ENOMEM, migrate_pages() bails out right away. It is pointless
> + * to retry again over this error, so do the same here.
> + */
> + if (ret == -ENOMEM)
> + break;
> }
> if (ret < 0) {
> putback_movable_pages(&cc->migratepages);
>