mbox series

[PATCHv9,00/14] Linear Address Masking enabling

Message ID 20220930144758.30232-1-kirill.shutemov@linux.intel.com (mailing list archive)
Headers show
Series Linear Address Masking enabling | expand

Message

Kirill A. Shutemov Sept. 30, 2022, 2:47 p.m. UTC
Linear Address Masking[1] (LAM) modifies the checking that is applied to
64-bit linear addresses, allowing software to use of the untranslated
address bits for metadata.

The capability can be used for efficient address sanitizers (ASAN)
implementation and for optimizations in virtual machines.

The patchset brings support for LAM for userspace addresses. Only LAM_U57 at
this time.

Please review and consider applying.

git://git.kernel.org/pub/scm/linux/kernel/git/kas/linux.git lam

v9:
  - Fix race between LAM enabling and check that KVM memslot address doesn't
    have any tags;
  - Reduce untagged_addr() overhead until the first LAM user;
  - Clarify SVM vs. LAM semantics;
  - Use mmap_lock to serialize LAM enabling;
v8:
  - Drop redundant smb_mb() in prctl_enable_tagged_addr();
  - Cleanup code around build_cr3();
  - Fix commit messages;
  - Selftests updates;
  - Acked/Reviewed/Tested-bys from Alexander and Peter;
v7:
  - Drop redundant smb_mb() in prctl_enable_tagged_addr();
  - Cleanup code around build_cr3();
  - Fix commit message;
  - Fix indentation;
v6:
  - Rebased onto v6.0-rc1
  - LAM_U48 excluded from the patchet. Still available in the git tree;
  - add ARCH_GET_MAX_TAG_BITS;
  - Fix build without CONFIG_DEBUG_VM;
  - Update comments;
  - Reviewed/Tested-by from Alexander;
v5:
  - Do not use switch_mm() in enable_lam_func()
  - Use mb()/READ_ONCE() pair on LAM enabling;
  - Add self-test by Weihong Zhang;
  - Add comments;
v4:
  - Fix untagged_addr() for LAM_U48;
  - Remove no-threads restriction on LAM enabling;
  - Fix mm_struct access from /proc/$PID/arch_status
  - Fix LAM handling in initialize_tlbstate_and_flush()
  - Pack tlb_state better;
  - Comments and commit messages;
v3:
  - Rebased onto v5.19-rc1
  - Per-process enabling;
  - API overhaul (again);
  - Avoid branches and costly computations in the fast path;
  - LAM_U48 is in optional patch.
v2:
  - Rebased onto v5.18-rc1
  - New arch_prctl(2)-based API
  - Expose status of LAM (or other thread features) in
    /proc/$PID/arch_status

[1] ISE, Chapter 10. https://cdrdv2.intel.com/v1/dl/getContent/671368

Kirill A. Shutemov (10):
  x86/mm: Fix CR3_ADDR_MASK
  x86: CPUID and CR3/CR4 flags for Linear Address Masking
  mm: Pass down mm_struct to untagged_addr()
  x86/mm: Handle LAM on context switch
  x86/uaccess: Provide untagged_addr() and remove tags before address
    check
  KVM: Serialize tagged address check against tagging enabling
  x86/mm: Provide arch_prctl() interface for LAM
  x86/mm: Reduce untagged_addr() overhead until the first LAM user
  x86: Expose untagging mask in /proc/$PID/arch_status
  x86/mm, iommu/sva: Make LAM and SVM mutually exclusive

