lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Wed,  9 Oct 2019 14:18:57 -0700
From:   Minchan Kim <minchan@...nel.org>
To:     Andrew Morton <akpm@...ux-foundation.org>
Cc:     LKML <linux-kernel@...r.kernel.org>, linux-mm <linux-mm@...ck.org>,
        Minchan Kim <minchan@...gle.com>,
        Johannes Weiner <hannes@...xchg.org>
Subject: [PATCH] fs: annotate refault stalls from bdev_read_page

From: Minchan Kim <minchan@...gle.com>

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.

Annotate bdev_read_page() to account the synchronous IO overhead
to prevent underreport memory pressure.

Cc: Johannes Weiner <hannes@...xchg.org>
Signed-off-by: Minchan Kim <minchan@...gle.com>
---
 fs/block_dev.c | 13 +++++++++++++
 mm/memory.c    |  1 +
 2 files changed, 14 insertions(+)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index 9c073dbdc1b0..82ca28eb9a57 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -26,6 +26,7 @@
 #include <linux/writeback.h>
 #include <linux/mpage.h>
 #include <linux/mount.h>
+#include <linux/psi.h>
 #include <linux/pseudo_fs.h>
 #include <linux/uio.h>
 #include <linux/namei.h>
@@ -701,6 +702,8 @@ int bdev_read_page(struct block_device *bdev, sector_t sector,
 {
 	const struct block_device_operations *ops = bdev->bd_disk->fops;
 	int result = -EOPNOTSUPP;
+	unsigned long pflags;
+	bool workingset_read;
 
 	if (!ops->rw_page || bdev_get_integrity(bdev))
 		return result;
@@ -708,9 +711,19 @@ int bdev_read_page(struct block_device *bdev, sector_t sector,
 	result = blk_queue_enter(bdev->bd_queue, 0);
 	if (result)
 		return result;
+
+	workingset_read = PageWorkingset(page);
+	if (workingset_read)
+		psi_memstall_enter(&pflags);
+
 	result = ops->rw_page(bdev, sector + get_start_sect(bdev), page,
 			      REQ_OP_READ);
+
+	if (workingset_read)
+		psi_memstall_leave(&pflags);
+
 	blk_queue_exit(bdev->bd_queue);
+
 	return result;
 }
 EXPORT_SYMBOL_GPL(bdev_read_page);
diff --git a/mm/memory.c b/mm/memory.c
index 06935826d71e..6357d5a0a2a5 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2801,6 +2801,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
 			if (page) {
 				__SetPageLocked(page);
 				__SetPageSwapBacked(page);
+				SetPageWorkingset(page);
 				set_page_private(page, entry.val);
 				lru_cache_add_anon(page);
 				swap_readpage(page, true);
-- 
2.23.0.581.g78d2f28ef7-goog

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