Popcorn Linux is a Linux kernel-based software stack that enables applications to execute, with a shared source base, on distributed hosts.
This Popcorn patch adds x86_64 functionality only. Future iterations of Popcorn will support heterogeneous architectures. --- arch/x86/Kconfig | 3 +++ arch/x86/include/asm/pgtable.h | 11 +++++++++++ arch/x86/kernel/Makefile | 1 + arch/x86/mm/fault.c | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2bbbd4d1b..4ca75c6c3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -88,6 +88,7 @@ config X86 select ARCH_SUPPORTS_ACPI select ARCH_SUPPORTS_ATOMIC_RMW select ARCH_SUPPORTS_NUMA_BALANCING if X86_64 + select ARCH_SUPPORTS_POPCORN if X86_64 select ARCH_USE_BUILTIN_BSWAP select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_SPINLOCKS @@ -353,6 +354,8 @@ config PGTABLE_LEVELS default 3 if X86_PAE default 2 +source "kernel/Kconfig.popcorn" + config CC_HAS_SANE_STACKPROTECTOR bool default $(success,$(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC)) if 64BIT diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index 5e0509b41..7a0171c67 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h @@ -210,9 +210,13 @@ static inline u64 protnone_mask(u64 val); static inline unsigned long pte_pfn(pte_t pte) { +#ifdef CONFIG_POPCORN + return (pte_val(pte) & PTE_PFN_MASK) >> PAGE_SHIFT; +#else phys_addr_t pfn = pte_val(pte); pfn ^= protnone_mask(pfn); return (pfn & PTE_PFN_MASK) >> PAGE_SHIFT; +#endif } static inline unsigned long pmd_pfn(pmd_t pmd) @@ -602,7 +606,11 @@ static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask); static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) { +#ifndef CONFIG_POPCORN pteval_t val = pte_val(pte), oldval = val; +#else + pteval_t val = pte_val(pte); +#endif /* * Chop off the NX bit (if present), and add the NX portion of @@ -610,8 +618,11 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) */ val &= _PAGE_CHG_MASK; val |= check_pgprot(newprot) & ~_PAGE_CHG_MASK; +#ifndef CONFIG_POPCORN val = flip_protnone_guard(oldval, val, PTE_PFN_MASK); +#endif return __pte(val); + } static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index ce1b5cc36..3fb863285 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile @@ -133,6 +133,7 @@ obj-$(CONFIG_EFI) += sysfb_efi.o obj-$(CONFIG_PERF_EVENTS) += perf_regs.o obj-$(CONFIG_TRACING) += tracepoint.o +obj-$(CONFIG_POPCORN) += process_server.o obj-$(CONFIG_SCHED_MC_PRIO) += itmt.o obj-$(CONFIG_X86_INTEL_UMIP) += umip.o diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 46df4c6aa..14b9755f9 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -33,6 +33,11 @@ #define CREATE_TRACE_POINTS #include <asm/trace/exceptions.h> +#ifdef CONFIG_POPCORN +#include <popcorn/types.h> +#include <popcorn/vma_server.h> +#endif + /* * Returns 0 if mmiotrace is disabled, or if the fault is not * handled by mmiotrace: @@ -1416,6 +1421,19 @@ void do_user_addr_fault(struct pt_regs *regs, } vma = find_vma(mm, address); +#ifdef CONFIG_POPCORN + /* vma worker should not fault */ + BUG_ON(tsk->is_worker); + + if (distributed_remote_process(tsk)) { + if (!vma || vma->vm_start > address) { + if (vma_server_fetch_vma(tsk, address) == 0) { + /* Replace with updated VMA */ + vma = find_vma(mm, address); + } + } + } +#endif if (unlikely(!vma)) { bad_area(regs, hw_error_code, address); return; -- 2.17.1