Weihong Zhang (4):
  selftests/x86/lam: Add malloc and tag-bits test cases for
    linear-address masking
  selftests/x86/lam: Add mmap and SYSCALL test cases for linear-address
    masking
  selftests/x86/lam: Add io_uring test cases for linear-address masking
  selftests/x86/lam: Add inherit test cases for linear-address masking

 arch/arm64/include/asm/memory.h               |   4 +-
 arch/arm64/include/asm/signal.h               |   2 +-
 arch/arm64/include/asm/uaccess.h              |   4 +-
 arch/arm64/kernel/hw_breakpoint.c             |   2 +-
 arch/arm64/kernel/traps.c                     |   4 +-
 arch/arm64/mm/fault.c                         |  10 +-
 arch/sparc/include/asm/pgtable_64.h           |   2 +-
 arch/sparc/include/asm/uaccess_64.h           |   2 +
 arch/x86/include/asm/cpufeatures.h            |   1 +
 arch/x86/include/asm/mmu.h                    |  12 +-
 arch/x86/include/asm/mmu_context.h            |  47 +
 arch/x86/include/asm/processor-flags.h        |   4 +-
 arch/x86/include/asm/tlbflush.h               |  35 +
 arch/x86/include/asm/uaccess.h                |  46 +-
 arch/x86/include/uapi/asm/prctl.h             |   5 +
 arch/x86/include/uapi/asm/processor-flags.h   |   6 +
 arch/x86/kernel/Makefile                      |   2 +
 arch/x86/kernel/fpu/xstate.c                  |  47 -
 arch/x86/kernel/proc.c                        |  60 ++
 arch/x86/kernel/process.c                     |   3 +
 arch/x86/kernel/process_64.c                  |  82 +-
 arch/x86/mm/tlb.c                             |  48 +-
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  |   2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c       |   2 +-
 drivers/gpu/drm/radeon/radeon_gem.c           |   2 +-
 drivers/infiniband/hw/mlx4/mr.c               |   2 +-
 drivers/iommu/iommu-sva-lib.c                 |  12 +
 drivers/media/common/videobuf2/frame_vector.c |   2 +-
 drivers/media/v4l2-core/videobuf-dma-contig.c |   2 +-
 .../staging/media/atomisp/pci/hmm/hmm_bo.c    |   2 +-
 drivers/tee/tee_shm.c                         |   2 +-
 drivers/vfio/vfio_iommu_type1.c               |   2 +-
 fs/proc/task_mmu.c                            |   2 +-
 include/linux/mm.h                            |  11 -
 include/linux/mmu_context.h                   |   4 +
 include/linux/uaccess.h                       |  15 +
 lib/strncpy_from_user.c                       |   2 +-
 lib/strnlen_user.c                            |   2 +-
 mm/gup.c                                      |   6 +-
 mm/madvise.c                                  |   2 +-
 mm/mempolicy.c                                |   6 +-
 mm/migrate.c                                  |   2 +-
 mm/mincore.c                                  |   2 +-
 mm/mlock.c                                    |   4 +-
 mm/mmap.c                                     |   2 +-
 mm/mprotect.c                                 |   2 +-
 mm/mremap.c                                   |   2 +-
 mm/msync.c                                    |   2 +-
 tools/testing/selftests/x86/Makefile          |   2 +-
 tools/testing/selftests/x86/lam.c             | 916 ++++++++++++++++++
 virt/kvm/kvm_main.c                           |  14 +-
 51 files changed, 1331 insertions(+), 125 deletions(-)
 create mode 100644 arch/x86/kernel/proc.c
 create mode 100644 tools/testing/selftests/x86/lam.c

Comments

Alexander Potapenko Oct. 6, 2022, 1:58 p.m. UTC | #1
On Fri, Sep 30, 2022 at 4:48 PM Kirill A. Shutemov
<kirill.shutemov@linux.intel.com> wrote:
>
> Linear Address Masking[1] (LAM) modifies the checking that is applied to
> 64-bit linear addresses, allowing software to use of the untranslated
> address bits for metadata.
>
> The capability can be used for efficient address sanitizers (ASAN)
> implementation and for optimizations in virtual machines.
>
> The patchset brings support for LAM for userspace addresses. Only LAM_U57 at
> this time.
>
> Please review and consider applying.
>
> git://git.kernel.org/pub/scm/linux/kernel/git/kas/linux.git lam

