Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp1997983ybb; Thu, 26 Mar 2020 19:12:03 -0700 (PDT) X-Google-Smtp-Source: ADFU+vvzSj0Lo/IzUvWTogQRrS1Sez3pGXHzm2oece3FRdWIIAOhIBiitWcVvxKwd2xOU05IVKKI X-Received: by 2002:a4a:aece:: with SMTP id v14mr7409880oon.48.1585275123215; Thu, 26 Mar 2020 19:12:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585275123; cv=none; d=google.com; s=arc-20160816; b=0mVkNq89pRBZQUuhIPkxDS/eohvW6CFPvaup9HntDqS7JqIQUghOEH5F+hLETsWZJj GHe/4Ars4KKkFvmomCNJ6HYbthPfVLKWqYqNmBlAe2cr1wJG3A9cS2QMh1mzoubsR83n OMCFZ8hZMTWP8Y0v8WIcYHpO7yBifYwQ4i2f2oY+cicuPtQveyH+YF1WSzqCt0ad7vAm UaQC9FC1fjg5uyUweTZLXdf4bC3LsAkMfU8fHyEa7hWDLD8/M2gWcS1t2EiNmHXvHZnb kRJx/Y5wMJK253E7+2Yg0hdEwjwPFz862TRpBX26nz0DDpZze6pFdjOlb5lqDEAHkFhb Bl7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:mime-version :message-id:date:dkim-signature; bh=iqSHG7ypiyFebpPr56P/zbjIPo9yONnqAWaL/Z9YRSU=; b=tHlqiz466I5RjmAzklmDdpcX/cq1FFQlDHtQJ4deNwBTBUrTsPmkLadUcpSGC2yZ7Y 3SNSN8ou7H1DMgX6foOpdC5Lqf4WIR0gLjpA/EUa35NS6jzayFe9F54zwDmAFMgFQJCJ Wl6fMdmtrCZN4hV9B99w224Wvz/j1CM1vn4EyUluAVjZjCgYlJ1HEZrcdEcQdcQukNED XK3B3zejlQIfzKhdoOhvcuFtVstby/mgB43FLzQ0Ndq0565w8q8Mkem4IJnXpaDHW2cB r2tn+r4i/gCAHyxXq06FcL/s6W9BEPxoXvJBkEZTOnD8/JjKccS+6Q5kskGHiipHCMLs KxRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=NKHaSkom; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r5si1826334otp.241.2020.03.26.19.11.35; Thu, 26 Mar 2020 19:12:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=NKHaSkom; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727696AbgC0CLD (ORCPT + 99 others); Thu, 26 Mar 2020 22:11:03 -0400 Received: from mail-pl1-f201.google.com ([209.85.214.201]:38225 "EHLO mail-pl1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726496AbgC0CLD (ORCPT ); Thu, 26 Mar 2020 22:11:03 -0400 Received: by mail-pl1-f201.google.com with SMTP id r16so5942535pls.5 for ; Thu, 26 Mar 2020 19:11:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=iqSHG7ypiyFebpPr56P/zbjIPo9yONnqAWaL/Z9YRSU=; b=NKHaSkomqhoj3iexa44cq0v0BVAN18TpmyOXT9jEUHVAPLRZCcsn5MJU91WZJbeYWh t+LcJQ5gSyqGBm6T8fCyJfy4F8XceeJQcPourcL4gbpTzTAKVDhHB4JvJ9H0zouT5Eab WOnWrSPjpYpVANqmK44Pj8U1MM1m1LLvHfo+ECp6vRLDshRqsXiwyc+ILJl453oQAAU8 TV8nT+d5xp3jRNxSmDepS0enqdAUUltylJ6wFtOiok7OygZSX+I5lWY0TEBXFFmrYsBU 1BpqIIm9KXw9Bm5qss5Ncv3Fi/tbW2fgaYY8Ycpz5YIrKHCDmxdgtyL1YC+D34LSErxS r7GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=iqSHG7ypiyFebpPr56P/zbjIPo9yONnqAWaL/Z9YRSU=; b=F12kGZYbLHvW3DTJ33TLyeonfU2TfYqk/IEauV9z2uru7dcCYKDD0LRlB277IBgcrw FsGtEmqq8yOGiPywSGwFLwLuF+7wYyYhhkfgR3/GMxnWepQ6/mXusEnK4zQbgJyL7+PT O/wMVJaI7P9b5jI5sfHq9YpphGn3xb9wpArFtCY4xdIyFLcjNLFqc+wSCuOndaQ5OA86 z0HupdkpMM0kCs2b2e5SJtc8QRcDdYp/Gku9FKfjuJsEJ8h2Jo2bXPo4fMFZexIkcbrN VNBqWACAJy8Ce4zhirmaMyxrfNsGFO5UdMb7kyPAX5AE4alqegMvgx0rh4imc/D6RGir lbuQ== X-Gm-Message-State: ANhLgQ2k/uB4HfAysGnUYG3L5DrIGmsV2U894Lix6Thf6olaiBc1GpWb v85nNPQaUeNX+OFivWjt+HFWkhvgjK4= X-Received: by 2002:a17:90a:dd42:: with SMTP id u2mr3283254pjv.10.1585275060979; Thu, 26 Mar 2020 19:11:00 -0700 (PDT) Date: Thu, 26 Mar 2020 19:10:48 -0700 Message-Id: <20200327021058.221911-1-walken@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.26.0.rc2.310.g2932bb562d-goog Subject: [PATCH v2 00/10] Add a new mmap locking API wrapping mmap_sem calls From: Michel Lespinasse To: Andrew Morton , linux-mm Cc: LKML , Peter Zijlstra , Laurent Dufour , Vlastimil Babka , Matthew Wilcox , Liam Howlett , Jerome Glisse , Davidlohr Bueso , David Rientjes , Hugh Dickins , Ying Han , Jason Gunthorpe , Markus Elfring , Michel Lespinasse Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch series adds a new mmap locking API replacing the existing mmap_sem lock and unlocks. Initially the API is just implemente in terms of inlined rwsem calls, so it doesn't provide any new functionality. There are two justifications for the new API: - At first, it provides an easy hooking point to instrument mmap_sem locking latencies independently of any other rwsems. - In the future, it may be a starting point for replacing the rwsem implementation with a different one, such as range locks. This is something that is being explored, even though there is no wide concensus about this possible direction yet. (see https://patchwork.kernel.org/cover/11401483/) Changes since v1 of the patchset: - Manually convert drivers/dma-buf/dma-resv.c ahead of the automated coccinelle conversion as this file requires a new include statement. Thanks to Intel's kbuild test bot for finding the issue. - In coccinelle automated conversion, apply a single coccinelle rule as suggested by Markus Elfring. - In manual conversion of sites missed by coccinelle, fix an issue where I had used mm_read_unlock (from an older version of my patchset) instead of mmap_read_unlock in some arch/mips code. This was also identified by Intel's kbuild test bot. - Do not add a new mmap_is_locked API, and use lockdep_assert_held instead. Thanks to Matthew Wilcox for the suggestion. The changes apply on top of v5.6-rc7. I think it would be feasible to push these changes towards mainline if given sufficient approval. The coccinelle part of the change is relatively invasive, but can be skipped over on a file by file basis if it causes any conflicts with other pending changes. The new mmap locking API can interoperate with new code that is still using direct rwsem calls, until the last patch in the series which renames mmap_sem to enforce using the new API. Maybe that last patch could be delayed for a bit, so that we'd get a chance to convert any new code that locks mmap_sem in the -rc1 release before applying that last patch. Michel Lespinasse (10): mmap locking API: initial implementation as rwsem wrappers MMU notifier: use the new mmap locking API DMA reservations: use the new mmap locking API mmap locking API: use coccinelle to convert mmap_sem rwsem call sites mmap locking API: convert mmap_sem call sites missed by coccinelle mmap locking API: convert nested write lock sites mmap locking API: add mmap_read_release() and mmap_read_unlock_non_owner() mmap locking API: add MMAP_LOCK_INITIALIZER mmap locking API: use lockdep_assert_held mmap locking API: rename mmap_sem to mmap_lock arch/alpha/kernel/traps.c | 4 +- arch/alpha/mm/fault.c | 10 +-- arch/arc/kernel/process.c | 4 +- arch/arc/kernel/troubleshoot.c | 4 +- arch/arc/mm/fault.c | 4 +- arch/arm/kernel/process.c | 4 +- arch/arm/kernel/swp_emulate.c | 4 +- arch/arm/lib/uaccess_with_memcpy.c | 16 ++-- arch/arm/mm/fault.c | 6 +- arch/arm64/kernel/traps.c | 4 +- arch/arm64/kernel/vdso.c | 8 +- arch/arm64/mm/fault.c | 8 +- arch/csky/kernel/vdso.c | 4 +- arch/csky/mm/fault.c | 8 +- arch/hexagon/kernel/vdso.c | 4 +- arch/hexagon/mm/vm_fault.c | 8 +- arch/ia64/kernel/perfmon.c | 8 +- arch/ia64/mm/fault.c | 12 +-- arch/ia64/mm/init.c | 12 +-- arch/m68k/kernel/sys_m68k.c | 14 ++-- arch/m68k/mm/fault.c | 8 +- arch/microblaze/mm/fault.c | 12 +-- arch/mips/kernel/traps.c | 4 +- arch/mips/kernel/vdso.c | 4 +- arch/mips/mm/fault.c | 10 +-- arch/nds32/kernel/vdso.c | 6 +- arch/nds32/mm/fault.c | 12 +-- arch/nios2/mm/fault.c | 12 +-- arch/nios2/mm/init.c | 4 +- arch/openrisc/mm/fault.c | 10 +-- arch/parisc/kernel/traps.c | 6 +- arch/parisc/mm/fault.c | 8 +- arch/powerpc/kernel/vdso.c | 6 +- arch/powerpc/kvm/book3s_64_mmu_hv.c | 4 +- arch/powerpc/kvm/book3s_hv.c | 6 +- arch/powerpc/kvm/book3s_hv_uvmem.c | 12 +-- arch/powerpc/kvm/e500_mmu_host.c | 4 +- arch/powerpc/mm/book3s64/iommu_api.c | 4 +- arch/powerpc/mm/book3s64/subpage_prot.c | 12 +-- arch/powerpc/mm/copro_fault.c | 4 +- arch/powerpc/mm/fault.c | 12 +-- arch/powerpc/oprofile/cell/spu_task_sync.c | 6 +- arch/powerpc/platforms/cell/spufs/file.c | 4 +- arch/riscv/kernel/vdso.c | 4 +- arch/riscv/mm/fault.c | 10 +-- arch/s390/kernel/vdso.c | 4 +- arch/s390/kvm/gaccess.c | 4 +- arch/s390/kvm/kvm-s390.c | 24 +++--- arch/s390/kvm/priv.c | 32 ++++---- arch/s390/mm/fault.c | 6 +- arch/s390/mm/gmap.c | 40 ++++----- arch/s390/pci/pci_mmio.c | 4 +- arch/sh/kernel/sys_sh.c | 6 +- arch/sh/kernel/vsyscall/vsyscall.c | 4 +- arch/sh/mm/fault.c | 14 ++-- arch/sparc/mm/fault_32.c | 18 ++-- arch/sparc/mm/fault_64.c | 12 +-- arch/sparc/vdso/vma.c | 4 +- arch/um/include/asm/mmu_context.h | 5 +- arch/um/kernel/tlb.c | 2 +- arch/um/kernel/trap.c | 6 +- arch/unicore32/mm/fault.c | 6 +- arch/x86/entry/vdso/vma.c | 14 ++-- arch/x86/events/core.c | 4 +- arch/x86/kernel/tboot.c | 2 +- arch/x86/kernel/vm86_32.c | 4 +- arch/x86/kvm/mmu/paging_tmpl.h | 8 +- arch/x86/mm/fault.c | 10 +-- arch/x86/um/vdso/vma.c | 4 +- arch/xtensa/mm/fault.c | 10 +-- drivers/android/binder_alloc.c | 10 +-- drivers/dma-buf/dma-resv.c | 5 +- drivers/firmware/efi/efi.c | 2 +- .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 4 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 10 +-- drivers/gpu/drm/amd/amdkfd/kfd_events.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_mman.c | 4 +- drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 8 +- drivers/gpu/drm/nouveau/nouveau_svm.c | 20 ++--- drivers/gpu/drm/radeon/radeon_cs.c | 4 +- drivers/gpu/drm/radeon/radeon_gem.c | 6 +- drivers/gpu/drm/ttm/ttm_bo_vm.c | 4 +- drivers/infiniband/core/umem_odp.c | 4 +- drivers/infiniband/core/uverbs_main.c | 4 +- drivers/infiniband/hw/mlx4/mr.c | 4 +- drivers/infiniband/hw/qib/qib_user_pages.c | 6 +- drivers/infiniband/hw/usnic/usnic_uiom.c | 4 +- drivers/infiniband/sw/siw/siw_mem.c | 4 +- drivers/iommu/amd_iommu_v2.c | 4 +- drivers/iommu/intel-svm.c | 4 +- drivers/media/v4l2-core/videobuf-core.c | 4 +- drivers/media/v4l2-core/videobuf-dma-contig.c | 4 +- drivers/media/v4l2-core/videobuf-dma-sg.c | 4 +- drivers/misc/cxl/cxllib.c | 4 +- drivers/misc/cxl/fault.c | 4 +- drivers/misc/sgi-gru/grufault.c | 16 ++-- drivers/misc/sgi-gru/grufile.c | 4 +- drivers/oprofile/buffer_sync.c | 10 +-- drivers/staging/kpc2000/kpc_dma/fileops.c | 4 +- drivers/tee/optee/call.c | 4 +- drivers/vfio/vfio_iommu_type1.c | 8 +- drivers/xen/gntdev.c | 4 +- drivers/xen/privcmd.c | 14 ++-- fs/aio.c | 4 +- fs/coredump.c | 4 +- fs/exec.c | 16 ++-- fs/io_uring.c | 4 +- fs/proc/base.c | 18 ++-- fs/proc/task_mmu.c | 28 +++---- fs/proc/task_nommu.c | 18 ++-- fs/userfaultfd.c | 28 +++---- include/linux/mm.h | 1 + include/linux/mm_types.h | 2 +- include/linux/mmap_lock.h | 82 +++++++++++++++++++ include/linux/mmu_notifier.h | 5 +- ipc/shm.c | 8 +- kernel/acct.c | 4 +- kernel/bpf/stackmap.c | 13 ++- kernel/events/core.c | 4 +- kernel/events/uprobes.c | 16 ++-- kernel/exit.c | 8 +- kernel/fork.c | 14 ++-- kernel/futex.c | 4 +- kernel/sched/fair.c | 4 +- kernel/sys.c | 18 ++-- kernel/trace/trace_output.c | 4 +- mm/filemap.c | 6 +- mm/frame_vector.c | 4 +- mm/gup.c | 20 ++--- mm/hmm.c | 2 +- mm/init-mm.c | 2 +- mm/internal.h | 2 +- mm/khugepaged.c | 36 ++++---- mm/ksm.c | 34 ++++---- mm/madvise.c | 18 ++-- mm/memcontrol.c | 8 +- mm/memory.c | 14 ++-- mm/mempolicy.c | 22 ++--- mm/migrate.c | 8 +- mm/mincore.c | 4 +- mm/mlock.c | 16 ++-- mm/mmap.c | 36 ++++---- mm/mmu_notifier.c | 22 ++--- mm/mprotect.c | 12 +-- mm/mremap.c | 6 +- mm/msync.c | 8 +- mm/nommu.c | 16 ++-- mm/oom_kill.c | 4 +- mm/pagewalk.c | 15 ++-- mm/process_vm_access.c | 4 +- mm/ptdump.c | 4 +- mm/swapfile.c | 4 +- mm/userfaultfd.c | 14 ++-- mm/util.c | 12 +-- net/ipv4/tcp.c | 4 +- net/xdp/xdp_umem.c | 4 +- virt/kvm/arm/mmu.c | 14 ++-- virt/kvm/async_pf.c | 4 +- virt/kvm/kvm_main.c | 8 +- 160 files changed, 779 insertions(+), 693 deletions(-) create mode 100644 include/linux/mmap_lock.h -- 2.26.0.rc2.310.g2932bb562d-goog