On 10.03.21 16:08, 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 <osalva...@suse.de>
---
  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;

I would have thought we could also be able to get other fatal errors from migrate_pages(), but doesn't seem like it

Reviewed-by: David Hildenbrand <da...@redhat.com>


--
Thanks,

David / dhildenb

Reply via email to