Not a big deal, but this tree contains LAM_U48 patches, and after
skipping those the SVM patch does not apply cleanly.

> v9:
>   - Fix race between LAM enabling and check that KVM memslot address doesn't
>     have any tags;
>   - Reduce untagged_addr() overhead until the first LAM user;
>   - Clarify SVM vs. LAM semantics;
>   - Use mmap_lock to serialize LAM enabling;
> v8:
>   - Drop redundant smb_mb() in prctl_enable_tagged_addr();
>   - Cleanup code around build_cr3();
>   - Fix commit messages;
>   - Selftests updates;
>   - Acked/Reviewed/Tested-bys from Alexander and Peter;
> v7:
>   - Drop redundant smb_mb() in prctl_enable_tagged_addr();
>   - Cleanup code around build_cr3();
>   - Fix commit message;
>   - Fix indentation;
> v6:
>   - Rebased onto v6.0-rc1
>   - LAM_U48 excluded from the patchet. Still available in the git tree;
>   - add ARCH_GET_MAX_TAG_BITS;
>   - Fix build without CONFIG_DEBUG_VM;
>   - Update comments;
>   - Reviewed/Tested-by from Alexander;
> v5:
>   - Do not use switch_mm() in enable_lam_func()
>   - Use mb()/READ_ONCE() pair on LAM enabling;
>   - Add self-test by Weihong Zhang;
>   - Add comments;
> v4:
>   - Fix untagged_addr() for LAM_U48;
>   - Remove no-threads restriction on LAM enabling;
>   - Fix mm_struct access from /proc/$PID/arch_status
>   - Fix LAM handling in initialize_tlbstate_and_flush()
>   - Pack tlb_state better;
>   - Comments and commit messages;
> v3:
>   - Rebased onto v5.19-rc1
>   - Per-process enabling;
>   - API overhaul (again);
>   - Avoid branches and costly computations in the fast path;
>   - LAM_U48 is in optional patch.
> v2:
>   - Rebased onto v5.18-rc1
>   - New arch_prctl(2)-based API
>   - Expose status of LAM (or other thread features) in
>     /proc/$PID/arch_status
>
> [1] ISE, Chapter 10. https://cdrdv2.intel.com/v1/dl/getContent/671368
>
> Kirill A. Shutemov (10):
>   x86/mm: Fix CR3_ADDR_MASK
>   x86: CPUID and CR3/CR4 flags for Linear Address Masking
>   mm: Pass down mm_struct to untagged_addr()
>   x86/mm: Handle LAM on context switch
>   x86/uaccess: Provide untagged_addr() and remove tags before address
>     check
>   KVM: Serialize tagged address check against tagging enabling
>   x86/mm: Provide arch_prctl() interface for LAM
>   x86/mm: Reduce untagged_addr() overhead until the first LAM user
>   x86: Expose untagging mask in /proc/$PID/arch_status
>   x86/mm, iommu/sva: Make LAM and SVM mutually exclusive
>
> Weihong Zhang (4):
>   selftests/x86/lam: Add malloc and tag-bits test cases for
>     linear-address masking
>   selftests/x86/lam: Add mmap and SYSCALL test cases for linear-address
>     masking
>   selftests/x86/lam: Add io_uring test cases for linear-address masking
>   selftests/x86/lam: Add inherit test cases for linear-address masking
>
>  arch/arm64/include/asm/memory.h               |   4 +-
>  arch/arm64/include/asm/signal.h               |   2 +-
>  arch/arm64/include/asm/uaccess.h              |   4 +-
>  arch/arm64/kernel/hw_breakpoint.c             |   2 +-
>  arch/arm64/kernel/traps.c                     |   4 +-
>  arch/arm64/mm/fault.c                         |  10 +-
>  arch/sparc/include/asm/pgtable_64.h           |   2 +-
>  arch/sparc/include/asm/uaccess_64.h           |   2 +
>  arch/x86/include/asm/cpufeatures.h            |   1 +
>  arch/x86/include/asm/mmu.h                    |  12 +-
>  arch/x86/include/asm/mmu_context.h            |  47 +
>  arch/x86/include/asm/processor-flags.h        |   4 +-
>  arch/x86/include/asm/tlbflush.h               |  35 +
>  arch/x86/include/asm/uaccess.h                |  46 +-
>  arch/x86/include/uapi/asm/prctl.h             |   5 +
>  arch/x86/include/uapi/asm/processor-flags.h   |   6 +
>  arch/x86/kernel/Makefile                      |   2 +
>  arch/x86/kernel/fpu/xstate.c                  |  47 -
>  arch/x86/kernel/proc.c                        |  60 ++
>  arch/x86/kernel/process.c                     |   3 +
>  arch/x86/kernel/process_64.c                  |  82 +-
>  arch/x86/mm/tlb.c                             |  48 +-
>  .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  |   2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c       |   2 +-
>  drivers/gpu/drm/radeon/radeon_gem.c           |   2 +-
>  drivers/infiniband/hw/mlx4/mr.c               |   2 +-
>  drivers/iommu/iommu-sva-lib.c                 |  12 +
>  drivers/media/common/videobuf2/frame_vector.c |   2 +-
>  drivers/media/v4l2-core/videobuf-dma-contig.c |   2 +-
>  .../staging/media/atomisp/pci/hmm/hmm_bo.c    |   2 +-
>  drivers/tee/tee_shm.c                         |   2 +-
>  drivers/vfio/vfio_iommu_type1.c               |   2 +-
>  fs/proc/task_mmu.c                            |   2 +-
>  include/linux/mm.h                            |  11 -
>  include/linux/mmu_context.h                   |   4 +
>  include/linux/uaccess.h                       |  15 +
>  lib/strncpy_from_user.c                       |   2 +-
>  lib/strnlen_user.c                            |   2 +-
>  mm/gup.c                                      |   6 +-
>  mm/madvise.c                                  |   2 +-
>  mm/mempolicy.c                                |   6 +-
>  mm/migrate.c                                  |   2 +-
>  mm/mincore.c                                  |   2 +-
>  mm/mlock.c                                    |   4 +-
>  mm/mmap.c                                     |   2 +-
>  mm/mprotect.c                                 |   2 +-
>  mm/mremap.c                                   |   2 +-
>  mm/msync.c                                    |   2 +-
>  tools/testing/selftests/x86/Makefile          |   2 +-
>  tools/testing/selftests/x86/lam.c             | 916 ++++++++++++++++++
>  virt/kvm/kvm_main.c                           |  14 +-
>  51 files changed, 1331 insertions(+), 125 deletions(-)
>  create mode 100644 arch/x86/kernel/proc.c
>  create mode 100644 tools/testing/selftests/x86/lam.c
>
> --
> 2.35.1
>
Kirill A. Shutemov Oct. 6, 2022, 4:41 p.m. UTC | #2
On Thu, Oct 06, 2022 at 03:58:21PM +0200, Alexander Potapenko wrote:
> On Fri, Sep 30, 2022 at 4:48 PM Kirill A. Shutemov
> <kirill.shutemov@linux.intel.com> wrote:
> >
> > Linear Address Masking[1] (LAM) modifies the checking that is applied to
> > 64-bit linear addresses, allowing software to use of the untranslated
> > address bits for metadata.
> >
> > The capability can be used for efficient address sanitizers (ASAN)
> > implementation and for optimizations in virtual machines.
> >
> > The patchset brings support for LAM for userspace addresses. Only LAM_U57 at
> > this time.
> >
> > Please review and consider applying.
> >
> > git://git.kernel.org/pub/scm/linux/kernel/git/kas/linux.git lam
> 
> Not a big deal, but this tree contains LAM_U48 patches, and after
> skipping those the SVM patch does not apply cleanly.

Sorry, forgot to push the update. Pushed now.