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
| ||
|
Date: Wed, 10 Aug 2022 09:32:18 +0800 From: Kassey Li <quic_yingangl@...cinc.com> To: akpm@...ux-foundation.org, vbabka@...nel.org Cc: Kassey Li <quic_yingangl@...cinc.com>, minchan@...nel.org, vbabka@...e.cz, iamjoonsoo.kim@....com, linux-kernel@...r.kernel.org, linux-mm@...ck.org Subject: [PATCH v6] mm/page_owner.c: add llseek for page_owner There is usage to dump a given cma region page_owner instead of all page's. This change allows to specify a ppos as start_pfn by fseek. Any invalid ppos will be skipped, so it did not broken the origin dump feature. Suggested-by: Vlastimil Babka <vbabka@...e.cz> Signed-off-by: Kassey Li <quic_yingangl@...cinc.com> --- Documentation/vm/page_owner.rst | 6 ++++++ mm/page_owner.c | 10 +++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Documentation/vm/page_owner.rst b/Documentation/vm/page_owner.rst index f5c954afe97c..8d33d976da8a 100644 --- a/Documentation/vm/page_owner.rst +++ b/Documentation/vm/page_owner.rst @@ -95,6 +95,12 @@ Usage PFN XXX ... // Detailed stack + By default, it will do full pfn dump, to start with a given pfn, + page_owner supports fseek. + + FILE *fp = fopen("/sys/kernel/debug/page_owner", "r"); + fseek(fp, pfn_start, SEEK_SET); + The ``page_owner_sort`` tool ignores ``PFN`` rows, puts the remaining rows in buf, uses regexp to extract the page order value, counts the times and pages of buf, and finally sorts them according to the parameter(s). diff --git a/mm/page_owner.c b/mm/page_owner.c index e4c6f3f1695b..33832b5908e6 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -13,6 +13,7 @@ #include <linux/memcontrol.h> #include <linux/sched/clock.h> +#include "../fs/proc/internal.h" #include "internal.h" /* @@ -497,8 +498,10 @@ read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos) return -EINVAL; page = NULL; - pfn = min_low_pfn + *ppos; - + if (*ppos == 0) + pfn = min_low_pfn; + else + pfn = *ppos; /* Find a valid PFN or the start of a MAX_ORDER_NR_PAGES area */ while (!pfn_valid(pfn) && (pfn & (MAX_ORDER_NR_PAGES - 1)) != 0) pfn++; @@ -561,7 +564,7 @@ read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos) continue; /* Record the next PFN to read in the file offset */ - *ppos = (pfn - min_low_pfn) + 1; + *ppos = pfn + 1; return print_page_owner(buf, count, pfn, page, page_owner, handle); @@ -660,6 +663,7 @@ static void init_early_allocated_pages(void) static const struct file_operations proc_page_owner_operations = { .read = read_page_owner, + .llseek = mem_lseek, }; static int __init pageowner_init(void) -- 2.17.1
Powered by blists - more mailing lists