This adds two flags to process_vm_readv/writev: - PROCESS_VM_PIDFD: refer to the remote process via PID file descriptor instead of PID. - PROCESS_VM_NOWAIT: do not block on IO if the memory access causes a page fault.
v4: https://lore.kernel.org/lkml/[email protected]/ v3: https://lore.kernel.org/lkml/[email protected]/ v2: https://lore.kernel.org/lkml/[email protected]/ v1: https://lore.kernel.org/lkml/[email protected]/ Sashiko review of v4: https://sashiko.dev/#/patchset/[email protected] Sashiko review of v3: https://sashiko.dev/#/patchset/[email protected] Sashiko review of v2: https://sashiko.dev/#/patchset/[email protected] Related man-pages fix (corrects pre-existing partial transfer documentation, not the new flags proposed here): https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/?id=a0b1df86b0c951beb896d468f200be7fd44631e3 Changes since v4: - Add process_vm_readv to .gitignore (Sashiko) - Use ~0UL instead of 255 for invalid flags tests (Sashiko) - Use volatile uint8_t instead of volatile uint64_t for page fault-in to avoid alignment issues on strict-alignment architectures (Sashiko) - Use UFFDIO_UNREGISTER in uffd handler error path to safely unblock the main thread without double-close (Sashiko) - Rebase onto v7.1-rc6 Changes since v3: - Rename include/uapi/linux/process_vm.h to process_vm_access.h to match mm/process_vm_access.c (David Hildenbrand) - Fix MAINTAINERS alphabetical sort order (David Hildenbrand) - Document NOWAIT return value in commit message (David Hildenbrand) - Document PIDFD EBADF error in commit message (David Hildenbrand) - Add suggested man page update text in commit message (David Hildenbrand, Christian Brauner, Mike Rapoport) - Keep (1UL << N) in UAPI header: BIT() is defined in vdso/bits.h which is not exported to userspace (David Hildenbrand) - Add selftests for NOWAIT partial reads across resident and non-resident pages (single iovec and two iovecs) - SKIP tests gracefully on kernels without flag support (Sashiko) - Verify content of partial reads in selftests - Rebase onto v7.1-rc3 Changes since v2: - Fix ERR_PTR handling for pidfd_get_task(): use IS_ERR()/PTR_ERR() for the pidfd path, matching process_madvise() (Usama Arif, Sashiko) - Add selftest for invalid pidfd (David Hildenbrand) - Add selftest for invalid pid - Remove hardcoded __NR_pidfd_open fallback, use <sys/syscall.h> (Sashiko) - SKIP pidfd tests on kernels without pidfd_open (ENOSYS) (Sashiko) - SKIP userfaultfd tests when unprivileged userfaultfd is disabled (EPERM) (Sashiko) - Fault in test_data before NOWAIT tests to ensure page is resident (Sashiko) - Add ksft_process_vm_readv.sh wrapper and run_vmtests.sh entry so the test runs in CI - Rebase onto v7.1-rc1 Not addressed: - 64-bit process reading 32-bit process high addresses: pre-existing concern in the existing process_vm_readv code, not introduced by this patch (David Laight) - EAGAIN instead of short read/EFAULT for non-resident pages: short-read semantics are more informative and consistent with O_NONBLOCK conventions; the profiler use case does not intend to retry (Sashiko) - mmap_read_trylock with NOWAIT: would expand scope significantly and is not how other FOLL_NOWAIT users in the kernel work (Sashiko) - GFP_NOWAIT for page array allocation: the allocation is small and rarely blocks; not on the data path (Sashiko) Alban Crequy (2): mm/process_vm_access: pidfd and nowait support for process_vm_readv/writev selftests/mm: add tests for process_vm_readv flags MAINTAINERS | 1 + include/uapi/linux/process_vm_access.h | 9 + mm/process_vm_access.c | 34 +- tools/testing/selftests/mm/.gitignore | 1 + tools/testing/selftests/mm/Makefile | 2 + .../selftests/mm/ksft_process_vm_readv.sh | 4 + tools/testing/selftests/mm/process_vm_readv.c | 591 ++++++++++++++++++ tools/testing/selftests/mm/run_vmtests.sh | 4 + 8 files changed, 637 insertions(+), 9 deletions(-) create mode 100644 include/uapi/linux/process_vm_access.h create mode 100755 tools/testing/selftests/mm/ksft_process_vm_readv.sh create mode 100644 tools/testing/selftests/mm/process_vm_readv.c -- 2.45.0

