Message ID | 20210121175502.274391-3-minchan@kernel.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers |
Received: from vger.kernel.org ([23.128.96.18]) by www.linuxtv.org with esmtp (Exim 4.92) (envelope-from <linux-media-owner@vger.kernel.org>) id 1l2eCO-007d84-UI; Thu, 21 Jan 2021 17:56:49 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389361AbhAUR4l (ORCPT <rfc822;mkrufky@linuxtv.org> + 1 other); Thu, 21 Jan 2021 12:56:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40774 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389229AbhAURzy (ORCPT <rfc822;linux-media@vger.kernel.org>); Thu, 21 Jan 2021 12:55:54 -0500 Received: from mail-pl1-x629.google.com (mail-pl1-x629.google.com [IPv6:2607:f8b0:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F682C0613D6; Thu, 21 Jan 2021 09:55:13 -0800 (PST) Received: by mail-pl1-x629.google.com with SMTP id d4so1711542plh.5; Thu, 21 Jan 2021 09:55:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gPMjM19aJ4pm3ETJElwKqqAg8qqzpXB97r3PbN2RvL8=; b=qDC+o38edBIaLnG8PWToxRhj0mPMeIfGyClNNZGIdiSSXZ2tJZWeGMSjqb6Huno5Je +s9NpaIPVTqyciyZTwKM5kcwYq2dDpuaC0zoITN6bASo1/oCbfUYZKU1WDHQFpR4oTNg Q+2MMzLxdK1Ode8CPyEpokjv+oVgNPg+KGhhdt3i2NU2HG/DmJKDhjdILm/UOXIjpOai er6lOvs1xiyuvzkQUHTmK/7TJ35rFG3Qq4hWmU2S0uFXV8TnSr3Uu+mgP7eff89fbX4D Pa584ZSykXNIjOtQdY8kLxVwg4OVsCPqbdHgBWm//V/4HNQhBVmyo2f3msnkwFwkGnCO 2CGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=gPMjM19aJ4pm3ETJElwKqqAg8qqzpXB97r3PbN2RvL8=; b=tTIA/jVHiaWhFtKmkLmeBusMNi3TEo0mf+FoqBugcWub+nwYbCFANmEDPMT3qNc1JM /Qo3rRGVHHbPBk3qZh7Mksh1xAym+WJmDtO0vrP/2txQi8opK2bx7bdOp8jwcMEN88gH W2q8nldW+SwdzH+9UNemNxtIsafTT7LCdu2Vn0NHAuzj3E5e7bs7x+48qj10bDtb3C2K z7O7jwQmotu8ejQqBdvwPyOyk+YOef4dOwYtheIP7T4dYS1NwmxKXehA4beWkXA4sKzN iJmxwDBCXVISSlf/KvEIbjfl3en169+/SBL/q2SJ+5gWi0wrnM3JNDXQFoDNnYoA4cu3 Z6LA== X-Gm-Message-State: AOAM532CDtC9IBzIYiTavQ6sOq2dlND4oq9SHORays1d9ET1GZLId40G mfvqFcfozM4rHDcRu/q06/Y= X-Google-Smtp-Source: ABdhPJwua3dS85PxEqSvzV1XHGSp3rtEG3Evxsrqo12dFSbOhRShx1GThlZKPz/+p0B1yNRZEi2OWw== X-Received: by 2002:a17:902:59c7:b029:de:25e7:2426 with SMTP id d7-20020a17090259c7b02900de25e72426mr424509plj.21.1611251713128; Thu, 21 Jan 2021 09:55:13 -0800 (PST) Received: from bbox-1.mtv.corp.google.com ([2620:15c:211:201:74d0:bb24:e25e:dc4d]) by smtp.gmail.com with ESMTPSA id t2sm6897317pju.19.2021.01.21.09.55.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Jan 2021 09:55:12 -0800 (PST) Sender: Minchan Kim <minchan.kim@gmail.com> From: Minchan Kim <minchan@kernel.org> To: Andrew Morton <akpm@linux-foundation.org> Cc: linux-mm <linux-mm@kvack.org>, LKML <linux-kernel@vger.kernel.org>, hyesoo.yu@samsung.com, david@redhat.com, mhocko@suse.com, surenb@google.com, pullip.cho@samsung.com, joaodias@google.com, hridya@google.com, john.stultz@linaro.org, sumit.semwal@linaro.org, linux-media@vger.kernel.org, devicetree@vger.kernel.org, hch@infradead.org, robh+dt@kernel.org, linaro-mm-sig@lists.linaro.org, Minchan Kim <minchan@kernel.org> Subject: [PATCH v4 2/4] mm: failfast mode with __GFP_NORETRY in alloc_contig_range Date: Thu, 21 Jan 2021 09:55:00 -0800 Message-Id: <20210121175502.274391-3-minchan@kernel.org> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog In-Reply-To: <20210121175502.274391-1-minchan@kernel.org> References: <20210121175502.274391-1-minchan@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org X-LSpam-Score: -2.9 (--) X-LSpam-Report: No, score=-2.9 required=5.0 tests=BAYES_00=-1.9,DKIMWL_WL_MED=0.001,DKIM_SIGNED=0.1,DKIM_VALID=-0.1,MAILING_LIST_MULTI=-1 autolearn=ham autolearn_force=no |
Series |
Chunk Heap Support on DMA-HEAP
|
|
Commit Message
Minchan Kim
Jan. 21, 2021, 5:55 p.m. UTC
Contiguous memory allocation can be stalled due to waiting
on page writeback and/or page lock which causes unpredictable
delay. It's a unavoidable cost for the requestor to get *big*
contiguous memory but it's expensive for *small* contiguous
memory(e.g., order-4) because caller could retry the request
in different range where would have easy migratable pages
without stalling.
This patch introduce __GFP_NORETRY as compaction gfp_mask in
alloc_contig_range so it will fail fast without blocking
when it encounters pages needed waiting.
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
mm/page_alloc.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
Comments
On Thu 21-01-21 09:55:00, Minchan Kim wrote: > Contiguous memory allocation can be stalled due to waiting > on page writeback and/or page lock which causes unpredictable > delay. It's a unavoidable cost for the requestor to get *big* > contiguous memory but it's expensive for *small* contiguous > memory(e.g., order-4) because caller could retry the request > in different range where would have easy migratable pages > without stalling. > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > alloc_contig_range so it will fail fast without blocking > when it encounters pages needed waiting. I am not against controling how hard this allocator tries with gfp mask but this changelog is rather void on any data and any user. It is also rather dubious to have retries when then caller says to not retry. Also why didn't you consider GFP_NOWAIT semantic for non blocking mode? > Signed-off-by: Minchan Kim <minchan@kernel.org> > --- > mm/page_alloc.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index b031a5ae0bd5..1cdc3ee0b22e 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -8491,12 +8491,16 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, > unsigned int nr_reclaimed; > unsigned long pfn = start; > unsigned int tries = 0; > + unsigned int max_tries = 5; > int ret = 0; > struct migration_target_control mtc = { > .nid = zone_to_nid(cc->zone), > .gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL, > }; > > + if (cc->alloc_contig && cc->mode == MIGRATE_ASYNC) > + max_tries = 1; > + > migrate_prep(); > > while (pfn < end || !list_empty(&cc->migratepages)) { > @@ -8513,7 +8517,7 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, > break; > } > tries = 0; > - } else if (++tries == 5) { > + } else if (++tries == max_tries) { > ret = ret < 0 ? ret : -EBUSY; > break; > } > @@ -8564,7 +8568,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, > .nr_migratepages = 0, > .order = -1, > .zone = page_zone(pfn_to_page(start)), > - .mode = MIGRATE_SYNC, > + .mode = gfp_mask & __GFP_NORETRY ? MIGRATE_ASYNC : MIGRATE_SYNC, > .ignore_skip_hint = true, > .no_set_skip_hint = true, > .gfp_mask = current_gfp_context(gfp_mask), > -- > 2.30.0.296.g2bfb1c46d8-goog
On Mon 25-01-21 14:12:02, Michal Hocko wrote: > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > Contiguous memory allocation can be stalled due to waiting > > on page writeback and/or page lock which causes unpredictable > > delay. It's a unavoidable cost for the requestor to get *big* > > contiguous memory but it's expensive for *small* contiguous > > memory(e.g., order-4) because caller could retry the request > > in different range where would have easy migratable pages > > without stalling. > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > alloc_contig_range so it will fail fast without blocking > > when it encounters pages needed waiting. > > I am not against controling how hard this allocator tries with gfp mask > but this changelog is rather void on any data and any user. OK, I can see that a user is in the last patch.
On Mon, Jan 25, 2021 at 02:12:00PM +0100, Michal Hocko wrote: > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > Contiguous memory allocation can be stalled due to waiting > > on page writeback and/or page lock which causes unpredictable > > delay. It's a unavoidable cost for the requestor to get *big* > > contiguous memory but it's expensive for *small* contiguous > > memory(e.g., order-4) because caller could retry the request > > in different range where would have easy migratable pages > > without stalling. > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > alloc_contig_range so it will fail fast without blocking > > when it encounters pages needed waiting. > > I am not against controling how hard this allocator tries with gfp mask > but this changelog is rather void on any data and any user. > > It is also rather dubious to have retries when then caller says to not > retry. Since max_tries is 1 with ++tries, it shouldn't retry. > > Also why didn't you consider GFP_NOWAIT semantic for non blocking mode? GFP_NOWAIT seems to be low(specific) flags rather than the one I want to express. Even though I said only page writeback/lock in the description, the goal is to avoid costly operations we might find later so such "failfast", I thought GFP_NORETRY would be good fit. > > > Signed-off-by: Minchan Kim <minchan@kernel.org> > > --- > > mm/page_alloc.c | 8 ++++++-- > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > index b031a5ae0bd5..1cdc3ee0b22e 100644 > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -8491,12 +8491,16 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, > > unsigned int nr_reclaimed; > > unsigned long pfn = start; > > unsigned int tries = 0; > > + unsigned int max_tries = 5; > > int ret = 0; > > struct migration_target_control mtc = { > > .nid = zone_to_nid(cc->zone), > > .gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL, > > }; > > > > + if (cc->alloc_contig && cc->mode == MIGRATE_ASYNC) > > + max_tries = 1; > > + > > migrate_prep(); > > > > while (pfn < end || !list_empty(&cc->migratepages)) { > > @@ -8513,7 +8517,7 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, > > break; > > } > > tries = 0; > > - } else if (++tries == 5) { > > + } else if (++tries == max_tries) { > > ret = ret < 0 ? ret : -EBUSY; > > break; > > } > > @@ -8564,7 +8568,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, > > .nr_migratepages = 0, > > .order = -1, > > .zone = page_zone(pfn_to_page(start)), > > - .mode = MIGRATE_SYNC, > > + .mode = gfp_mask & __GFP_NORETRY ? MIGRATE_ASYNC : MIGRATE_SYNC, > > .ignore_skip_hint = true, > > .no_set_skip_hint = true, > > .gfp_mask = current_gfp_context(gfp_mask), > > -- > > 2.30.0.296.g2bfb1c46d8-goog > > -- > Michal Hocko > SUSE Labs
On Mon 25-01-21 11:33:36, Minchan Kim wrote: > On Mon, Jan 25, 2021 at 02:12:00PM +0100, Michal Hocko wrote: > > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > > Contiguous memory allocation can be stalled due to waiting > > > on page writeback and/or page lock which causes unpredictable > > > delay. It's a unavoidable cost for the requestor to get *big* > > > contiguous memory but it's expensive for *small* contiguous > > > memory(e.g., order-4) because caller could retry the request > > > in different range where would have easy migratable pages > > > without stalling. > > > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > > alloc_contig_range so it will fail fast without blocking > > > when it encounters pages needed waiting. > > > > I am not against controling how hard this allocator tries with gfp mask > > but this changelog is rather void on any data and any user. > > > > It is also rather dubious to have retries when then caller says to not > > retry. > > Since max_tries is 1 with ++tries, it shouldn't retry. OK, I have missed that. This is a tricky code. ASYNC mode should be completely orthogonal to the retries count. Those are different things. Page allocator does an explicit bail out based on __GFP_NORETRY. You should be doing the same. > > > > Also why didn't you consider GFP_NOWAIT semantic for non blocking mode? > > GFP_NOWAIT seems to be low(specific) flags rather than the one I want to > express. Even though I said only page writeback/lock in the description, > the goal is to avoid costly operations we might find later so such > "failfast", I thought GFP_NORETRY would be good fit. I suspect you are too focused on implementation details here. Think about the indended semantic. Callers of this functionality will not think about those (I hope because if they rely on these details then the whole thing will become unmaintainable because any change would require an audit of all existing users). All you should be caring about is to control how expensive the call can be. GFP_NOWAIT is not really low level from that POV. It gives you a very lightweight non-sleeping attempt to allocate. GFP_NORETRY will give you potentially sleeping but an opportunistic-easy-to-fail attempt. And so on. See how that is absolutely free of any page writeback or any specific locking.
On Tue, Jan 26, 2021 at 08:44:49AM +0100, Michal Hocko wrote: > On Mon 25-01-21 11:33:36, Minchan Kim wrote: > > On Mon, Jan 25, 2021 at 02:12:00PM +0100, Michal Hocko wrote: > > > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > > > Contiguous memory allocation can be stalled due to waiting > > > > on page writeback and/or page lock which causes unpredictable > > > > delay. It's a unavoidable cost for the requestor to get *big* > > > > contiguous memory but it's expensive for *small* contiguous > > > > memory(e.g., order-4) because caller could retry the request > > > > in different range where would have easy migratable pages > > > > without stalling. > > > > > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > > > alloc_contig_range so it will fail fast without blocking > > > > when it encounters pages needed waiting. > > > > > > I am not against controling how hard this allocator tries with gfp mask > > > but this changelog is rather void on any data and any user. > > > > > > It is also rather dubious to have retries when then caller says to not > > > retry. > > > > Since max_tries is 1 with ++tries, it shouldn't retry. > > OK, I have missed that. This is a tricky code. ASYNC mode should be > completely orthogonal to the retries count. Those are different things. > Page allocator does an explicit bail out based on __GFP_NORETRY. You > should be doing the same. A concern with __GFP_NOWAIT is regardless of flags passed to cma_alloc, internal implementation of alloc_contig_range inside will use blockable operation. See __alloc_contig_migrate_range. If we go with __GFP_NOWAIT, we should propagate the gfp_mask inside of __alloc_contig_migrate_range to make cma_alloc consistent with alloc_pages. (IIUC, that's what you want - make gfp_mask consistent between cma_alloc and alloc_pages) but I am worry about the direction will make complicate situation since cma invovles migration context as well as target page allocation context. Sometime, the single gfp flag could be trouble to express both contexts all at once. > > > > > > > Also why didn't you consider GFP_NOWAIT semantic for non blocking mode? > > > > GFP_NOWAIT seems to be low(specific) flags rather than the one I want to > > express. Even though I said only page writeback/lock in the description, > > the goal is to avoid costly operations we might find later so such > > "failfast", I thought GFP_NORETRY would be good fit. > > I suspect you are too focused on implementation details here. Think > about the indended semantic. Callers of this functionality will not > think about those (I hope because if they rely on these details then the > whole thing will become unmaintainable because any change would require > an audit of all existing users). All you should be caring about is to > control how expensive the call can be. GFP_NOWAIT is not really low > level from that POV. It gives you a very lightweight non-sleeping > attempt to allocate. GFP_NORETRY will give you potentially sleeping but > an opportunistic-easy-to-fail attempt. And so on. See how that is > absolutely free of any page writeback or any specific locking. With above reason I mentioned, I wanted to express __GFP_NORETRY as "opportunistic-easy-to-fail attempt" to support cma_alloc as "failfast" for migration context. > -- > Michal Hocko > SUSE Labs
On Tue 26-01-21 11:10:18, Minchan Kim wrote: > On Tue, Jan 26, 2021 at 08:44:49AM +0100, Michal Hocko wrote: > > On Mon 25-01-21 11:33:36, Minchan Kim wrote: > > > On Mon, Jan 25, 2021 at 02:12:00PM +0100, Michal Hocko wrote: > > > > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > > > > Contiguous memory allocation can be stalled due to waiting > > > > > on page writeback and/or page lock which causes unpredictable > > > > > delay. It's a unavoidable cost for the requestor to get *big* > > > > > contiguous memory but it's expensive for *small* contiguous > > > > > memory(e.g., order-4) because caller could retry the request > > > > > in different range where would have easy migratable pages > > > > > without stalling. > > > > > > > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > > > > alloc_contig_range so it will fail fast without blocking > > > > > when it encounters pages needed waiting. > > > > > > > > I am not against controling how hard this allocator tries with gfp mask > > > > but this changelog is rather void on any data and any user. > > > > > > > > It is also rather dubious to have retries when then caller says to not > > > > retry. > > > > > > Since max_tries is 1 with ++tries, it shouldn't retry. > > > > OK, I have missed that. This is a tricky code. ASYNC mode should be > > completely orthogonal to the retries count. Those are different things. > > Page allocator does an explicit bail out based on __GFP_NORETRY. You > > should be doing the same. > > A concern with __GFP_NOWAIT is regardless of flags passed to cma_alloc, > internal implementation of alloc_contig_range inside will use blockable > operation. See __alloc_contig_migrate_range. Yes it is now. But nothing should prevent from making it non blockable. > If we go with __GFP_NOWAIT, we should propagate the gfp_mask inside of > __alloc_contig_migrate_range to make cma_alloc consistent with alloc_pages. Absolutely. You should be doing that anyway. As I've said above you shouldn't rely on side effects like ASYNC mode. > (IIUC, that's what you want - make gfp_mask consistent between cma_alloc > and alloc_pages) but I am worry about the direction will make complicate > situation since cma invovles migration context as well as target page > allocation context. Sometime, the single gfp flag could be trouble > to express both contexts all at once. I am not sure I see your concern. > > > > Also why didn't you consider GFP_NOWAIT semantic for non blocking mode? > > > > > > GFP_NOWAIT seems to be low(specific) flags rather than the one I want to > > > express. Even though I said only page writeback/lock in the description, > > > the goal is to avoid costly operations we might find later so such > > > "failfast", I thought GFP_NORETRY would be good fit. > > > > I suspect you are too focused on implementation details here. Think > > about the indended semantic. Callers of this functionality will not > > think about those (I hope because if they rely on these details then the > > whole thing will become unmaintainable because any change would require > > an audit of all existing users). All you should be caring about is to > > control how expensive the call can be. GFP_NOWAIT is not really low > > level from that POV. It gives you a very lightweight non-sleeping > > attempt to allocate. GFP_NORETRY will give you potentially sleeping but > > an opportunistic-easy-to-fail attempt. And so on. See how that is > > absolutely free of any page writeback or any specific locking. > > With above reason I mentioned, I wanted to express __GFP_NORETRY as > "opportunistic-easy-to-fail attempt" to support cma_alloc as "failfast" > for migration context. Yes that is fine. And please note that I do not push for NOWAIT semantic. If there is no user for that now then fine.
On Tue, Jan 26, 2021 at 08:44:49AM +0100, Michal Hocko wrote: > On Mon 25-01-21 11:33:36, Minchan Kim wrote: > > On Mon, Jan 25, 2021 at 02:12:00PM +0100, Michal Hocko wrote: > > > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > > > Contiguous memory allocation can be stalled due to waiting > > > > on page writeback and/or page lock which causes unpredictable > > > > delay. It's a unavoidable cost for the requestor to get *big* > > > > contiguous memory but it's expensive for *small* contiguous > > > > memory(e.g., order-4) because caller could retry the request > > > > in different range where would have easy migratable pages > > > > without stalling. > > > > > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > > > alloc_contig_range so it will fail fast without blocking > > > > when it encounters pages needed waiting. > > > > > > I am not against controling how hard this allocator tries with gfp mask > > > but this changelog is rather void on any data and any user. > > > > > > It is also rather dubious to have retries when then caller says to not > > > retry. > > > > Since max_tries is 1 with ++tries, it shouldn't retry. > > OK, I have missed that. This is a tricky code. ASYNC mode should be > completely orthogonal to the retries count. Those are different things. > Page allocator does an explicit bail out based on __GFP_NORETRY. You > should be doing the same. Before sending next revision, let me check this part again. I want to use __GFP_NORETRY to indicate "opportunistic-easy-to-fail attempt" and I want to use ASYNC migrate_mode to help the goal. Do you see the problem?
On Wed 27-01-21 12:42:45, Minchan Kim wrote: > On Tue, Jan 26, 2021 at 08:44:49AM +0100, Michal Hocko wrote: > > On Mon 25-01-21 11:33:36, Minchan Kim wrote: > > > On Mon, Jan 25, 2021 at 02:12:00PM +0100, Michal Hocko wrote: > > > > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > > > > Contiguous memory allocation can be stalled due to waiting > > > > > on page writeback and/or page lock which causes unpredictable > > > > > delay. It's a unavoidable cost for the requestor to get *big* > > > > > contiguous memory but it's expensive for *small* contiguous > > > > > memory(e.g., order-4) because caller could retry the request > > > > > in different range where would have easy migratable pages > > > > > without stalling. > > > > > > > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > > > > alloc_contig_range so it will fail fast without blocking > > > > > when it encounters pages needed waiting. > > > > > > > > I am not against controling how hard this allocator tries with gfp mask > > > > but this changelog is rather void on any data and any user. > > > > > > > > It is also rather dubious to have retries when then caller says to not > > > > retry. > > > > > > Since max_tries is 1 with ++tries, it shouldn't retry. > > > > OK, I have missed that. This is a tricky code. ASYNC mode should be > > completely orthogonal to the retries count. Those are different things. > > Page allocator does an explicit bail out based on __GFP_NORETRY. You > > should be doing the same. > > Before sending next revision, let me check this part again. > > I want to use __GFP_NORETRY to indicate "opportunistic-easy-to-fail attempt" > and I want to use ASYNC migrate_mode to help the goal. > > Do you see the problem? No, as I've said. This is a normal NORETRY policy. And ASYNC migration is a mere implementation detail you do not have bother your users about. This is the semantic view. From the implementation POV it should be the gfp mask to drive decisions rather than a random (ASYNC) flag to control retries as you did here.
On Thu, Jan 28, 2021 at 08:53:25AM +0100, Michal Hocko wrote: > On Wed 27-01-21 12:42:45, Minchan Kim wrote: > > On Tue, Jan 26, 2021 at 08:44:49AM +0100, Michal Hocko wrote: > > > On Mon 25-01-21 11:33:36, Minchan Kim wrote: > > > > On Mon, Jan 25, 2021 at 02:12:00PM +0100, Michal Hocko wrote: > > > > > On Thu 21-01-21 09:55:00, Minchan Kim wrote: > > > > > > Contiguous memory allocation can be stalled due to waiting > > > > > > on page writeback and/or page lock which causes unpredictable > > > > > > delay. It's a unavoidable cost for the requestor to get *big* > > > > > > contiguous memory but it's expensive for *small* contiguous > > > > > > memory(e.g., order-4) because caller could retry the request > > > > > > in different range where would have easy migratable pages > > > > > > without stalling. > > > > > > > > > > > > This patch introduce __GFP_NORETRY as compaction gfp_mask in > > > > > > alloc_contig_range so it will fail fast without blocking > > > > > > when it encounters pages needed waiting. > > > > > > > > > > I am not against controling how hard this allocator tries with gfp mask > > > > > but this changelog is rather void on any data and any user. > > > > > > > > > > It is also rather dubious to have retries when then caller says to not > > > > > retry. > > > > > > > > Since max_tries is 1 with ++tries, it shouldn't retry. > > > > > > OK, I have missed that. This is a tricky code. ASYNC mode should be > > > completely orthogonal to the retries count. Those are different things. > > > Page allocator does an explicit bail out based on __GFP_NORETRY. You > > > should be doing the same. > > > > Before sending next revision, let me check this part again. > > > > I want to use __GFP_NORETRY to indicate "opportunistic-easy-to-fail attempt" > > and I want to use ASYNC migrate_mode to help the goal. > > > > Do you see the problem? > > No, as I've said. This is a normal NORETRY policy. And ASYNC migration > is a mere implementation detail you do not have bother your users about. > This is the semantic view. From the implementation POV it should be the > gfp mask to drive decisions rather than a random (ASYNC) flag to control > retries as you did here. Make sense. Let me cook next revision. Thanks for the review, Michal.
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index b031a5ae0bd5..1cdc3ee0b22e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8491,12 +8491,16 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, unsigned int nr_reclaimed; unsigned long pfn = start; unsigned int tries = 0; + unsigned int max_tries = 5; int ret = 0; struct migration_target_control mtc = { .nid = zone_to_nid(cc->zone), .gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL, }; + if (cc->alloc_contig && cc->mode == MIGRATE_ASYNC) + max_tries = 1; + migrate_prep(); while (pfn < end || !list_empty(&cc->migratepages)) { @@ -8513,7 +8517,7 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, break; } tries = 0; - } else if (++tries == 5) { + } else if (++tries == max_tries) { ret = ret < 0 ? ret : -EBUSY; break; } @@ -8564,7 +8568,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, .nr_migratepages = 0, .order = -1, .zone = page_zone(pfn_to_page(start)), - .mode = MIGRATE_SYNC, + .mode = gfp_mask & __GFP_NORETRY ? MIGRATE_ASYNC : MIGRATE_SYNC, .ignore_skip_hint = true, .no_set_skip_hint = true, .gfp_mask = current_gfp_context(gfp_mask),