| From: Kairui Song <kasong@tencent.com> |
| Subject: swap: add a limit for readahead page-cluster value |
| Date: Mon, 24 Oct 2022 00:25:33 +0800 |
| |
| Currenty there is no upper limit for /proc/sys/vm/page-cluster, and it's a |
| bit shift value, so it could result in overflow of the 32-bit integer. |
| Add a reasonable upper limit for it, read-in at most 2**31 pages, which is |
| a large enough value for readahead. |
| |
| Link: https://lkml.kernel.org/r/20221023162533.81561-1-ryncsn@gmail.com |
| Signed-off-by: Kairui Song <kasong@tencent.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/mm.h | 1 + |
| kernel/sysctl.c | 1 + |
| mm/swap.c | 3 ++- |
| 3 files changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/include/linux/mm.h~swap-add-a-limit-for-readahead-page-cluster-value |
| +++ a/include/linux/mm.h |
| @@ -74,6 +74,7 @@ static inline void totalram_pages_add(lo |
| |
| extern void * high_memory; |
| extern int page_cluster; |
| +extern const int page_cluster_max; |
| |
| #ifdef CONFIG_SYSCTL |
| extern int sysctl_legacy_va_layout; |
| --- a/kernel/sysctl.c~swap-add-a-limit-for-readahead-page-cluster-value |
| +++ a/kernel/sysctl.c |
| @@ -2125,6 +2125,7 @@ static struct ctl_table vm_table[] = { |
| .mode = 0644, |
| .proc_handler = proc_dointvec_minmax, |
| .extra1 = SYSCTL_ZERO, |
| + .extra2 = (void *)&page_cluster_max, |
| }, |
| { |
| .procname = "dirtytime_expire_seconds", |
| --- a/mm/swap.c~swap-add-a-limit-for-readahead-page-cluster-value |
| +++ a/mm/swap.c |
| @@ -43,8 +43,9 @@ |
| #define CREATE_TRACE_POINTS |
| #include <trace/events/pagemap.h> |
| |
| -/* How many pages do we try to swap or page in/out together? */ |
| +/* How many pages do we try to swap or page in/out together? As a power of 2 */ |
| int page_cluster; |
| +const int page_cluster_max = 31; |
| |
| /* Protecting only lru_rotate.fbatch which requires disabling interrupts */ |
| struct lru_rotate { |
| _ |