From patchwork Sun May 14 21:26:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 13240571 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 86B12C7EE22 for ; Sun, 14 May 2023 21:26:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D0FE0900003; Sun, 14 May 2023 17:26:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CBFEC900002; Sun, 14 May 2023 17:26:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B8778900003; Sun, 14 May 2023 17:26:45 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A8A87900002 for ; Sun, 14 May 2023 17:26:45 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 77059A1262 for ; Sun, 14 May 2023 21:26:45 +0000 (UTC) X-FDA: 80790145170.20.2CF7385 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) by imf27.hostedemail.com (Postfix) with ESMTP id 8A9B540002 for ; Sun, 14 May 2023 21:26:43 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=LgXMgy8w; spf=pass (imf27.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.41 as permitted sender) smtp.mailfrom=lstoakes@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684099603; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=+xI8BtlVvvSS6bzTpldJXGD+NpgtGXiB7zWUwN8KDHQ=; b=vob4gYESfyV4VMSOTnPIqSNA6MtjXUglJNw04NHx5RmLspQAUoz8z/CVfYKAZJ8BkiPhfW 9yZrDrH+RGewwyyIV8brGYrpOxipKgy9b45tsxu6GeZdtLE7rNWlkt9iim3cGzSGaghPej AbX0VdgZnH3kvLceVQg0gmXOnJQCcn0= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=LgXMgy8w; spf=pass (imf27.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.41 as permitted sender) smtp.mailfrom=lstoakes@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684099603; a=rsa-sha256; cv=none; b=nmCuQ0aWcvXAhaIZ0l14N/h1bDtaM9IIx2d4ZY71wThZycscybnHtjDYTm7Jbc58zTlbwl NDyrAc1WhB4S74a7WFedZPRZFIaX79u4A16/cXVlyWgXpWWgahiO6sXUuLX0yQQAtXXMRe Qu+4Ksyk0cIgZOhGHO/RVu+cqOEU4xs= Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-306dbad5182so7835909f8f.1 for ; Sun, 14 May 2023 14:26:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684099601; x=1686691601; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=+xI8BtlVvvSS6bzTpldJXGD+NpgtGXiB7zWUwN8KDHQ=; b=LgXMgy8wBVUXmrNnUxzO7BBuNMgVdurWq4HLrivFayR7tPolKEJ4dkEQAwF47vo241 CtKAUg86vamPAhGSRDmSO3kbs/QlOjjMfP3tMdHM2mqXnwg6y0Ys13vB0Dm/L7FVXmED Bcsioy6QrkdcRx1U7cCoUWkxJp8QGQlqGdAClsYs15hHNRGes1wLcoqRF1ZJ+vhX1ydV IqS4wGsYSAGO2NxmohDbFyELRqaaW6XfTV9RESA2Y0seDcU2t+z3XObXV84yzBrsS7iJ tg9v+2j3H6o58yYkG22LC2gPRdlNfsthY3HF/4MtOnUDgzBX+gumO2goxuXoBGfF2Vph GxEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684099601; x=1686691601; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+xI8BtlVvvSS6bzTpldJXGD+NpgtGXiB7zWUwN8KDHQ=; b=SpjlwNKcaqo+Ya+OfYITVf8JV2wn1GGizZgeTdgi6QRerQ2GCxJU1LuiIJZSyBBdGQ 6HDHNv1y12ZuBtDl7sO4WOeXN3vLl4hFzwsORsL+evFXU15+lTf3jQc5gRrNgxGisjqt rd9bmAb0cYiknZKgKsy/Pj+miE1rkoX9iMoGq7zeQqcdmPAxn5o4rlwuPdiIyYRAv4A7 Kg76Ki/TlzNIg7SdphxfSYB/dJryA4N2Ndg+23UGrWycK8IuHP7SJ8AbGE1HWLxlEa9H tsVDqQO5/B0QPFW+G0l1+hLq4z5qIjKi8pc3LTCAXunB3sP3V34loJiYswJFvlCqO02L G1Ww== X-Gm-Message-State: AC+VfDw9+Yuo/zXN3vnIwNjP32opUFrU78NZv1KB0e8KzgLSihNokItF dtHJXQlBMofr4mlfcWzgxGCv59jAc3v3Yw== X-Google-Smtp-Source: ACHHUZ52CH5q90BjBUE5Abhh6pfOnSlQBaf/6KkgZOD5Mc4aPvKyzCLJOHPxW1EZBW2PbACRUKojTg== X-Received: by 2002:adf:f00a:0:b0:306:3286:69a2 with SMTP id j10-20020adff00a000000b00306328669a2mr21663335wro.48.1684099601286; Sun, 14 May 2023 14:26:41 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id a24-20020a5d4578000000b003063938bf7bsm30543711wrc.86.2023.05.14.14.26.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 May 2023 14:26:40 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton Cc: Matthew Wilcox , David Hildenbrand , Jens Axboe , Pavel Begunkov , Jason Gunthorpe , John Hubbard , Lorenzo Stoakes Subject: [PATCH v5 0/6] remove the vmas parameter from GUP APIs Date: Sun, 14 May 2023 22:26:35 +0100 Message-Id: X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 X-Stat-Signature: harbmhgjgtdw3pqrwknkdtrjr3s7syq8 X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 8A9B540002 X-Rspam-User: X-HE-Tag: 1684099603-404807 X-HE-Meta: U2FsdGVkX1/ZimJqrWtIV2rUH3mEx6YHWJ3KfqQ80JgKiB+Vdt3lXqAjym3trr8sQefVgele+B3o5jgPDbOsZflNYdaBMZZQ8JoX8JzR22hK+SrNIp369N9n6BG+ZOS8PRFLrsTUNjNU7YIZm7URnYMY6J44eAcVoHUu9tGFQFZD8XkE9fAvwAXKmi7hyncg+TWuQlCTfgrlBpGHeujGRUBoVolqlVBKw6GsIKV1RP8PL7KspYGjW9a2+svNmx/YvuXTzE8XONP3PGVSuN25sjK08TEpdXmY1fHE9pLqQodprY5tMv5ZWWnB8NlRe/yfVIfyZtErvBMJ8EKMMXkIc4ZGpTZ5RhOnbYCNYiXsPp5ItB+0HcaWa2TfT3Fjnp1d1Ff14lcMuY+jj5Kaijv4xjPjJ/BMe99XDQUsLKdSG3Q1mFhOkRLuiCgf54XK+9vmqrYOzV5mSbPV/jf0NF/br4uYz1DFjtR2KRBw3CskndVUhF06Fe8R143PrvsGMNygUBxklqcYhmseSORWyVxqQKqmHaFn7whquujL1LKnlbONxBZdtjAuGL6YW9DxzDA9ma78kext5v74LJFYz25z07RBrBwZvvfB6owsmwWDRCDM6GEFrodmR+hzesQr7oTm4S1V4L/69jYLE2XmH2k74tPyqSae2zOFFBAtFdBLWmMu/PT7zi5C7PHdZuJCrDD1o9qz7ZjOzvs/OcfJ8nItUhB2GsyRxcTZp7rrdEjABZTT9zYdQ8K3S9ATFQNFCw4+PFHi3nrUg6mJj584UqKC1kIOz01Slxm3BDrH1Voum8/j0EX9wTYA6lg4KjNwupc5RI7+BJo8bNMmy/N6Ijtyqh3QKyBN8TRvpf2OfFYcZ2oAJWa9tyK0CiZYDCbZwl6738qwg+fbfxeMR7PCs6zJq0dw7dzpmgu9A0wu8fqTm1gbCHhpbpl7MyB8lb0QzS45TeHXdHTLJIImwYp3lcj sSlw3pyj 290sdPpcsTV4PBfk6xg/qvh1iWQ49SL1RtO0xS2JeVIEyHdHFYQC+T3NrMWA7jY7PsSFJ15zZ6JxwpiFWdzZH6YSVE9Ow7X/mlF6GCpIofurQ1ua9G5KO274xW+PDt3/B7KVYUkjFU8k864xyFR+SgxiB6JOu2pF2J52XGwf7IGY9SAxMDnL+/tGl28bhI88ub5i3p35FMTIXrmUP14fsEHkGsYeQmm03gyy3pYU/w9qoC3xsfZMT2xJh8spireTwp/3H0TL9+LzJ3QEK4dREHgd9ZJ4qATDvgio4/fej/iefTC1oYybZb4i2ru/2f5TzyJmWP7iWSZP3GzhjuPBBslbc3ne5O3Yvv80MTilMnHCrnnte2iLU105EIZN4QJCeoiTRWNYWA8pA142L7D3oNBK+7FPO24eN9gksvhVKcPhK2c1KuuFhOygkPSzCDpochBwrbtbb+VtTBlwWnKOAyJL79iFYSQTod5hM1UnUeUa3TeeU61JMOy1aDSl8p1WDDHAXwlp5bf0LORpjvJcojynyDw== 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: (pin_/get)_user_pages[_remote]() each provide an optional output parameter for an array of VMA objects associated with each page in the input range. These provide the means for VMAs to be returned, as long as mm->mmap_lock is never released during the GUP operation (i.e. the internal flag FOLL_UNLOCKABLE is not specified). In addition, these VMAs can only be accessed with the mmap_lock held and become invalidated the moment it is released. The vast majority of invocations do not use this functionality and of those that do, all but one case retrieve a single VMA to perform checks upon. It is not egregious in the single VMA cases to simply replace the operation with a vma_lookup(). In these cases we duplicate the (fast) lookup on a slow path already under the mmap_lock, abstracted to a new get_user_page_vma_remote() inline helper function which also performs error checking and reference count maintenance. The special case is io_uring, where io_pin_pages() specifically needs to assert that the VMAs underlying the range do not result in broken long-term GUP file-backed mappings. As GUP now internally asserts that FOLL_LONGTERM mappings are not file-backed in a broken fashion (i.e. requiring dirty tracking) - as implemented in "mm/gup: disallow FOLL_LONGTERM GUP-nonfast writing to file-backed mappings" - this logic is no longer required and so we can simply remove it altogether from io_uring. Eliminating the vmas parameter eliminates an entire class of danging pointer errors that might have occured should the lock have been incorrectly released. In addition, the API is simplified and now clearly expresses what it is intended for - applying the specified GUP flags and (if pinning) returning pinned pages. This change additionally opens the door to further potential improvements in GUP and the possible marrying of disparate code paths. I have run this series against gup_test with no issues. This patch series is rebased on mm-unstable as of 12th May. Thanks to Matthew Wilcox for suggesting this refactoring! v5: - Remove the io_uring open-coded VMA file-backed check, as this is now explicitly disallowed by GUP. - Updated the subsequent patch to eliminate the vmas parameter accordingly. v4: - Drop FOLL_SAME_FILE as the complexity costs exceed the benefit of having it for a single case. - Update io_pin_pages() to perform VMA lookup directly. - Add get_user_page_vma_remote() to perform the single page/VMA lookup with error checks performed correctly. https://lore.kernel.org/linux-mm/cover.1681831798.git.lstoakes@gmail.com/ v3: - Always explicitly handle !vma cases, feeding back an error to the user if appropriate, indicating the operation did not completely succeed if not and always with a warning since these conditions should be impossible. https://lore.kernel.org/linux-mm/cover.1681558407.git.lstoakes@gmail.com/ v2: - Only lookup the VMA if the pin succeeded (other than __access_remote_vm() which has different semantics) - Be pedantically careful about ensuring that under no circumstances can we fail to unpin a page https://lore.kernel.org/linux-mm/cover.1681547405.git.lstoakes@gmail.com/ v1: https://lore.kernel.org/linux-mm/cover.1681508038.git.lstoakes@gmail.com/ Lorenzo Stoakes (6): mm/gup: remove unused vmas parameter from get_user_pages() mm/gup: remove unused vmas parameter from pin_user_pages_remote() mm/gup: remove vmas parameter from get_user_pages_remote() io_uring: rsrc: delegate VMA file-backed check to GUP mm/gup: remove vmas parameter from pin_user_pages() mm/gup: remove vmas array from internal GUP functions arch/arm64/kernel/mte.c | 17 ++-- arch/powerpc/mm/book3s64/iommu_api.c | 2 +- arch/s390/kvm/interrupt.c | 2 +- arch/x86/kernel/cpu/sgx/ioctl.c | 2 +- drivers/gpu/drm/radeon/radeon_ttm.c | 2 +- drivers/infiniband/hw/qib/qib_user_pages.c | 2 +- drivers/infiniband/hw/usnic/usnic_uiom.c | 2 +- drivers/infiniband/sw/siw/siw_mem.c | 2 +- drivers/iommu/iommufd/pages.c | 4 +- drivers/media/v4l2-core/videobuf-dma-sg.c | 2 +- drivers/misc/sgi-gru/grufault.c | 2 +- drivers/vdpa/vdpa_user/vduse_dev.c | 2 +- drivers/vfio/vfio_iommu_type1.c | 2 +- drivers/vhost/vdpa.c | 2 +- fs/exec.c | 2 +- include/linux/hugetlb.h | 10 +- include/linux/mm.h | 42 +++++++-- io_uring/rsrc.c | 34 ++----- kernel/events/uprobes.c | 13 +-- mm/gup.c | 105 +++++++-------------- mm/gup_test.c | 14 ++- mm/hugetlb.c | 24 ++--- mm/memory.c | 14 +-- mm/process_vm_access.c | 2 +- mm/rmap.c | 2 +- net/xdp/xdp_umem.c | 2 +- security/tomoyo/domain.c | 2 +- virt/kvm/async_pf.c | 3 +- virt/kvm/kvm_main.c | 2 +- 29 files changed, 138 insertions(+), 178 deletions(-) --- 2.40.1