From patchwork Tue Oct 15 18:12:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 11191385 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B55B1139A for ; Tue, 15 Oct 2019 18:16:35 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8179E222C1 for ; Tue, 15 Oct 2019 18:16:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=ziepe.ca header.i=@ziepe.ca header.b="KAPCxFZW" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8179E222C1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ziepe.ca Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 0482C8E000E; Tue, 15 Oct 2019 14:16:29 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E9A778E0001; Tue, 15 Oct 2019 14:16:28 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D8C4D8E000E; Tue, 15 Oct 2019 14:16:28 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0217.hostedemail.com [216.40.44.217]) by kanga.kvack.org (Postfix) with ESMTP id B06E88E0001 for ; Tue, 15 Oct 2019 14:16:28 -0400 (EDT) Received: from smtpin25.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with SMTP id 616D168BD for ; Tue, 15 Oct 2019 18:16:28 +0000 (UTC) X-FDA: 76046824056.25.linen35_38725f1c9ef55 X-Spam-Summary: 2,0,0,8ec915a6a2781b5b,d41d8cd98f00b204,jgg@ziepe.ca,:jglisse@redhat.com:rcampbell@nvidia.com:jhubbard@nvidia.com:felix.kuehling@amd.com:linux-rdma@vger.kernel.org::aarcange@redhat.com:dri-devel@lists.freedesktop.org:amd-gfx@lists.freedesktop.org:bskeggs@redhat.com:jgg@mellanox.com,RULES_HIT:41:69:152:355:379:541:800:960:968:973:988:989:1260:1277:1311:1313:1314:1345:1437:1515:1516:1518:1535:1544:1593:1594:1605:1711:1730:1747:1777:1792:1801:2194:2199:2393:2559:2562:2693:2901:3138:3139:3140:3141:3142:3865:3866:3867:3868:3870:3871:3872:3874:4118:4250:4605:5007:6119:6120:6261:6653:7576:7807:7875:7901:7903:8660:9010:10004:11026:11473:11658:11914:12043:12048:12296:12297:12438:12517:12519:12679:12895:13148:13149:13161:13229:13230:13894:13972:14096:14097:14181:14394:14659:14721:21080:21324:21433:21444:21451:21627:21795:21966:30012:30051:30054:30070:30076:30083:30091,0,RBL:209.85.215.196:@ziepe.ca:.lbl8.mailshell.net-62.2.175.100 66.100.201.201,CacheIP:none,Bayesian:0. 5,0.5,0. X-HE-Tag: linen35_38725f1c9ef55 X-Filterd-Recvd-Size: 7735 Received: from mail-pg1-f196.google.com (mail-pg1-f196.google.com [209.85.215.196]) by imf34.hostedemail.com (Postfix) with ESMTP for ; Tue, 15 Oct 2019 18:16:27 +0000 (UTC) Received: by mail-pg1-f196.google.com with SMTP id f14so7509342pgi.9 for ; Tue, 15 Oct 2019 11:16:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ziepe.ca; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=nBrgIx0hifh9NggoSUxRvl2c/6uC1S5tDuowJEqJG40=; b=KAPCxFZWvPNR+o1eJpCr9JMke5tJjHO+Hw9Iby/usIHw8WW8yx8ZHGZo+YLoOM9xhi BrS9FkdxeYYQnmA3kMwjfZehr1ZJDdE2uP/FUGYcefwdm5CvnHDB4tNB5s3Ox06eDb48 Jb/YPdSDDprVsyg72N4vSrObGc8lT0Q71qWUpRYvzaBNQqvJUtIzBrZO8hHCu0c2ClZ/ ulJ9Do/bK44RzjeqrIB+m6ZQMpCg0ooyRecRaZlxz5NMfDyCsIdgT58tSnE8FLm534Li LWw6pyYULmh1oaU6vJDlSidrjUOOoruaKt4rA86DXQZttETufDew2mO/CrMUWdiSjgfY FyfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=nBrgIx0hifh9NggoSUxRvl2c/6uC1S5tDuowJEqJG40=; b=mGxr6ps7z1SKnByRrcGXvtdiABe2UaY2zdJ8REEjoi6/zkJz3TcDRQPDUYKbz/CXPa 3ou81u/nqntjNEKt8BN020nXGW6m0P82AhtKtw5OMiXVRYk22+QBYJ8vVj0Y3nVQjxRK Eej1rGMSiq8L3hFhciyXGorH+FbZWd3cUM3gDzxZl5PkH5yfzp3g3KrSDUSRz4/aakHb 9vMQNW+VDo1bVHLr71f5Xkc473N9dfDlhXqvolISAcLzGDR9r6DtHd421/0iWQI/GdN2 d3nTLGVkGuJhXAQbYew7I+R3MtHRp4JhZqi/5Q58Bm+6lH+ckcgRxgop1RsUORh3ozJU xXEg== X-Gm-Message-State: APjAAAXIcEpYpBIvmJ1bsnMncztHFrsQexlGIeOE+ckmwNJlvIddRASW NqvxIiiIf9iZK8JdWX3wuHpbxw== X-Google-Smtp-Source: APXvYqyjfEo9wCFmNSKLzZPxrK/t8HgqE9dhiH72Gj5GoT9VOYhZwDkgJ97d1yM9RxM4iDCZzQrQLg== X-Received: by 2002:a17:90a:1b49:: with SMTP id q67mr45572591pjq.115.1571163386669; Tue, 15 Oct 2019 11:16:26 -0700 (PDT) Received: from ziepe.ca ([24.114.26.129]) by smtp.gmail.com with ESMTPSA id e10sm29803744pfh.77.2019.10.15.11.16.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 15 Oct 2019 11:16:26 -0700 (PDT) Received: from jgg by jggl.ziepe.ca with local (Exim 4.90_1) (envelope-from ) id 1iKRJT-0002Bh-64; Tue, 15 Oct 2019 15:12:51 -0300 From: Jason Gunthorpe To: Jerome Glisse , Ralph Campbell , John Hubbard , Felix.Kuehling@amd.com Cc: linux-rdma@vger.kernel.org, linux-mm@kvack.org, Andrea Arcangeli , dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, Ben Skeggs , Jason Gunthorpe Subject: [PATCH hmm 00/15] Consolidate the mmu notifier interval_tree and locking Date: Tue, 15 Oct 2019 15:12:27 -0300 Message-Id: <20191015181242.8343-1-jgg@ziepe.ca> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Jason Gunthorpe 8 of the mmu_notifier using drivers (i915_gem, radeon_mn, umem_odp, hfi1, scif_dma, vhost, gntdev, hmm) drivers are using a common pattern where they only use invalidate_range_start/end and immediately check the invalidating range against some driver data structure to tell if the driver is interested. Half of them use an interval_tree, the others are simple linear search lists. Of the ones I checked they largely seem to have various kinds of races, bugs and poor implementation. This is a result of the complexity in how the notifier interacts with get_user_pages(). It is extremely difficult to use it correctly. Consolidate all of this code together into the core mmu_notifier and provide a locking scheme similar to hmm_mirror that allows the user to safely use get_user_pages() and reliably know if the page list still matches the mm. This new arrangment plays nicely with the !blockable mode for OOM. Scanning the interval tree is done such that the intersection test will always succeed, and since there is no invalidate_range_end exposed to drivers the scheme safely allows multiple drivers to be subscribed. Four places are converted as an example of how the new API is used. Four are left for future patches: - i915_gem has complex locking around destruction of a registration, needs more study - hfi1 (2nd user) needs access to the rbtree - scif_dma has a complicated logic flow - vhost's mmu notifiers are already being rewritten This is still being tested, but I figured to send it to start getting help from the xen, amd and hfi drivers which I cannot test here. It would be intended for the hmm tree. Jason Gunthorpe (15): mm/mmu_notifier: define the header pre-processor parts even if disabled mm/mmu_notifier: add an interval tree notifier mm/hmm: allow hmm_range to be used with a mmu_range_notifier or hmm_mirror mm/hmm: define the pre-processor related parts of hmm.h even if disabled RDMA/odp: Use mmu_range_notifier_insert() RDMA/hfi1: Use mmu_range_notifier_inset for user_exp_rcv drm/radeon: use mmu_range_notifier_insert xen/gntdev: Use select for DMA_SHARED_BUFFER xen/gntdev: use mmu_range_notifier_insert nouveau: use mmu_notifier directly for invalidate_range_start nouveau: use mmu_range_notifier instead of hmm_mirror drm/amdgpu: Call find_vma under mmap_sem drm/amdgpu: Use mmu_range_insert instead of hmm_mirror drm/amdgpu: Use mmu_range_notifier instead of hmm_mirror mm/hmm: remove hmm_mirror and related Documentation/vm/hmm.rst | 105 +--- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 + .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 9 +- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 14 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c | 445 ++------------ drivers/gpu/drm/amd/amdgpu/amdgpu_mn.h | 53 -- drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 13 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 111 ++-- drivers/gpu/drm/nouveau/nouveau_svm.c | 229 +++++--- drivers/gpu/drm/radeon/radeon.h | 9 +- drivers/gpu/drm/radeon/radeon_mn.c | 218 ++----- drivers/infiniband/core/device.c | 1 - drivers/infiniband/core/umem_odp.c | 288 +--------- drivers/infiniband/hw/hfi1/file_ops.c | 2 +- drivers/infiniband/hw/hfi1/hfi.h | 2 +- drivers/infiniband/hw/hfi1/user_exp_rcv.c | 144 ++--- drivers/infiniband/hw/hfi1/user_exp_rcv.h | 3 +- drivers/infiniband/hw/mlx5/mlx5_ib.h | 7 +- drivers/infiniband/hw/mlx5/mr.c | 3 +- drivers/infiniband/hw/mlx5/odp.c | 48 +- drivers/xen/Kconfig | 3 +- drivers/xen/gntdev-common.h | 8 +- drivers/xen/gntdev.c | 179 ++---- include/linux/hmm.h | 195 +------ include/linux/mmu_notifier.h | 124 +++- include/rdma/ib_umem_odp.h | 65 +-- include/rdma/ib_verbs.h | 2 - kernel/fork.c | 1 - mm/Kconfig | 2 +- mm/hmm.c | 275 +-------- mm/mmu_notifier.c | 542 +++++++++++++++++- 32 files changed, 1180 insertions(+), 1923 deletions(-)