Re: [PATCH 00/32] x86: Memory Protection Keys (v7)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dave,

On 12/14/2015 08:05 PM, Dave Hansen wrote:
> Memory Protection Keys for User pages is a CPU feature which will
> first appear on Skylake Servers, but will also be supported on
> future non-server parts (there is also a QEMU implementation).  It
> provides a mechanism for enforcing page-based protections, but
> without requiring modification of the page tables when an
> application changes protection domains.  See the Documentation/
> patch for more details.

You've arbitrarily CCed this mail and one other patch in the 
series to linux-api@. This makes the series hard to review
unless one is subscribed to the LKML firehose. Please, for
future iterations of this series, CC the entire patchset to
linux-api@.

Thanks,

Michael


> This set enables for two things in the end:
> 1. Allows "execute-only" memory
> 2. Enables KVM to run Protection-Key-enabled guests
> 
> Changes from v6:
>  * fix up ??'s showing up in in smaps' VmFlags field
>  * added execute-only support
>  * removed all the new syscalls from this set.  We can discuss
>    them in detail after this is merged.
> 
> Changes from v5:
> 
>  * make types in read_pkru() u32's, not ints
>  * rework VM_* bits to avoid using __ffsl() and clean up
>    vma_pkey()
>  * rework pte_allows_gup() to use p??_val() instead of passing
>    around p{te,md,ud}_t types.
>  * Fix up some inconsistent bool vs. int usage
>  * corrected name of ARCH_VM_PKEY_FLAGS in patch description
>  * remove NR_PKEYS... config option.  Just define it directly
> 
> Changes from v4:
> 
>  * Made "allow setting of XSAVE state" safe if we got preempted
>    between when we saved our FPU state and when we restore it.
>    (I would appreciate a look from Ingo on this patch).
>  * Fixed up a few things from Thomas's latest comments: splt up
>    siginfo in to x86 and generic, removed extra 'eax' variable
>    in rdpkru function, reworked vm_flags assignment, reworded
>    a comment in pte_allows_gup()
>  * Add missing DISABLED/REQUIRED_MASK14 in cpufeature.h
>  * Added comment about compile optimization in fault path
>  * Left get_user_pages_locked() alone.  Andrea thinks we need it.
> 
> Changes from RFCv3:
> 
>  * Added 'current' and 'foreign' variants of get_user_pages() to
>    help indicate whether protection keys should be enforced.
>    Thanks to Jerome Glisse for pointing out this issue.
>  * Added "allocation" and set/get system calls so that we can do
>    management of proection keys in the kernel.  This opens the
>    door to use of specific protection keys for kernel use in the
>    future, such as for execute-only memory.
>  * Removed the kselftest code for the moment.  It will be
>    submitted separately.
> 
> Thanks Ingo and Thomas for most of these):
> Changes from RFCv2 (Thanks Ingo and Thomas for most of these):
> 
>  * few minor compile warnings
>  * changed 'nopku' interaction with cpuid bits.  Now, we do not
>    clear the PKU cpuid bit, we just skip enabling it.
>  * changed __pkru_allows_write() to also check access disable bit
>  * removed the unused write_pkru()
>  * made si_pkey a u64 and added some patch description details.
>    Also made it share space in siginfo with MPX and clarified
>    comments.
>  * give some real text for the Processor Trace xsave state
>  * made vma_pkey() less ugly (and much more optimized actually)
>  * added SEGV_PKUERR to copy_siginfo_to_user()
>  * remove page table walk when filling in si_pkey, added some
>    big fat comments about it being inherently racy.
>  * added self test code
> 
> This code is not runnable to anyone outside of Intel unless they
> have some special hardware or a fancy simulator.  There is a qemu
> model to emulate the feature, but it is not currently implemented
> fully enough to be usable.  If you are interested in running this
> for real, please get in touch with me.  Hardware is available to a
> very small but nonzero number of people.
> 
> This set is also available here:
> 
> 	git://git.kernel.org/pub/scm/linux/kernel/git/daveh/x86-pkeys.git pkeys-v018
> 
> === diffstat ===
> 
> Dave Hansen (32):
>       mm, gup: introduce concept of "foreign" get_user_pages()
>       x86, fpu: add placeholder for Processor Trace XSAVE state
>       x86, pkeys: Add Kconfig option
>       x86, pkeys: cpuid bit definition
>       x86, pkeys: define new CR4 bit
>       x86, pkeys: add PKRU xsave fields and data structure(s)
>       x86, pkeys: PTE bits for storing protection key
>       x86, pkeys: new page fault error code bit: PF_PK
>       x86, pkeys: store protection in high VMA flags
>       x86, pkeys: arch-specific protection bits
>       x86, pkeys: pass VMA down in to fault signal generation code
>       signals, pkeys: notify userspace about protection key faults
>       x86, pkeys: fill in pkey field in siginfo
>       x86, pkeys: add functions to fetch PKRU
>       mm: factor out VMA fault permission checking
>       x86, mm: simplify get_user_pages() PTE bit handling
>       x86, pkeys: check VMAs and PTEs for protection keys
>       mm: add gup flag to indicate "foreign" mm access
>       x86, pkeys: optimize fault handling in access_error()
>       x86, pkeys: differentiate instruction fetches
>       x86, pkeys: dump PKRU with other kernel registers
>       x86, pkeys: dump PTE pkey in /proc/pid/smaps
>       x86, pkeys: add Kconfig prompt to existing config option
>       x86, pkeys: actually enable Memory Protection Keys in CPU
>       mm, multi-arch: pass a protection key in to calc_vm_flag_bits()
>       x86, pkeys: add arch_validate_pkey()
>       x86: separate out LDT init from context init
>       x86, fpu: allow setting of XSAVE state
>       x86, pkeys: allow kernel to modify user pkey rights register
>       x86, pkeys: create an x86 arch_calc_vm_prot_bits() for VMA flags
>       x86, pkeys: execute-only support
>       x86, pkeys: Documentation
> 
>  Documentation/kernel-parameters.txt         |   3 +
>  Documentation/x86/protection-keys.txt       |  27 +++
>  arch/mips/mm/gup.c                          |   3 +-
>  arch/powerpc/include/asm/mman.h             |   5 +-
>  arch/powerpc/include/asm/mmu_context.h      |  12 ++
>  arch/s390/include/asm/mmu_context.h         |  12 ++
>  arch/s390/mm/gup.c                          |   3 +-
>  arch/sh/mm/gup.c                            |   2 +-
>  arch/sparc/mm/gup.c                         |   2 +-
>  arch/unicore32/include/asm/mmu_context.h    |  12 ++
>  arch/x86/Kconfig                            |  16 ++
>  arch/x86/include/asm/cpufeature.h           |  56 +++---
>  arch/x86/include/asm/disabled-features.h    |  13 ++
>  arch/x86/include/asm/fpu/internal.h         |   2 +
>  arch/x86/include/asm/fpu/types.h            |  12 ++
>  arch/x86/include/asm/fpu/xstate.h           |   4 +-
>  arch/x86/include/asm/mmu_context.h          |  85 ++++++++-
>  arch/x86/include/asm/pgtable.h              |  38 ++++
>  arch/x86/include/asm/pgtable_types.h        |  34 +++-
>  arch/x86/include/asm/pkeys.h                |  34 ++++
>  arch/x86/include/asm/required-features.h    |   5 +
>  arch/x86/include/asm/special_insns.h        |  22 +++
>  arch/x86/include/uapi/asm/mman.h            |  22 +++
>  arch/x86/include/uapi/asm/processor-flags.h |   2 +
>  arch/x86/kernel/cpu/common.c                |  42 +++++
>  arch/x86/kernel/fpu/core.c                  |  63 +++++++
>  arch/x86/kernel/fpu/xstate.c                | 185 +++++++++++++++++++-
>  arch/x86/kernel/ldt.c                       |   4 +-
>  arch/x86/kernel/process_64.c                |   2 +
>  arch/x86/kernel/setup.c                     |   9 +
>  arch/x86/mm/Makefile                        |   2 +
>  arch/x86/mm/fault.c                         | 171 +++++++++++++++---
>  arch/x86/mm/gup.c                           |  46 +++--
>  arch/x86/mm/mpx.c                           |   4 +-
>  arch/x86/mm/pkeys.c                         | 101 +++++++++++
>  drivers/char/agp/frontend.c                 |   2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c     |   4 +-
>  drivers/gpu/drm/i915/i915_gem_userptr.c     |   2 +-
>  drivers/gpu/drm/radeon/radeon_ttm.c         |   4 +-
>  drivers/gpu/drm/via/via_dmablit.c           |   3 +-
>  drivers/infiniband/core/umem.c              |   2 +-
>  drivers/infiniband/core/umem_odp.c          |   8 +-
>  drivers/infiniband/hw/mthca/mthca_memfree.c |   3 +-
>  drivers/infiniband/hw/qib/qib_user_pages.c  |   3 +-
>  drivers/infiniband/hw/usnic/usnic_uiom.c    |   2 +-
>  drivers/iommu/amd_iommu_v2.c                |   8 +-
>  drivers/media/pci/ivtv/ivtv-udma.c          |   4 +-
>  drivers/media/pci/ivtv/ivtv-yuv.c           |  10 +-
>  drivers/media/v4l2-core/videobuf-dma-sg.c   |   3 +-
>  drivers/misc/sgi-gru/grufault.c             |   3 +-
>  drivers/scsi/st.c                           |   2 -
>  drivers/staging/android/ashmem.c            |   4 +-
>  drivers/video/fbdev/pvr2fb.c                |   4 +-
>  drivers/virt/fsl_hypervisor.c               |   5 +-
>  fs/exec.c                                   |   8 +-
>  fs/proc/task_mmu.c                          |  14 ++
>  include/asm-generic/mm_hooks.h              |  12 ++
>  include/linux/mm.h                          |  60 +++++--
>  include/linux/mman.h                        |   6 +-
>  include/linux/pkeys.h                       |  33 ++++
>  include/uapi/asm-generic/siginfo.h          |  17 +-
> 
> Cc: linux-api@xxxxxxxxxxxxxxx
> Cc: linux-arch@xxxxxxxxxxxxxxx
> Cc: aarcange@xxxxxxxxxx
> Cc: akpm@xxxxxxxxxxxxxxxxxxxx
> Cc: jack@xxxxxxx
> Cc: kirill.shutemov@xxxxxxxxxxxxxxx
> Cc: linux-api@xxxxxxxxxxxxxxx
> Cc: linux-arch@xxxxxxxxxxxxxxx
> Cc: n-horiguchi@xxxxxxxxxxxxx
> Cc: x86@xxxxxxxxxx
> Cc: torvalds@xxxxxxxxxxxxxxxxxxxx
> --
> To unsubscribe from this list: send the line "unsubscribe linux-api" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]