Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -pru a/include/linux/mm.h b/include/linux/mm.h
- --- a/include/linux/mm.h 2020-12-30 19:54:29.000000000 +0900
- +++ b/include/linux/mm.h 2021-02-16 03:44:03.789770868 +0900
- @@ -205,6 +205,11 @@ extern int sysctl_max_map_count;
- extern unsigned long sysctl_user_reserve_kbytes;
- extern unsigned long sysctl_admin_reserve_kbytes;
- +#if defined(CONFIG_PROTECT_FILE)
- +extern unsigned long sysctl_file_low_kbytes;
- +extern unsigned long sysctl_file_min_kbytes;
- +#endif
- +
- extern int sysctl_overcommit_memory;
- extern int sysctl_overcommit_ratio;
- extern unsigned long sysctl_overcommit_kbytes;
- diff -pru a/kernel/sysctl.c b/kernel/sysctl.c
- --- a/kernel/sysctl.c 2020-12-30 19:54:29.000000000 +0900
- +++ b/kernel/sysctl.c 2021-02-16 03:44:03.789770868 +0900
- @@ -111,6 +111,19 @@
- static int sixty = 60;
- #endif
- +#if defined(CONFIG_PROTECT_FILE)
- +#if CONFIG_PROTECT_FILE_LOW_KBYTES < 0
- +#error "CONFIG_PROTECT_FILE_LOW_KBYTES should be >= 0"
- +#endif
- +#if CONFIG_PROTECT_FILE_MIN_KBYTES < 0
- +#error "CONFIG_PROTECT_FILE_MIN_KBYTES should be >= 0"
- +#endif
- +unsigned long sysctl_file_low_kbytes __read_mostly =
- + CONFIG_PROTECT_FILE_LOW_KBYTES;
- +unsigned long sysctl_file_min_kbytes __read_mostly =
- + CONFIG_PROTECT_FILE_MIN_KBYTES;
- +#endif
- +
- static int __maybe_unused neg_one = -1;
- static int __maybe_unused two = 2;
- static int __maybe_unused four = 4;
- @@ -3082,6 +3095,22 @@ static struct ctl_table vm_table[] = {
- .extra2 = SYSCTL_ONE,
- },
- #endif
- +#if defined(CONFIG_PROTECT_FILE)
- + {
- + .procname = "file_low_kbytes",
- + .data = &sysctl_file_low_kbytes,
- + .maxlen = sizeof(sysctl_file_low_kbytes),
- + .mode = 0644,
- + .proc_handler = proc_doulongvec_minmax,
- + },
- + {
- + .procname = "file_min_kbytes",
- + .data = &sysctl_file_min_kbytes,
- + .maxlen = sizeof(sysctl_file_min_kbytes),
- + .mode = 0644,
- + .proc_handler = proc_doulongvec_minmax,
- + },
- +#endif
- {
- .procname = "user_reserve_kbytes",
- .data = &sysctl_user_reserve_kbytes,
- diff -pru a/mm/Kconfig b/mm/Kconfig
- --- a/mm/Kconfig 2020-12-30 19:54:29.000000000 +0900
- +++ b/mm/Kconfig 2021-02-16 03:44:03.789770868 +0900
- @@ -63,6 +63,20 @@ config SPARSEMEM_MANUAL
- endchoice
- +config PROTECT_FILE
- + def_bool y
- + depends on SYSCTL
- +
- +config PROTECT_FILE_LOW_KBYTES
- + int "Default value for vm.file_low_kbytes"
- + depends on PROTECT_FILE
- + default "0"
- +
- +config PROTECT_FILE_MIN_KBYTES
- + int "Default value for vm.file_min_kbytes"
- + depends on PROTECT_FILE
- + default "0"
- +
- config DISCONTIGMEM
- def_bool y
- depends on (!SELECT_MEMORY_MODEL && ARCH_DISCONTIGMEM_ENABLE) || DISCONTIGMEM_MANUAL
- diff -pru a/mm/vmscan.c b/mm/vmscan.c
- --- a/mm/vmscan.c 2020-12-30 19:54:29.000000000 +0900
- +++ b/mm/vmscan.c 2021-02-16 03:54:29.737443977 +0900
- @@ -120,6 +120,10 @@ struct scan_control {
- /* The file pages on the current node are dangerously low */
- unsigned int file_is_tiny:1;
- +#if defined(CONFIG_PROTECT_FILE)
- + unsigned int file_is_min:1;
- +#endif
- +
- /* Allocation order */
- s8 order;
- @@ -2242,6 +2246,13 @@ static void get_scan_count(struct lruvec
- unsigned long ap, fp;
- enum lru_list lru;
- +#if defined(CONFIG_PROTECT_FILE)
- + if (sc->file_is_min) {
- + scan_balance = SCAN_ANON;
- + goto out;
- + }
- +#endif
- +
- /* If we have no swap space, do not bother scanning anon pages. */
- if (!sc->may_swap || mem_cgroup_get_nr_swap_pages(memcg) <= 0) {
- scan_balance = SCAN_FILE;
- @@ -2762,6 +2773,14 @@ again:
- file + free <= total_high_wmark &&
- !(sc->may_deactivate & DEACTIVATE_ANON) &&
- anon >> sc->priority;
- +
- +#if defined(CONFIG_PROTECT_FILE)
- + file <<= (PAGE_SHIFT - 10);
- + sc->file_is_min = file <= sysctl_file_min_kbytes;
- + if (file <= sysctl_file_low_kbytes)
- + sc->file_is_tiny = true;
- +#endif
- +
- }
- shrink_node_memcgs(pgdat, sc);
Advertisement
Add Comment
Please, Sign In to add comment