mm: annotate refault stalls from swap_readpage
Subsystems (2)
PATCH 1/1 mm: annotate refault stalls from swap_readpage
From: Minchan Kim <[email protected]>
If block device supports rw_page operation, it doesn't submit bio so annotation in submit_bio for refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap.
Annotate swap_readpage() to account the synchronous IO overhead to prevent underreport memory pressure.
--- mm/page_io.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
mm/page_io.c +8 -2
@@ -22,6 +22,7 @@#include <linux/writeback.h> #include <linux/frontswap.h> #include <linux/blkdev.h> +#include <linux/psi.h> #include <linux/uio.h> #include <linux/sched/task.h> #include <asm/pgtable.h>
@@ -354,10 +355,14 @@ int swap_readpage(struct page *page, bool synchronous)struct swap_info_struct *sis =page_swap_info (page);blk_qc_t qc;struct gendisk *disk; +unsigned long pflags;VM_BUG_ON_PAGE (!PageSwapCache (page) && !synchronous, page);VM_BUG_ON_PAGE (!PageLocked (page), page);VM_BUG_ON_PAGE (PageUptodate (page), page); + +psi_memstall_enter (&pflags); +if (frontswap_load (page) ==0 ) {SetPageUptodate (page);unlock_page (page);
@@ -371,7 +376,7 @@ int swap_readpage(struct page *page, bool synchronous) ret = mapping->a_ops->readpage (swap_file, page);if (!ret)count_vm_event (PSWPIN ); -return ret; + goto out; } ret =bdev_read_page (sis->bdev,swap_page_sector (page), page);
@@ -382,7 +387,7 @@ int swap_readpage(struct page *page, bool synchronous) }count_vm_event (PSWPIN ); -return 0 ; + goto out; } ret =0 ;
@@ -418,6 +423,7 @@ int swap_readpage(struct page *page, bool synchronous)bio_put (bio); out: +psi_memstall_leave (&pflags);return ret; }
Signature · 1 line
2.23.0.581.g78d2f28ef7-goog
Quoted 8 lines · Minchan Kim
From: Minchan Kim <[email protected]>
If block device supports
rw_pageoperation, it doesn't submit bio so annotation insubmit_biofor refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap.
Quoted 5 lines
Annotate
swap_readpage()to account the synchronous IO overhead to prevent underreport memory pressure.Cc Johannes Weiner <[email protected]>Signed-off-by Minchan Kim <[email protected]>
Can you please add a comment to the caller? Lifted from submit_bio():
/*
* Count submission time as memory stall. When the device is
* congested, or the submitting cgroup IO-throttled,
* submission can be a significant part of overall IO time. */
Minchan Kim
Acked-by Johannes WeinerQuoted 9 lines · Johannes Weiner
Quoted 8 lines · Minchan Kim
From: Minchan Kim <[email protected]>
If block device supports
rw_pageoperation, it doesn't submit bio so annotation insubmit_biofor refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap.
Quoted 7 lines
Quoted 5 lines
Annotate
swap_readpage()to account the synchronous IO overhead to prevent underreport memory pressure.Cc Johannes Weiner <[email protected]>Signed-off-by Minchan Kim <[email protected]>Acked-by Johannes Weiner <[email protected]>
Thanks, Johannes!
Quoted 2 lines
Can you please add a comment to the caller? Lifted from
submit_bio():
Sure, I added a little about zram.
Quoted 6 lines
/*
* Count submission time as memory stall. When the device is
* congested, or the submitting cgroup IO-throttled,
* submission can be a significant part of overall IO time. */
From a8ae7cbc2d3f050aca810fd68285d45cb933b825 Mon Sep 17 00:00:00 2001
From: Minchan Kim <[email protected]>
Date: Thu, 10 Oct 2019 08:09:06 -0700
Subject: [PATCH v2] mm: annotate refault stalls from swap_readpage
If block device supports rw_page operation, it doesn't submit bio so annotation in submit_bio for refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap.
Annotate swap_readpage() to account the synchronous IO overhead to prevent underreport memory pressure.
--- mm/page_io.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
mm/page_io.c +14 -2
@@ -22,6 +22,7 @@#include <linux/writeback.h> #include <linux/frontswap.h> #include <linux/blkdev.h> +#include <linux/psi.h> #include <linux/uio.h> #include <linux/sched/task.h> #include <asm/pgtable.h>
@@ -354,10 +355,20 @@ int swap_readpage(struct page *page, bool synchronous)struct swap_info_struct *sis =page_swap_info (page);blk_qc_t qc;struct gendisk *disk; +unsigned long pflags;VM_BUG_ON_PAGE (!PageSwapCache (page) && !synchronous, page);VM_BUG_ON_PAGE (!PageLocked (page), page);VM_BUG_ON_PAGE (PageUptodate (page), page); + +/* +* Count submission time as memory stall. When the device is +* congested, the submitting cgroup IO-throttled, or backing +* device works synchronously(e.g., zram), submission can be +* a significant part of overall IO time. +*/ +psi_memstall_enter (&pflags); +if (frontswap_load (page) ==0 ) {SetPageUptodate (page);unlock_page (page);
@@ -371,7 +382,7 @@ int swap_readpage(struct page *page, bool synchronous) ret = mapping->a_ops->readpage (swap_file, page);if (!ret)count_vm_event (PSWPIN ); -return ret; + goto out; } ret =bdev_read_page (sis->bdev,swap_page_sector (page), page);
@@ -382,7 +393,7 @@ int swap_readpage(struct page *page, bool synchronous) }count_vm_event (PSWPIN ); -return 0 ; + goto out; } ret =0 ;
@@ -418,6 +429,7 @@ int swap_readpage(struct page *page, bool synchronous)bio_put (bio); out: +psi_memstall_leave (&pflags);return ret; }
Signature · 1 line
2.23.0.581.g78d2f28ef7-goog
Shakeel Butt
Reviewed-byQuoted 45 lines · Minchan Kim
Quoted 9 lines · Johannes Weiner
Quoted 8 lines · Minchan Kim
From: Minchan Kim <[email protected]>
If block device supports
rw_pageoperation, it doesn't submit bio so annotation insubmit_biofor refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap.Quoted 7 lines
Quoted 5 lines
Annotate
swap_readpage()to account the synchronous IO overhead to prevent underreport memory pressure.Cc Johannes Weiner <[email protected]>Signed-off-by Minchan Kim <[email protected]>Acked-by Johannes Weiner <[email protected]>Thanks, Johannes!
Quoted 2 lines
Can you please add a comment to the caller? Lifted from
submit_bio():Sure, I added a little about zram.
Quoted 6 lines
/*
* Count submission time as memory stall. When the device is
* congested, or the submitting cgroup IO-throttled,
* submission can be a significant part of overall IO time. */From
a8ae7cbc2d3f050aca810fd68285d45cb933b825Mon Sep 17 00:00:00 2001
From: Minchan Kim <[email protected]>
Date: Thu, 10 Oct 2019 08:09:06 -0700
Subject: [PATCH v2] mm: annotate refault stalls fromswap_readpageIf block device supports
rw_pageoperation, it doesn't submit bio so annotation insubmit_biofor refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap.
Quoted 5 lines
Annotate
swap_readpage()to account the synchronous IO overhead to prevent underreport memory pressure.Acked-by Johannes Weiner <[email protected]>Signed-off-by Minchan Kim <[email protected]>
Quoted 66 lines
--- mm/page_io.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)mm/page_io.c +14
-3@@ -22,6 +22,7 @@#include <linux/writeback.h> #include <linux/frontswap.h> #include <linux/blkdev.h> +#include <linux/psi.h> #include <linux/uio.h> #include <linux/sched/task.h> #include <asm/pgtable.h> @@ -354,10 +355,20 @@ int swap_readpage(struct page *page, bool synchronous)struct swap_info_struct *sis =page_swap_info (page);blk_qc_t qc;struct gendisk *disk; +unsigned long pflags;VM_BUG_ON_PAGE (!PageSwapCache (page) && !synchronous, page);VM_BUG_ON_PAGE (!PageLocked (page), page);VM_BUG_ON_PAGE (PageUptodate (page), page); + +/* +* Count submission time as memory stall. When the device is +* congested, the submitting cgroup IO-throttled, or backing +* device works synchronously(e.g., zram), submission can be +* a significant part of overall IO time. +*/ +psi_memstall_enter (&pflags); +if (frontswap_load (page) ==0 ) {SetPageUptodate (page);unlock_page (page);@@ -371,7 +382,7 @@ int swap_readpage(struct page *page, bool synchronous) ret = mapping->a_ops->readpage (swap_file, page);if (!ret)count_vm_event (PSWPIN ); -return ret; + goto out; } ret =bdev_read_page (sis->bdev,swap_page_sector (page), page);@@ -382,7 +393,7 @@ int swap_readpage(struct page *page, bool synchronous) }count_vm_event (PSWPIN ); -return 0 ; + goto out; } ret =0 ;@@ -418,6 +429,7 @@ int swap_readpage(struct page *page, bool synchronous)bio_put (bio); out: +psi_memstall_leave (&pflags);return ret; } --2.23.0.581.g78d2f28ef7-goog
Andrew Morton
maintainerQuoted 17 lines · On Thu, 10 Oct 2019 15:17:47 -0400 Johannes Weiner <[email protected]> wrote:
Quoted 8 lines · Minchan Kim
From: Minchan Kim <[email protected]>
If block device supports
rw_pageoperation, it doesn't submit bio so annotation insubmit_biofor refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap.Quoted 5 lines
Annotate
swap_readpage()to account the synchronous IO overhead to prevent underreport memory pressure.Cc Johannes Weiner <[email protected]>Signed-off-by Minchan Kim <[email protected]>Acked-by Johannes Weiner <[email protected]>
Quoted 7 lines
Can you please add a comment to the caller? Lifted from
submit_bio():/*
* Count submission time as memory stall. When the device is
* congested, or the submitting cgroup IO-throttled,
* submission can be a significant part of overall IO time. */
This?
mm/page_io.c renamed from mm/page_io.c~mm-annotate-refault-stalls-from-swap_readpage-fix +5 -0
@@ -361,6 +361,11 @@ int swap_readpage(struct page *page, booVM_BUG_ON_PAGE (!PageLocked (page), page);VM_BUG_ON_PAGE (PageUptodate (page), page); +/* +* Count submission time as memory stall. When the device is congested, +* or the submitting cgroup IO-throttled, submission can be a +* significant part of overall IO time. +*/ psi_memstall_enter (&pflags);if (frontswap_load (page) ==0 ) {
_