
Initial support for NUMA RO-data replication. You can enable replication for a specific process or for a whole memory cgroup. Processes: /proc/$PID/numa_table_replication 0 - table replication disabled. 1 - tables for RO-data are replicated. 2 - all tables are replicated. /proc/$PID/numa_data_replication 0 - data is not replicated. 1 - hot RO-data is replicated. 2 - all RO-data is replicated. (May not work properly now, avoid if possible) Cgroups: /sys/fs/cgroup/memeory/$CGNAME/memory.numa_table_replication same as for processes. /sys/fs/cgroup/memeory/$CGNAME/memory.numa_data_replication 0 - data is not replicated. 1 - hot RO-data is replicated. 2 - hot RO-data is replicated and on adding to cgroup all existing RO-data of a process is replicated. 3 - all RO-data is replicated. (May not work properly now, avoid if possible) Entry numa_replication_stats shows the amount of replicated data in a process or a cgroup. Nikita Panov (2): mm: Implement kernel replication for aarch64 mm: NUMA User RO-data Replication arch/arm64/configs/openeuler_defconfig | 1 + arch/arm64/include/asm/extable.h | 2 + arch/arm64/include/asm/memory.h | 15 + arch/arm64/include/asm/mmu_context.h | 35 +- arch/arm64/include/asm/numa_replication.h | 58 + arch/arm64/include/asm/pgtable.h | 26 + arch/arm64/kernel/alternative.c | 45 +- arch/arm64/kernel/cpufeature.c | 5 + arch/arm64/kernel/hibernate.c | 5 + arch/arm64/kernel/insn.c | 65 +- arch/arm64/kernel/module.c | 38 +- arch/arm64/kernel/sleep.S | 6 + arch/arm64/kernel/smp.c | 7 + arch/arm64/kernel/suspend.c | 6 + arch/arm64/kernel/vmlinux.lds.S | 18 +- arch/arm64/mm/context.c | 3 +- arch/arm64/mm/hugetlbpage.c | 65 +- arch/arm64/mm/init.c | 51 +- arch/arm64/mm/kasan_init.c | 64 +- arch/arm64/mm/mmu.c | 74 +- arch/arm64/mm/pageattr.c | 66 + arch/arm64/mm/pgd.c | 92 +- arch/arm64/mm/ptdump.c | 17 +- arch/x86/mm/init_64.c | 2 +- drivers/firmware/efi/arm-runtime.c | 15 +- drivers/firmware/efi/libstub/arm64-stub.c | 42 +- fs/dax.c | 5 +- fs/exec.c | 9 + fs/proc/base.c | 189 ++ fs/proc/task_mmu.c | 209 +- include/asm-generic/pgalloc.h | 70 + include/asm-generic/pgtable-nop4d.h | 5 + include/asm-generic/pgtable-nopmd.h | 5 + include/asm-generic/pgtable-nopud.h | 5 + include/asm-generic/tlb.h | 11 + include/linux/cgroup.h | 1 + include/linux/gfp.h | 5 + include/linux/memcontrol.h | 15 + include/linux/mm.h | 151 +- include/linux/mm_types.h | 67 +- include/linux/mman.h | 2 +- include/linux/module.h | 12 +- include/linux/moduleloader.h | 11 + include/linux/numa_kernel_replication.h | 297 ++ include/linux/numa_user_replication.h | 1472 ++++++++++ include/linux/page-flags.h | 20 +- include/linux/pgtable.h | 11 + include/linux/set_memory.h | 21 + include/linux/vmalloc.h | 20 + include/trace/events/kmem.h | 99 + include/uapi/asm-generic/mman-common.h | 3 + init/main.c | 14 + kernel/bpf/bpf_struct_ops.c | 9 +- kernel/bpf/trampoline.c | 2 +- kernel/cgroup/cgroup.c | 2 +- kernel/events/uprobes.c | 7 +- kernel/fork.c | 22 + kernel/module.c | 125 +- kernel/sched/fair.c | 16 +- mm/Kconfig | 33 + mm/Makefile | 2 + mm/gup.c | 35 +- mm/huge_memory.c | 647 ++++- mm/hugetlb.c | 53 +- mm/khugepaged.c | 59 +- mm/ksm.c | 33 +- mm/madvise.c | 31 +- mm/memcontrol.c | 262 +- mm/memory.c | 945 ++++++- mm/mempolicy.c | 7 + mm/migrate.c | 26 +- mm/mlock.c | 3 +- mm/mmap.c | 72 +- mm/mmu_gather.c | 42 +- mm/mprotect.c | 303 +- mm/mremap.c | 106 +- mm/numa_kernel_replication.c | 767 +++++ mm/numa_user_replication.c | 3105 +++++++++++++++++++++ mm/page_alloc.c | 21 + mm/page_idle.c | 3 +- mm/page_vma_mapped.c | 3 +- mm/pgtable-generic.c | 11 +- mm/rmap.c | 76 +- mm/share_pool.c | 3 +- mm/shmem.c | 3 +- mm/swap.c | 1 - mm/swap_state.c | 3 +- mm/swapfile.c | 3 +- mm/userfaultfd.c | 6 +- mm/vmalloc.c | 587 +++- 90 files changed, 10307 insertions(+), 679 deletions(-) create mode 100644 arch/arm64/include/asm/numa_replication.h create mode 100644 include/linux/numa_kernel_replication.h create mode 100644 include/linux/numa_user_replication.h create mode 100644 mm/numa_kernel_replication.c create mode 100644 mm/numa_user_replication.c -- 2.34.1