Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1499343 > unrolled thread
| Started by | Minchan Kim <minchan@kernel.org> |
|---|---|
| First post | 2016-10-12 07:40 +0200 |
| Last post | 2016-10-12 09:30 +0200 |
| Articles | 3 — 3 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH v2 3/4] mm: try to exhaust highatomic reserve before the OOM Minchan Kim <minchan@kernel.org> - 2016-10-12 07:40 +0200
Re: [PATCH v2 3/4] mm: try to exhaust highatomic reserve before the OOM Vlastimil Babka <vbabka@suse.cz> - 2016-10-12 09:20 +0200
Re: [PATCH v2 3/4] mm: try to exhaust highatomic reserve before the OOM Michal Hocko <mhocko@kernel.org> - 2016-10-12 09:30 +0200
| From | Minchan Kim <minchan@kernel.org> |
|---|---|
| Date | 2016-10-12 07:40 +0200 |
| Subject | [PATCH v2 3/4] mm: try to exhaust highatomic reserve before the OOM |
| Message-ID | <srkqJ-8qe-1@gated-at.bofh.it> |
It's weird to show that zone has enough free memory above min
watermark but OOMed with 4K GFP_KERNEL allocation due to
reserved highatomic pages. As last resort, try to unreserve
highatomic pages again and if it has moved pages to
non-highatmoc free list, retry reclaim once more.
Signed-off-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
mm/page_alloc.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 18808f392718..a7472426663f 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2080,7 +2080,7 @@ static void reserve_highatomic_pageblock(struct page *page, struct zone *zone,
* intense memory pressure but failed atomic allocations should be easier
* to recover from than an OOM.
*/
-static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
+static bool unreserve_highatomic_pageblock(const struct alloc_context *ac)
{
struct zonelist *zonelist = ac->zonelist;
unsigned long flags;
@@ -2088,6 +2088,7 @@ static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
struct zone *zone;
struct page *page;
int order;
+ bool ret = false;
for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->high_zoneidx,
ac->nodemask) {
@@ -2136,12 +2137,14 @@ static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
* may increase.
*/
set_pageblock_migratetype(page, ac->migratetype);
- move_freepages_block(zone, page, ac->migratetype);
+ ret = move_freepages_block(zone, page, ac->migratetype);
spin_unlock_irqrestore(&zone->lock, flags);
- return;
+ return ret;
}
spin_unlock_irqrestore(&zone->lock, flags);
}
+
+ return ret;
}
/* Remove an element from the buddy allocator from the fallback list */
@@ -3457,8 +3460,12 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
* Make sure we converge to OOM if we cannot make any progress
* several times in the row.
*/
- if (*no_progress_loops > MAX_RECLAIM_RETRIES)
+ if (*no_progress_loops > MAX_RECLAIM_RETRIES) {
+ /* Before OOM, exhaust highatomic_reserve */
+ if (unreserve_highatomic_pageblock(ac))
+ return true;
return false;
+ }
/*
* Keep reclaiming pages while there is a chance this will lead
--
2.7.4
[toc] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2016-10-12 09:20 +0200 |
| Subject | Re: [PATCH v2 3/4] mm: try to exhaust highatomic reserve before the OOM |
| Message-ID | <srlZv-16c-7@gated-at.bofh.it> |
| In reply to | #1499343 |
On 10/12/2016 07:33 AM, Minchan Kim wrote:
> It's weird to show that zone has enough free memory above min
> watermark but OOMed with 4K GFP_KERNEL allocation due to
> reserved highatomic pages. As last resort, try to unreserve
> highatomic pages again and if it has moved pages to
> non-highatmoc free list, retry reclaim once more.
I would move the details (OOM report etc) from the cover letter here, otherwise
they end up in Patch 1's changelog, which is less helpful.
> Signed-off-by: Michal Hocko <mhocko@suse.com>
> Signed-off-by: Minchan Kim <minchan@kernel.org>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
> ---
> mm/page_alloc.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 18808f392718..a7472426663f 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2080,7 +2080,7 @@ static void reserve_highatomic_pageblock(struct page *page, struct zone *zone,
> * intense memory pressure but failed atomic allocations should be easier
> * to recover from than an OOM.
> */
> -static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
> +static bool unreserve_highatomic_pageblock(const struct alloc_context *ac)
> {
> struct zonelist *zonelist = ac->zonelist;
> unsigned long flags;
> @@ -2088,6 +2088,7 @@ static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
> struct zone *zone;
> struct page *page;
> int order;
> + bool ret = false;
>
> for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->high_zoneidx,
> ac->nodemask) {
> @@ -2136,12 +2137,14 @@ static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
> * may increase.
> */
> set_pageblock_migratetype(page, ac->migratetype);
> - move_freepages_block(zone, page, ac->migratetype);
> + ret = move_freepages_block(zone, page, ac->migratetype);
> spin_unlock_irqrestore(&zone->lock, flags);
> - return;
> + return ret;
> }
> spin_unlock_irqrestore(&zone->lock, flags);
> }
> +
> + return ret;
> }
>
> /* Remove an element from the buddy allocator from the fallback list */
> @@ -3457,8 +3460,12 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
> * Make sure we converge to OOM if we cannot make any progress
> * several times in the row.
> */
> - if (*no_progress_loops > MAX_RECLAIM_RETRIES)
> + if (*no_progress_loops > MAX_RECLAIM_RETRIES) {
> + /* Before OOM, exhaust highatomic_reserve */
> + if (unreserve_highatomic_pageblock(ac))
> + return true;
> return false;
> + }
>
> /*
> * Keep reclaiming pages while there is a chance this will lead
>
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-10-12 09:30 +0200 |
| Subject | Re: [PATCH v2 3/4] mm: try to exhaust highatomic reserve before the OOM |
| Message-ID | <srm9b-19E-7@gated-at.bofh.it> |
| In reply to | #1499343 |
On Wed 12-10-16 14:33:35, Minchan Kim wrote:
> It's weird to show that zone has enough free memory above min
> watermark but OOMed with 4K GFP_KERNEL allocation due to
> reserved highatomic pages. As last resort, try to unreserve
> highatomic pages again and if it has moved pages to
> non-highatmoc free list, retry reclaim once more.
Agreed with Vlastimil on the OOM report in the changelog. The above will
not tell the reader much to understand how does the situation look like
and whether the patch is really needed in his particular situation.
Few nits below but in general looks good to me
> Signed-off-by: Michal Hocko <mhocko@suse.com>
> Signed-off-by: Minchan Kim <minchan@kernel.org>
> ---
> mm/page_alloc.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 18808f392718..a7472426663f 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2080,7 +2080,7 @@ static void reserve_highatomic_pageblock(struct page *page, struct zone *zone,
> * intense memory pressure but failed atomic allocations should be easier
> * to recover from than an OOM.
> */
> -static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
> +static bool unreserve_highatomic_pageblock(const struct alloc_context *ac)
> {
> struct zonelist *zonelist = ac->zonelist;
> unsigned long flags;
> @@ -2088,6 +2088,7 @@ static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
> struct zone *zone;
> struct page *page;
> int order;
> + bool ret = false;
no need to initialization, see below
>
> for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->high_zoneidx,
> ac->nodemask) {
> @@ -2136,12 +2137,14 @@ static void unreserve_highatomic_pageblock(const struct alloc_context *ac)
> * may increase.
> */
> set_pageblock_migratetype(page, ac->migratetype);
> - move_freepages_block(zone, page, ac->migratetype);
> + ret = move_freepages_block(zone, page, ac->migratetype);
> spin_unlock_irqrestore(&zone->lock, flags);
> - return;
> + return ret;
> }
> spin_unlock_irqrestore(&zone->lock, flags);
> }
> +
> + return ret;
return false;
> }
>
> /* Remove an element from the buddy allocator from the fallback list */
> @@ -3457,8 +3460,12 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
> * Make sure we converge to OOM if we cannot make any progress
> * several times in the row.
> */
> - if (*no_progress_loops > MAX_RECLAIM_RETRIES)
> + if (*no_progress_loops > MAX_RECLAIM_RETRIES) {
> + /* Before OOM, exhaust highatomic_reserve */
> + if (unreserve_highatomic_pageblock(ac))
> + return true;
return unreserve_highatomic_pageblock(ac);
> return false;
> + }
>
> /*
> * Keep reclaiming pages while there is a chance this will lead
> --
> 2.7.4
>
--
Michal Hocko
SUSE Labs
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web