diff options
author | V3n3RiX <venerix@redcorelinux.org> | 2019-07-07 11:55:16 +0100 |
---|---|---|
committer | V3n3RiX <venerix@redcorelinux.org> | 2019-07-07 11:55:16 +0100 |
commit | db7d21ca01c67889c304647cd32c03d0b312ed94 (patch) | |
tree | 4dc2becb55e2b68f103ffbde0f927a328a605412 | |
parent | 2c0e5519c0b46bda60b044918f7498ea9ea23bf7 (diff) |
sys-kernel/linux-{image,sources}-redcore : fix UKSM build
-rw-r--r-- | sys-kernel/linux-image-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch | 75 | ||||
-rw-r--r-- | sys-kernel/linux-image-redcore/files/5.1-0001-uksm-initial-submission-linux-hardened.patch (renamed from sys-kernel/linux-image-redcore/files/5.1-uksm-linux-hardened.patch) | 99 | ||||
-rw-r--r-- | sys-kernel/linux-image-redcore/linux-image-redcore-5.1.15.ebuild | 3 | ||||
-rw-r--r-- | sys-kernel/linux-sources-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch | 75 | ||||
-rw-r--r-- | sys-kernel/linux-sources-redcore/files/5.1-0001-uksm-initial-submission-linux-hardened.patch (renamed from sys-kernel/linux-sources-redcore/files/5.1-uksm-linux-hardened.patch) | 99 | ||||
-rw-r--r-- | sys-kernel/linux-sources-redcore/linux-sources-redcore-5.1.15.ebuild | 3 |
6 files changed, 274 insertions, 80 deletions
diff --git a/sys-kernel/linux-image-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch b/sys-kernel/linux-image-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch new file mode 100644 index 00000000..dbc5357c --- /dev/null +++ b/sys-kernel/linux-image-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch @@ -0,0 +1,75 @@ +From ea0c9d768bade0bc87046841a3e667f477d90668 Mon Sep 17 00:00:00 2001 +From: Oleksandr Natalenko <oleksandr@natalenko.name> +Date: Mon, 6 May 2019 22:02:49 +0200 +Subject: [PATCH] uksm-5.1: apply 52d1e606ee733 + +Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name> +--- + mm/uksm.c | 36 +++++++++++++++++++++++++++++++----- + 1 file changed, 31 insertions(+), 5 deletions(-) + +diff --git a/mm/uksm.c b/mm/uksm.c +index 174e1921eade..2531599038b8 100644 +--- a/mm/uksm.c ++++ b/mm/uksm.c +@@ -875,8 +875,8 @@ static void remove_node_from_stable_tree(struct stable_node *stable_node, + * to keep the page_count protocol described with page_cache_get_speculative. + * + * Note: it is possible that get_uksm_page() will return NULL one moment, +- * then page the next, if the page is in between page_freeze_refs() and +- * page_unfreeze_refs(): this shouldn't be a problem anywhere, the page ++ * then page the next, if the page is in between page_ref_freeze() and ++ * page_ref_unfreeze(): this shouldn't be a problem anywhere, the page + * is on its way to being freed; but it is an anomaly to bear in mind. + * + * @unlink_rb: if the removal of this node will firstly unlink from +@@ -914,10 +914,11 @@ static struct page *get_uksm_page(struct stable_node *stable_node, + * We cannot do anything with the page while its refcount is 0. + * Usually 0 means free, or tail of a higher-order page: in which + * case this node is no longer referenced, and should be freed; +- * however, it might mean that the page is under page_freeze_refs(). ++ * however, it might mean that the page is under page_ref_freeze(). + * The __remove_mapping() case is easy, again the node is now stale; +- * but if page is swapcache in migrate_page_move_mapping(), it might +- * still be our page, in which case it's essential to keep the node. ++ * the same is in reuse_ksm_page() case; but if page is swapcache ++ * in migrate_page_move_mapping(), it might still be our page, ++ * in which case it's essential to keep the node. + */ + while (!get_page_unless_zero(page)) { + /* +@@ -4749,6 +4750,31 @@ void rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc) + goto again; + } + ++bool reuse_ksm_page(struct page *page, ++ struct vm_area_struct *vma, ++ unsigned long address) ++{ ++#ifdef CONFIG_DEBUG_VM ++ if (WARN_ON(is_zero_pfn(page_to_pfn(page))) || ++ WARN_ON(!page_mapped(page)) || ++ WARN_ON(!PageLocked(page))) { ++ dump_page(page, "reuse_ksm_page"); ++ return false; ++ } ++#endif ++ ++ if (PageSwapCache(page) || !page_stable_node(page)) ++ return false; ++ /* Prohibit parallel get_ksm_page() */ ++ if (!page_ref_freeze(page, 1)) ++ return false; ++ ++ page_move_anon_rmap(page, vma); ++ page->index = linear_page_index(vma, address); ++ page_ref_unfreeze(page, 1); ++ ++ return true; ++} + #ifdef CONFIG_MIGRATION + /* Common ksm interface but may be specific to uksm */ + void ksm_migrate_page(struct page *newpage, struct page *oldpage) +-- +2.21.0.777.g83232e3864 + diff --git a/sys-kernel/linux-image-redcore/files/5.1-uksm-linux-hardened.patch b/sys-kernel/linux-image-redcore/files/5.1-0001-uksm-initial-submission-linux-hardened.patch index a79cb3d5..d2f3a41f 100644 --- a/sys-kernel/linux-image-redcore/files/5.1-uksm-linux-hardened.patch +++ b/sys-kernel/linux-image-redcore/files/5.1-0001-uksm-initial-submission-linux-hardened.patch @@ -1,6 +1,6 @@ diff -Nur a/Documentation/vm/uksm.txt b/Documentation/vm/uksm.txt --- a/Documentation/vm/uksm.txt 1970-01-01 01:00:00.000000000 +0100 -+++ b/Documentation/vm/uksm.txt 2019-07-07 09:32:50.451840235 +0100 ++++ b/Documentation/vm/uksm.txt 2019-07-07 11:43:00.138836975 +0100 @@ -0,0 +1,61 @@ +The Ultra Kernel Samepage Merging feature +---------------------------------------------- @@ -64,17 +64,18 @@ diff -Nur a/Documentation/vm/uksm.txt b/Documentation/vm/uksm.txt +2016-09-10 UKSM 0.1.2.5 Fix a bug in dedup ratio calculation. +2017-02-26 UKSM 0.1.2.6 Fix a bug in hugetlbpage handling and a race bug with page migration. diff -Nur a/fs/exec.c b/fs/exec.c ---- a/fs/exec.c 2019-07-07 09:08:19.132347946 +0100 -+++ b/fs/exec.c 2019-07-07 09:33:47.653770486 +0100 -@@ -63,6 +63,7 @@ +--- a/fs/exec.c 2019-07-07 11:39:06.860827790 +0100 ++++ b/fs/exec.c 2019-07-07 11:44:01.830966115 +0100 +@@ -63,6 +63,8 @@ #include <linux/compat.h> #include <linux/vmalloc.h> #include <linux/random.h> ++#include <linux/freezer.h> +#include <linux/ksm.h> #include <linux/uaccess.h> #include <asm/mmu_context.h> -@@ -1385,6 +1386,7 @@ +@@ -1385,6 +1387,7 @@ /* An exec changes our domain. We are no longer part of the thread group */ current->self_exec_id++; @@ -84,7 +85,7 @@ diff -Nur a/fs/exec.c b/fs/exec.c EXPORT_SYMBOL(setup_new_exec); diff -Nur a/fs/proc/meminfo.c b/fs/proc/meminfo.c --- a/fs/proc/meminfo.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/fs/proc/meminfo.c 2019-07-07 09:32:50.451840235 +0100 ++++ b/fs/proc/meminfo.c 2019-07-07 11:43:00.138836975 +0100 @@ -106,6 +106,10 @@ global_zone_page_state(NR_KERNEL_STACK_KB)); show_val_kb(m, "PageTables: ", @@ -98,7 +99,7 @@ diff -Nur a/fs/proc/meminfo.c b/fs/proc/meminfo.c #endif diff -Nur a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h --- a/include/asm-generic/pgtable.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/asm-generic/pgtable.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/asm-generic/pgtable.h 2019-07-07 11:43:00.138836975 +0100 @@ -855,12 +855,25 @@ extern void untrack_pfn_moved(struct vm_area_struct *vma); #endif @@ -137,13 +138,7 @@ diff -Nur a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h static inline unsigned long my_zero_pfn(unsigned long addr) diff -Nur a/include/linux/ksm.h b/include/linux/ksm.h --- a/include/linux/ksm.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/linux/ksm.h 2019-07-07 09:32:50.451840235 +0100 -@@ -1,4 +1,4 @@ --/* SPDX-License-Identifier: GPL-2.0 */ -+/* SPDX-License-Identifier: GPL-3.0 */ - #ifndef __LINUX_KSM_H - #define __LINUX_KSM_H - /* ++++ b/include/linux/ksm.h 2019-07-07 11:43:00.138836975 +0100 @@ -21,20 +21,16 @@ #ifdef CONFIG_KSM int ksm_madvise(struct vm_area_struct *vma, unsigned long start, @@ -213,7 +208,7 @@ diff -Nur a/include/linux/ksm.h b/include/linux/ksm.h #endif /* __LINUX_KSM_H */ diff -Nur a/include/linux/mm_types.h b/include/linux/mm_types.h --- a/include/linux/mm_types.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/linux/mm_types.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/mm_types.h 2019-07-07 11:43:00.138836975 +0100 @@ -334,6 +334,9 @@ struct mempolicy *vm_policy; /* NUMA policy for the VMA */ #endif @@ -226,7 +221,7 @@ diff -Nur a/include/linux/mm_types.h b/include/linux/mm_types.h struct core_thread { diff -Nur a/include/linux/mmzone.h b/include/linux/mmzone.h --- a/include/linux/mmzone.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/linux/mmzone.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/mmzone.h 2019-07-07 11:43:00.138836975 +0100 @@ -148,6 +148,9 @@ NR_ZSPAGES, /* allocated in zsmalloc */ #endif @@ -239,7 +234,7 @@ diff -Nur a/include/linux/mmzone.h b/include/linux/mmzone.h enum node_stat_item { diff -Nur a/include/linux/sradix-tree.h b/include/linux/sradix-tree.h --- a/include/linux/sradix-tree.h 1970-01-01 01:00:00.000000000 +0100 -+++ b/include/linux/sradix-tree.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/sradix-tree.h 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,77 @@ +#ifndef _LINUX_SRADIX_TREE_H +#define _LINUX_SRADIX_TREE_H @@ -320,7 +315,7 @@ diff -Nur a/include/linux/sradix-tree.h b/include/linux/sradix-tree.h +#endif /* _LINUX_SRADIX_TREE_H */ diff -Nur a/include/linux/uksm.h b/include/linux/uksm.h --- a/include/linux/uksm.h 1970-01-01 01:00:00.000000000 +0100 -+++ b/include/linux/uksm.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/uksm.h 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,149 @@ +#ifndef __LINUX_UKSM_H +#define __LINUX_UKSM_H @@ -472,8 +467,8 @@ diff -Nur a/include/linux/uksm.h b/include/linux/uksm.h +#endif /* !CONFIG_UKSM */ +#endif /* __LINUX_UKSM_H */ diff -Nur a/kernel/fork.c b/kernel/fork.c ---- a/kernel/fork.c 2019-07-07 09:08:19.152348621 +0100 -+++ b/kernel/fork.c 2019-07-07 09:32:50.451840235 +0100 +--- a/kernel/fork.c 2019-07-07 11:39:06.870828132 +0100 ++++ b/kernel/fork.c 2019-07-07 11:43:00.148837320 +0100 @@ -584,7 +584,7 @@ __vma_link_rb(mm, tmp, rb_link, rb_parent); rb_link = &tmp->vm_rb.rb_right; @@ -485,7 +480,7 @@ diff -Nur a/kernel/fork.c b/kernel/fork.c retval = copy_page_range(mm, oldmm, mpnt); diff -Nur a/lib/Makefile b/lib/Makefile --- a/lib/Makefile 2019-06-25 04:34:56.000000000 +0100 -+++ b/lib/Makefile 2019-07-07 09:32:50.451840235 +0100 ++++ b/lib/Makefile 2019-07-07 11:43:00.148837320 +0100 @@ -29,7 +29,7 @@ endif @@ -497,7 +492,7 @@ diff -Nur a/lib/Makefile b/lib/Makefile flex_proportions.o ratelimit.o show_mem.o \ diff -Nur a/lib/sradix-tree.c b/lib/sradix-tree.c --- a/lib/sradix-tree.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/lib/sradix-tree.c 2019-07-07 09:32:50.451840235 +0100 ++++ b/lib/sradix-tree.c 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,476 @@ +#include <linux/errno.h> +#include <linux/mm.h> @@ -976,8 +971,8 @@ diff -Nur a/lib/sradix-tree.c b/lib/sradix-tree.c + return 0; +} diff -Nur a/mm/Kconfig b/mm/Kconfig ---- a/mm/Kconfig 2019-07-07 09:08:19.162348955 +0100 -+++ b/mm/Kconfig 2019-07-07 09:32:50.451840235 +0100 +--- a/mm/Kconfig 2019-07-07 11:39:06.880828472 +0100 ++++ b/mm/Kconfig 2019-07-07 11:43:00.148837320 +0100 @@ -302,6 +302,32 @@ See Documentation/vm/ksm.rst for more information: KSM is inactive until a program has madvised that an area is MADV_MERGEABLE, and @@ -1013,7 +1008,7 @@ diff -Nur a/mm/Kconfig b/mm/Kconfig int "Low address space to protect from user allocation" diff -Nur a/mm/ksm.c b/mm/ksm.c --- a/mm/ksm.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/ksm.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/ksm.c 2019-07-07 11:43:00.148837320 +0100 @@ -858,17 +858,6 @@ return err; } @@ -1034,7 +1029,7 @@ diff -Nur a/mm/ksm.c b/mm/ksm.c * Only called through the sysfs control interface: diff -Nur a/mm/Makefile b/mm/Makefile --- a/mm/Makefile 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/Makefile 2019-07-07 09:32:50.451840235 +0100 ++++ b/mm/Makefile 2019-07-07 11:43:00.148837320 +0100 @@ -58,7 +58,8 @@ obj-$(CONFIG_SPARSEMEM_VMEMMAP) += sparse-vmemmap.o obj-$(CONFIG_SLOB) += slob.o @@ -1047,7 +1042,7 @@ diff -Nur a/mm/Makefile b/mm/Makefile obj-$(CONFIG_SLUB) += slub.o diff -Nur a/mm/memory.c b/mm/memory.c --- a/mm/memory.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/memory.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/memory.c 2019-07-07 11:43:00.148837320 +0100 @@ -129,6 +129,25 @@ unsigned long highest_memmap_pfn __read_mostly; @@ -1144,8 +1139,8 @@ diff -Nur a/mm/memory.c b/mm/memory.c } flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte)); diff -Nur a/mm/mmap.c b/mm/mmap.c ---- a/mm/mmap.c 2019-07-07 09:08:19.162348955 +0100 -+++ b/mm/mmap.c 2019-07-07 09:34:22.544947675 +0100 +--- a/mm/mmap.c 2019-07-07 11:39:06.880828472 +0100 ++++ b/mm/mmap.c 2019-07-07 11:43:00.148837320 +0100 @@ -46,6 +46,7 @@ #include <linux/pkeys.h> #include <linux/oom.h> @@ -1158,7 +1153,7 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c if (vma->vm_file) fput(vma->vm_file); mpol_put(vma_policy(vma)); -+ uksm_remove_vma(vma); ++ uksm_remove_vma(vma); vm_area_free(vma); return next; } @@ -1274,7 +1269,21 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c if (mm->locked_vm) { vma = mm->mmap; while (vma) { -@@ -3162,6 +3192,11 @@ +@@ -3140,8 +3170,12 @@ + arch_exit_mmap(mm); + + vma = mm->mmap; +- if (!vma) /* Can happen if dup_mmap() received an OOM */ ++ /* Can happen if dup_mmap() received an OOM */ ++ if (!vma) { ++ /* Release write lock previously taken for UKSM */ ++ up_write(&mm->mmap_sem); + return; ++ } + + lru_add_drain(); + flush_cache_mm(mm); +@@ -3162,6 +3196,11 @@ vma = remove_vma(vma); } vm_unacct_memory(nr_accounted); @@ -1286,7 +1295,7 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c } /* Insert vm structure into process list sorted by address -@@ -3269,6 +3304,7 @@ +@@ -3269,6 +3308,7 @@ new_vma->vm_ops->open(new_vma); vma_link(mm, new_vma, prev, rb_link, rb_parent); *need_rmap_locks = false; @@ -1294,7 +1303,7 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c } return new_vma; -@@ -3419,6 +3455,7 @@ +@@ -3419,6 +3459,7 @@ vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT); perf_event_mmap(vma); @@ -1302,9 +1311,21 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c return vma; +diff -Nur a/mm/rmap.c b/mm/rmap.c +--- a/mm/rmap.c 2019-06-25 04:34:56.000000000 +0100 ++++ b/mm/rmap.c 2019-07-07 11:43:00.148837320 +0100 +@@ -1021,7 +1021,7 @@ + * __page_set_anon_rmap - set up new anonymous rmap + * @page: Page or Hugepage to add to rmap + * @vma: VM area to add page to. +- * @address: User virtual address of the mapping ++ * @address: User virtual address of the mapping + * @exclusive: the page is exclusively owned by the current process + */ + static void __page_set_anon_rmap(struct page *page, diff -Nur a/mm/uksm.c b/mm/uksm.c --- a/mm/uksm.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/mm/uksm.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/uksm.c 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,5580 @@ +/* + * Ultra KSM. Copyright (C) 2011-2012 Nai Xia @@ -2801,9 +2822,9 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + .page = page, + .vma = vma, + }; -+ struct mmu_notifier_range range; + int swapped; + int err = -EFAULT; ++ struct mmu_notifier_range range; + + pvmw.address = page_address_in_vma(page, vma); + if (pvmw.address == -EFAULT) @@ -2811,7 +2832,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + + BUG_ON(PageTransCompound(page)); + -+ mmu_notifier_range_init(&range, mm, pvmw.address, pvmw.address + PAGE_SIZE); ++ mmu_notifier_range_init(&range, mm, pvmw.address, pvmw.address + PAGE_SIZE); + mmu_notifier_invalidate_range_start(&range); + + if (!page_vma_mapped_walk(&pvmw)) @@ -2886,7 +2907,6 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + struct page *kpage, pte_t orig_pte) +{ + struct mm_struct *mm = vma->vm_mm; -+ struct mmu_notifier_range range; + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; @@ -2897,6 +2917,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + + unsigned long addr; + int err = MERGE_ERR_PGERR; ++ struct mmu_notifier_range range; + + addr = page_address_in_vma(page, vma); + if (addr == -EFAULT) @@ -2916,7 +2937,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + if (!pmd_present(*pmd)) + goto out; + -+ mmu_notifier_range_init(&range, mm, addr, addr + PAGE_SIZE); ++ mmu_notifier_range_init(&range, mm, addr, addr + PAGE_SIZE); + mmu_notifier_invalidate_range_start(&range); + + ptep = pte_offset_map_lock(mm, pmd, addr, &ptl); @@ -6888,7 +6909,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + diff -Nur a/mm/vmstat.c b/mm/vmstat.c --- a/mm/vmstat.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/vmstat.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/vmstat.c 2019-07-07 11:43:00.148837320 +0100 @@ -1165,6 +1165,9 @@ "nr_written", "nr_kernel_misc_reclaimable", diff --git a/sys-kernel/linux-image-redcore/linux-image-redcore-5.1.15.ebuild b/sys-kernel/linux-image-redcore/linux-image-redcore-5.1.15.ebuild index 08b6134f..2a190518 100644 --- a/sys-kernel/linux-image-redcore/linux-image-redcore-5.1.15.ebuild +++ b/sys-kernel/linux-image-redcore/linux-image-redcore-5.1.15.ebuild @@ -43,7 +43,8 @@ PATCHES=( "${FILESDIR}"/"${KV_MAJOR}"-radeon_dp_aux_transfer_native-no-ratelimited_debug.patch "${FILESDIR}"/"${KV_MAJOR}"-Unknow-SSD-HFM128GDHTNG-8310B-QUIRK_NO_APST.patch "${FILESDIR}"/"${KV_MAJOR}"-linux-hardened.patch - "${FILESDIR}"/"${KV_MAJOR}"-uksm-linux-hardened.patch + "${FILESDIR}"/"${KV_MAJOR}"-0001-uksm-initial-submission-linux-hardened.patch + "${FILESDIR}"/"${KV_MAJOR}"-0001-uksm-apply-52d1e606ee733.patch "${FILESDIR}"/"${KV_MAJOR}"-0001-MultiQueue-Skiplist-Scheduler-version-0.192-linux-hardened.patch "${FILESDIR}"/"${KV_MAJOR}"-0002-Fix-Werror-build-failure-in-tools.patch "${FILESDIR}"/"${KV_MAJOR}"-0003-Make-preemptible-kernel-default.patch diff --git a/sys-kernel/linux-sources-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch b/sys-kernel/linux-sources-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch new file mode 100644 index 00000000..dbc5357c --- /dev/null +++ b/sys-kernel/linux-sources-redcore/files/5.1-0001-uksm-apply-52d1e606ee733.patch @@ -0,0 +1,75 @@ +From ea0c9d768bade0bc87046841a3e667f477d90668 Mon Sep 17 00:00:00 2001 +From: Oleksandr Natalenko <oleksandr@natalenko.name> +Date: Mon, 6 May 2019 22:02:49 +0200 +Subject: [PATCH] uksm-5.1: apply 52d1e606ee733 + +Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name> +--- + mm/uksm.c | 36 +++++++++++++++++++++++++++++++----- + 1 file changed, 31 insertions(+), 5 deletions(-) + +diff --git a/mm/uksm.c b/mm/uksm.c +index 174e1921eade..2531599038b8 100644 +--- a/mm/uksm.c ++++ b/mm/uksm.c +@@ -875,8 +875,8 @@ static void remove_node_from_stable_tree(struct stable_node *stable_node, + * to keep the page_count protocol described with page_cache_get_speculative. + * + * Note: it is possible that get_uksm_page() will return NULL one moment, +- * then page the next, if the page is in between page_freeze_refs() and +- * page_unfreeze_refs(): this shouldn't be a problem anywhere, the page ++ * then page the next, if the page is in between page_ref_freeze() and ++ * page_ref_unfreeze(): this shouldn't be a problem anywhere, the page + * is on its way to being freed; but it is an anomaly to bear in mind. + * + * @unlink_rb: if the removal of this node will firstly unlink from +@@ -914,10 +914,11 @@ static struct page *get_uksm_page(struct stable_node *stable_node, + * We cannot do anything with the page while its refcount is 0. + * Usually 0 means free, or tail of a higher-order page: in which + * case this node is no longer referenced, and should be freed; +- * however, it might mean that the page is under page_freeze_refs(). ++ * however, it might mean that the page is under page_ref_freeze(). + * The __remove_mapping() case is easy, again the node is now stale; +- * but if page is swapcache in migrate_page_move_mapping(), it might +- * still be our page, in which case it's essential to keep the node. ++ * the same is in reuse_ksm_page() case; but if page is swapcache ++ * in migrate_page_move_mapping(), it might still be our page, ++ * in which case it's essential to keep the node. + */ + while (!get_page_unless_zero(page)) { + /* +@@ -4749,6 +4750,31 @@ void rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc) + goto again; + } + ++bool reuse_ksm_page(struct page *page, ++ struct vm_area_struct *vma, ++ unsigned long address) ++{ ++#ifdef CONFIG_DEBUG_VM ++ if (WARN_ON(is_zero_pfn(page_to_pfn(page))) || ++ WARN_ON(!page_mapped(page)) || ++ WARN_ON(!PageLocked(page))) { ++ dump_page(page, "reuse_ksm_page"); ++ return false; ++ } ++#endif ++ ++ if (PageSwapCache(page) || !page_stable_node(page)) ++ return false; ++ /* Prohibit parallel get_ksm_page() */ ++ if (!page_ref_freeze(page, 1)) ++ return false; ++ ++ page_move_anon_rmap(page, vma); ++ page->index = linear_page_index(vma, address); ++ page_ref_unfreeze(page, 1); ++ ++ return true; ++} + #ifdef CONFIG_MIGRATION + /* Common ksm interface but may be specific to uksm */ + void ksm_migrate_page(struct page *newpage, struct page *oldpage) +-- +2.21.0.777.g83232e3864 + diff --git a/sys-kernel/linux-sources-redcore/files/5.1-uksm-linux-hardened.patch b/sys-kernel/linux-sources-redcore/files/5.1-0001-uksm-initial-submission-linux-hardened.patch index a79cb3d5..d2f3a41f 100644 --- a/sys-kernel/linux-sources-redcore/files/5.1-uksm-linux-hardened.patch +++ b/sys-kernel/linux-sources-redcore/files/5.1-0001-uksm-initial-submission-linux-hardened.patch @@ -1,6 +1,6 @@ diff -Nur a/Documentation/vm/uksm.txt b/Documentation/vm/uksm.txt --- a/Documentation/vm/uksm.txt 1970-01-01 01:00:00.000000000 +0100 -+++ b/Documentation/vm/uksm.txt 2019-07-07 09:32:50.451840235 +0100 ++++ b/Documentation/vm/uksm.txt 2019-07-07 11:43:00.138836975 +0100 @@ -0,0 +1,61 @@ +The Ultra Kernel Samepage Merging feature +---------------------------------------------- @@ -64,17 +64,18 @@ diff -Nur a/Documentation/vm/uksm.txt b/Documentation/vm/uksm.txt +2016-09-10 UKSM 0.1.2.5 Fix a bug in dedup ratio calculation. +2017-02-26 UKSM 0.1.2.6 Fix a bug in hugetlbpage handling and a race bug with page migration. diff -Nur a/fs/exec.c b/fs/exec.c ---- a/fs/exec.c 2019-07-07 09:08:19.132347946 +0100 -+++ b/fs/exec.c 2019-07-07 09:33:47.653770486 +0100 -@@ -63,6 +63,7 @@ +--- a/fs/exec.c 2019-07-07 11:39:06.860827790 +0100 ++++ b/fs/exec.c 2019-07-07 11:44:01.830966115 +0100 +@@ -63,6 +63,8 @@ #include <linux/compat.h> #include <linux/vmalloc.h> #include <linux/random.h> ++#include <linux/freezer.h> +#include <linux/ksm.h> #include <linux/uaccess.h> #include <asm/mmu_context.h> -@@ -1385,6 +1386,7 @@ +@@ -1385,6 +1387,7 @@ /* An exec changes our domain. We are no longer part of the thread group */ current->self_exec_id++; @@ -84,7 +85,7 @@ diff -Nur a/fs/exec.c b/fs/exec.c EXPORT_SYMBOL(setup_new_exec); diff -Nur a/fs/proc/meminfo.c b/fs/proc/meminfo.c --- a/fs/proc/meminfo.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/fs/proc/meminfo.c 2019-07-07 09:32:50.451840235 +0100 ++++ b/fs/proc/meminfo.c 2019-07-07 11:43:00.138836975 +0100 @@ -106,6 +106,10 @@ global_zone_page_state(NR_KERNEL_STACK_KB)); show_val_kb(m, "PageTables: ", @@ -98,7 +99,7 @@ diff -Nur a/fs/proc/meminfo.c b/fs/proc/meminfo.c #endif diff -Nur a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h --- a/include/asm-generic/pgtable.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/asm-generic/pgtable.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/asm-generic/pgtable.h 2019-07-07 11:43:00.138836975 +0100 @@ -855,12 +855,25 @@ extern void untrack_pfn_moved(struct vm_area_struct *vma); #endif @@ -137,13 +138,7 @@ diff -Nur a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h static inline unsigned long my_zero_pfn(unsigned long addr) diff -Nur a/include/linux/ksm.h b/include/linux/ksm.h --- a/include/linux/ksm.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/linux/ksm.h 2019-07-07 09:32:50.451840235 +0100 -@@ -1,4 +1,4 @@ --/* SPDX-License-Identifier: GPL-2.0 */ -+/* SPDX-License-Identifier: GPL-3.0 */ - #ifndef __LINUX_KSM_H - #define __LINUX_KSM_H - /* ++++ b/include/linux/ksm.h 2019-07-07 11:43:00.138836975 +0100 @@ -21,20 +21,16 @@ #ifdef CONFIG_KSM int ksm_madvise(struct vm_area_struct *vma, unsigned long start, @@ -213,7 +208,7 @@ diff -Nur a/include/linux/ksm.h b/include/linux/ksm.h #endif /* __LINUX_KSM_H */ diff -Nur a/include/linux/mm_types.h b/include/linux/mm_types.h --- a/include/linux/mm_types.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/linux/mm_types.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/mm_types.h 2019-07-07 11:43:00.138836975 +0100 @@ -334,6 +334,9 @@ struct mempolicy *vm_policy; /* NUMA policy for the VMA */ #endif @@ -226,7 +221,7 @@ diff -Nur a/include/linux/mm_types.h b/include/linux/mm_types.h struct core_thread { diff -Nur a/include/linux/mmzone.h b/include/linux/mmzone.h --- a/include/linux/mmzone.h 2019-06-25 04:34:56.000000000 +0100 -+++ b/include/linux/mmzone.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/mmzone.h 2019-07-07 11:43:00.138836975 +0100 @@ -148,6 +148,9 @@ NR_ZSPAGES, /* allocated in zsmalloc */ #endif @@ -239,7 +234,7 @@ diff -Nur a/include/linux/mmzone.h b/include/linux/mmzone.h enum node_stat_item { diff -Nur a/include/linux/sradix-tree.h b/include/linux/sradix-tree.h --- a/include/linux/sradix-tree.h 1970-01-01 01:00:00.000000000 +0100 -+++ b/include/linux/sradix-tree.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/sradix-tree.h 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,77 @@ +#ifndef _LINUX_SRADIX_TREE_H +#define _LINUX_SRADIX_TREE_H @@ -320,7 +315,7 @@ diff -Nur a/include/linux/sradix-tree.h b/include/linux/sradix-tree.h +#endif /* _LINUX_SRADIX_TREE_H */ diff -Nur a/include/linux/uksm.h b/include/linux/uksm.h --- a/include/linux/uksm.h 1970-01-01 01:00:00.000000000 +0100 -+++ b/include/linux/uksm.h 2019-07-07 09:32:50.451840235 +0100 ++++ b/include/linux/uksm.h 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,149 @@ +#ifndef __LINUX_UKSM_H +#define __LINUX_UKSM_H @@ -472,8 +467,8 @@ diff -Nur a/include/linux/uksm.h b/include/linux/uksm.h +#endif /* !CONFIG_UKSM */ +#endif /* __LINUX_UKSM_H */ diff -Nur a/kernel/fork.c b/kernel/fork.c ---- a/kernel/fork.c 2019-07-07 09:08:19.152348621 +0100 -+++ b/kernel/fork.c 2019-07-07 09:32:50.451840235 +0100 +--- a/kernel/fork.c 2019-07-07 11:39:06.870828132 +0100 ++++ b/kernel/fork.c 2019-07-07 11:43:00.148837320 +0100 @@ -584,7 +584,7 @@ __vma_link_rb(mm, tmp, rb_link, rb_parent); rb_link = &tmp->vm_rb.rb_right; @@ -485,7 +480,7 @@ diff -Nur a/kernel/fork.c b/kernel/fork.c retval = copy_page_range(mm, oldmm, mpnt); diff -Nur a/lib/Makefile b/lib/Makefile --- a/lib/Makefile 2019-06-25 04:34:56.000000000 +0100 -+++ b/lib/Makefile 2019-07-07 09:32:50.451840235 +0100 ++++ b/lib/Makefile 2019-07-07 11:43:00.148837320 +0100 @@ -29,7 +29,7 @@ endif @@ -497,7 +492,7 @@ diff -Nur a/lib/Makefile b/lib/Makefile flex_proportions.o ratelimit.o show_mem.o \ diff -Nur a/lib/sradix-tree.c b/lib/sradix-tree.c --- a/lib/sradix-tree.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/lib/sradix-tree.c 2019-07-07 09:32:50.451840235 +0100 ++++ b/lib/sradix-tree.c 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,476 @@ +#include <linux/errno.h> +#include <linux/mm.h> @@ -976,8 +971,8 @@ diff -Nur a/lib/sradix-tree.c b/lib/sradix-tree.c + return 0; +} diff -Nur a/mm/Kconfig b/mm/Kconfig ---- a/mm/Kconfig 2019-07-07 09:08:19.162348955 +0100 -+++ b/mm/Kconfig 2019-07-07 09:32:50.451840235 +0100 +--- a/mm/Kconfig 2019-07-07 11:39:06.880828472 +0100 ++++ b/mm/Kconfig 2019-07-07 11:43:00.148837320 +0100 @@ -302,6 +302,32 @@ See Documentation/vm/ksm.rst for more information: KSM is inactive until a program has madvised that an area is MADV_MERGEABLE, and @@ -1013,7 +1008,7 @@ diff -Nur a/mm/Kconfig b/mm/Kconfig int "Low address space to protect from user allocation" diff -Nur a/mm/ksm.c b/mm/ksm.c --- a/mm/ksm.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/ksm.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/ksm.c 2019-07-07 11:43:00.148837320 +0100 @@ -858,17 +858,6 @@ return err; } @@ -1034,7 +1029,7 @@ diff -Nur a/mm/ksm.c b/mm/ksm.c * Only called through the sysfs control interface: diff -Nur a/mm/Makefile b/mm/Makefile --- a/mm/Makefile 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/Makefile 2019-07-07 09:32:50.451840235 +0100 ++++ b/mm/Makefile 2019-07-07 11:43:00.148837320 +0100 @@ -58,7 +58,8 @@ obj-$(CONFIG_SPARSEMEM_VMEMMAP) += sparse-vmemmap.o obj-$(CONFIG_SLOB) += slob.o @@ -1047,7 +1042,7 @@ diff -Nur a/mm/Makefile b/mm/Makefile obj-$(CONFIG_SLUB) += slub.o diff -Nur a/mm/memory.c b/mm/memory.c --- a/mm/memory.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/memory.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/memory.c 2019-07-07 11:43:00.148837320 +0100 @@ -129,6 +129,25 @@ unsigned long highest_memmap_pfn __read_mostly; @@ -1144,8 +1139,8 @@ diff -Nur a/mm/memory.c b/mm/memory.c } flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte)); diff -Nur a/mm/mmap.c b/mm/mmap.c ---- a/mm/mmap.c 2019-07-07 09:08:19.162348955 +0100 -+++ b/mm/mmap.c 2019-07-07 09:34:22.544947675 +0100 +--- a/mm/mmap.c 2019-07-07 11:39:06.880828472 +0100 ++++ b/mm/mmap.c 2019-07-07 11:43:00.148837320 +0100 @@ -46,6 +46,7 @@ #include <linux/pkeys.h> #include <linux/oom.h> @@ -1158,7 +1153,7 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c if (vma->vm_file) fput(vma->vm_file); mpol_put(vma_policy(vma)); -+ uksm_remove_vma(vma); ++ uksm_remove_vma(vma); vm_area_free(vma); return next; } @@ -1274,7 +1269,21 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c if (mm->locked_vm) { vma = mm->mmap; while (vma) { -@@ -3162,6 +3192,11 @@ +@@ -3140,8 +3170,12 @@ + arch_exit_mmap(mm); + + vma = mm->mmap; +- if (!vma) /* Can happen if dup_mmap() received an OOM */ ++ /* Can happen if dup_mmap() received an OOM */ ++ if (!vma) { ++ /* Release write lock previously taken for UKSM */ ++ up_write(&mm->mmap_sem); + return; ++ } + + lru_add_drain(); + flush_cache_mm(mm); +@@ -3162,6 +3196,11 @@ vma = remove_vma(vma); } vm_unacct_memory(nr_accounted); @@ -1286,7 +1295,7 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c } /* Insert vm structure into process list sorted by address -@@ -3269,6 +3304,7 @@ +@@ -3269,6 +3308,7 @@ new_vma->vm_ops->open(new_vma); vma_link(mm, new_vma, prev, rb_link, rb_parent); *need_rmap_locks = false; @@ -1294,7 +1303,7 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c } return new_vma; -@@ -3419,6 +3455,7 @@ +@@ -3419,6 +3459,7 @@ vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT); perf_event_mmap(vma); @@ -1302,9 +1311,21 @@ diff -Nur a/mm/mmap.c b/mm/mmap.c return vma; +diff -Nur a/mm/rmap.c b/mm/rmap.c +--- a/mm/rmap.c 2019-06-25 04:34:56.000000000 +0100 ++++ b/mm/rmap.c 2019-07-07 11:43:00.148837320 +0100 +@@ -1021,7 +1021,7 @@ + * __page_set_anon_rmap - set up new anonymous rmap + * @page: Page or Hugepage to add to rmap + * @vma: VM area to add page to. +- * @address: User virtual address of the mapping ++ * @address: User virtual address of the mapping + * @exclusive: the page is exclusively owned by the current process + */ + static void __page_set_anon_rmap(struct page *page, diff -Nur a/mm/uksm.c b/mm/uksm.c --- a/mm/uksm.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/mm/uksm.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/uksm.c 2019-07-07 11:43:00.148837320 +0100 @@ -0,0 +1,5580 @@ +/* + * Ultra KSM. Copyright (C) 2011-2012 Nai Xia @@ -2801,9 +2822,9 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + .page = page, + .vma = vma, + }; -+ struct mmu_notifier_range range; + int swapped; + int err = -EFAULT; ++ struct mmu_notifier_range range; + + pvmw.address = page_address_in_vma(page, vma); + if (pvmw.address == -EFAULT) @@ -2811,7 +2832,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + + BUG_ON(PageTransCompound(page)); + -+ mmu_notifier_range_init(&range, mm, pvmw.address, pvmw.address + PAGE_SIZE); ++ mmu_notifier_range_init(&range, mm, pvmw.address, pvmw.address + PAGE_SIZE); + mmu_notifier_invalidate_range_start(&range); + + if (!page_vma_mapped_walk(&pvmw)) @@ -2886,7 +2907,6 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + struct page *kpage, pte_t orig_pte) +{ + struct mm_struct *mm = vma->vm_mm; -+ struct mmu_notifier_range range; + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; @@ -2897,6 +2917,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + + unsigned long addr; + int err = MERGE_ERR_PGERR; ++ struct mmu_notifier_range range; + + addr = page_address_in_vma(page, vma); + if (addr == -EFAULT) @@ -2916,7 +2937,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + if (!pmd_present(*pmd)) + goto out; + -+ mmu_notifier_range_init(&range, mm, addr, addr + PAGE_SIZE); ++ mmu_notifier_range_init(&range, mm, addr, addr + PAGE_SIZE); + mmu_notifier_invalidate_range_start(&range); + + ptep = pte_offset_map_lock(mm, pmd, addr, &ptl); @@ -6888,7 +6909,7 @@ diff -Nur a/mm/uksm.c b/mm/uksm.c + diff -Nur a/mm/vmstat.c b/mm/vmstat.c --- a/mm/vmstat.c 2019-06-25 04:34:56.000000000 +0100 -+++ b/mm/vmstat.c 2019-07-07 09:32:50.461840572 +0100 ++++ b/mm/vmstat.c 2019-07-07 11:43:00.148837320 +0100 @@ -1165,6 +1165,9 @@ "nr_written", "nr_kernel_misc_reclaimable", diff --git a/sys-kernel/linux-sources-redcore/linux-sources-redcore-5.1.15.ebuild b/sys-kernel/linux-sources-redcore/linux-sources-redcore-5.1.15.ebuild index 585459a0..3d644b85 100644 --- a/sys-kernel/linux-sources-redcore/linux-sources-redcore-5.1.15.ebuild +++ b/sys-kernel/linux-sources-redcore/linux-sources-redcore-5.1.15.ebuild @@ -36,7 +36,8 @@ PATCHES=( "${FILESDIR}"/"${KV_MAJOR}"-fix-acpi_dbg_level.patch "${FILESDIR}"/"${KV_MAJOR}"-radeon_dp_aux_transfer_native-no-ratelimited_debug.patch "${FILESDIR}"/"${KV_MAJOR}"-Unknow-SSD-HFM128GDHTNG-8310B-QUIRK_NO_APST.patch - "${FILESDIR}"/"${KV_MAJOR}"-linux-hardened.patch + "${FILESDIR}"/"${KV_MAJOR}"-0001-uksm-initial-submission-linux-hardened.patch + "${FILESDIR}"/"${KV_MAJOR}"-0001-uksm-apply-52d1e606ee733.patch "${FILESDIR}"/"${KV_MAJOR}"-uksm-linux-hardened.patch "${FILESDIR}"/"${KV_MAJOR}"-0001-MultiQueue-Skiplist-Scheduler-version-0.192-linux-hardened.patch "${FILESDIR}"/"${KV_MAJOR}"-0002-Fix-Werror-build-failure-in-tools.patch |