From patchwork Thu Nov 23 06:44:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kasireddy, Vivek" X-Patchwork-Id: 13465858 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 18AD9C5AD4C for ; Thu, 23 Nov 2023 07:08:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 238806B0643; Thu, 23 Nov 2023 02:08:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 170536B0647; Thu, 23 Nov 2023 02:08:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F06D66B0645; Thu, 23 Nov 2023 02:08:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id E24476B0641 for ; Thu, 23 Nov 2023 02:08:35 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id B585C120E59 for ; Thu, 23 Nov 2023 07:08:35 +0000 (UTC) X-FDA: 81488340990.03.DD1029E Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.20]) by imf26.hostedemail.com (Postfix) with ESMTP id AC1E4140005 for ; Thu, 23 Nov 2023 07:08:33 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="O/+AlHGQ"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf26.hostedemail.com: domain of vivek.kasireddy@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=vivek.kasireddy@intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700723314; a=rsa-sha256; cv=none; b=7p1fZmTXxXkn++DB5TJk6CjaTTyW7A13zafZW0ir7JLXv5lmwPURmV3JRSDfkdmDUh31Yb 1DUPQ0/f6KHXuH0Kx0veLib5tB0G6wn4tQjFco8o9eB8V923xmUr2eYWAbmQt5TaAJhV2J AOaXC1A1h+uuXJzH6pW7jHkN+mgrRPw= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="O/+AlHGQ"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf26.hostedemail.com: domain of vivek.kasireddy@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=vivek.kasireddy@intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700723313; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Dxy1bPaM/KUrNwBBR+vLy6E7L/nCzL4ajpk2sJDKizY=; b=E4mN7r7VffxkM6M8YhKt0Huv8Sb5A7AeHTAxz9GQT5opcx9Zey6kwaoTX2VjUP1NljfPWn KAAfqHa0EoKGQWQflK9qksjVtxQ3Y68KICTncm1vOCN45Kx8bjEUuLSYAzARBLHUjCBToq HmszxYmOXea/7RC6ZarnDuuzi0TsEAY= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700723313; x=1732259313; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=JveC5J73AXuIFwcZCQaP9Gn0jICa/20AkT8Zw92eLmk=; b=O/+AlHGQCjweufMU9FnRSCmc8TyxWYENERbcJ1JnhVZVgSWnafSJsZdw nGNu7h6si1TlPzhrLPpZ4FRvvQ1Ub0+OMKTwjGBILSWlFsSKCWqH6V1ig 1B69oO6UbpCBbv3ub3dfOZle//LMPk4q6NfjLiICWJ161h79b3wg4pDR6 uaZJ0Mf7UxGDFEERe6E/oGphKll1DIkw2x/gE/kQ8Y3kVoGuTvvGNi4nz OrOkV8pdmrEl1yZiu1gFmtWzqK/kaOc0iEXjzaPCqJKxOoj/nB4seIBuY NCVS8+QCi0fHuD6TG3DObrYeJQQApB2Y03qRDrA65k2sqNmLOIaSrn0Z+ w==; X-IronPort-AV: E=McAfee;i="6600,9927,10902"; a="382612336" X-IronPort-AV: E=Sophos;i="6.04,220,1695711600"; d="scan'208";a="382612336" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Nov 2023 23:08:24 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.04,220,1695711600"; d="scan'208";a="8757723" Received: from vkasired-desk2.fm.intel.com ([10.105.128.132]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Nov 2023 23:08:24 -0800 From: Vivek Kasireddy To: dri-devel@lists.freedesktop.org, linux-mm@kvack.org Cc: Vivek Kasireddy , David Hildenbrand , Daniel Vetter , Mike Kravetz , Hugh Dickins , Peter Xu , Jason Gunthorpe , Gerd Hoffmann , Dongwon Kim , Junxiao Chang Subject: [PATCH v5 4/5] udmabuf: Pin the pages using pin_user_pages_fd() API (v3) Date: Wed, 22 Nov 2023 22:44:42 -0800 Message-Id: <20231123064443.1035709-5-vivek.kasireddy@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231123064443.1035709-1-vivek.kasireddy@intel.com> References: <20231123064443.1035709-1-vivek.kasireddy@intel.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: AC1E4140005 X-Stat-Signature: 5qzb3pfm6a3nrwa84kege1c5mdj5dfji X-HE-Tag: 1700723313-329514 X-HE-Meta: U2FsdGVkX18P9gLoBioUzNQ308+imtWCTZiSqBA7ZCvChe7cxo2jWQm+e9jN+S6KJATlQaqD2jZshsMOTLvFH1S7HRWZLJxqQxprHqDj67MA+kUemYOZHbE6QsnTS2mtry1v0pjrl03E8EKWKITj/P+R55J+hdgkjhllZcVNUrjFr9+HFicnZOr1/ie1FLEW1+srImGERq/WqqIk8XdRVO8dQM2+/mG1ronj4XWKEeircI9dh8tlqDO/dghLYkg61oSLnxOy0bIVPKqOYEh6VTMxUDJLpgZmYVGzulY71gCNflB9gCkmtfMi9WYALseKyyYAysjoGFW38LRCv+hzflJFOyZlWgLVwB+3nfFSfPjTz7Ult7kdI9idBv9uhWlrvbmPtGvh/Zx6H2fYRkUIys7i3U0gt7yJufvKaloood5AllL6pALi/io3rQy0qLYrBS7OoJgMulV6u9ARwnsnk1hgYs+Ve5NFyQPx3qOIM3zx/58mzLC8bCbZsSggypAbOwgVX0l2ElQT3cGma1/SSgyd95VaiiZXokZX4eQFwjPZ2rQz5BO9GfdtBds03d364CkWxcskr1eQ38C1S5P5HsjWqVqNkJfz6Pp4pBmXM/kVqbqVAK72EpfUI308kwtJ14yaq2Wp2o76Y7FqyZpHEs9LHKZ/bPZ2KdtdccT3Q+vaLJtC81OHDWdY3eL19JICOtKaVkV6XXoLl+RZ8+JXFHSEoclJjDmtKeVfqUHOuHBZygHYp8ta1iYucU4ZEkMrP3pt5N/RVrQN/WnlELKRq0IED0fBYzkibsQq0Z4GSZiIk5RVbhqJXXUT7ruBv2ckdzvPgIfxB/wkM7CPjgEpUvnK+MEeDE9ixY43j4VJ5ByJkFboCmRDED9szPKdsCVPcf84sANWidFIFAjVgZChPwNeS1/PjkSgDMjeu5xOs8IpTz8ja7dp4OFda7+Sb/yA+Tg288ngfGA0Fy7GqGT z5PxK1T9 oQUx/EDuXvmajea8JPGxvjlqAcpWIVL9dW8YSfCwHsExAvlgCH0qswtbOoGH36TcNFlK0SK6Gjor+IfaqqccZkpz5oam/cQ/7e8NyL1N06A4AM4FKSDy0aiSKZ1O6w2g9+QmS2jJ8wl0FA9P9gPrSM1Y642f/7GwQBxQT4J8kHmp8ES/o7oiJYWdC3h1YfHKsAG1OasvtyQDTBGZGRXgWfMZa2Dij6Cd1L+gYAu9320hNl16AiL77x32CxBrlvRLfM9aBhHTqTMk+jNqkZSJIKlOYmSYyH4CMPEnKhxEWCXKyB8o= 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: List-Subscribe: List-Unsubscribe: Using pin_user_pages_fd() will ensure that the pages are pinned correctly using FOLL_PIN. And, this also ensures that we don't accidentally break features such as memory hotunplug as it would not allow pinning pages in the movable zone. Using this new API also simplifies the code as we no longer have to deal with extracting individual pages from their mappings. As a result, we can drop some of the local variables such as page, hpage, mapping, etc. v2: - Adjust to the change in signature of pin_user_pages_fd() by passing in file * instead of fd. v3: - Limit the changes in this patch only to those that are required for using pin_user_pages_fd() - Slightly improve the commit message Cc: David Hildenbrand Cc: Daniel Vetter Cc: Mike Kravetz Cc: Hugh Dickins Cc: Peter Xu Cc: Jason Gunthorpe Cc: Gerd Hoffmann Cc: Dongwon Kim Cc: Junxiao Chang Signed-off-by: Vivek Kasireddy --- drivers/dma-buf/udmabuf.c | 61 ++++++++++++++------------------------- 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index d77d119f4048..883bd97e4076 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -156,7 +156,8 @@ static void release_udmabuf(struct dma_buf *buf) put_sg_table(dev, ubuf->sg, DMA_BIDIRECTIONAL); for (pg = 0; pg < ubuf->pagecount; pg++) - put_page(ubuf->pages[pg]); + unpin_user_page(ubuf->pages[pg]); + kfree(ubuf->subpgoff); kfree(ubuf->pages); kfree(ubuf); @@ -217,15 +218,13 @@ static long udmabuf_create(struct miscdevice *device, { DEFINE_DMA_BUF_EXPORT_INFO(exp_info); struct file *memfd = NULL; - struct address_space *mapping = NULL; struct udmabuf *ubuf; struct dma_buf *buf; - pgoff_t pgoff, pgcnt, pgidx, pgbuf = 0, pglimit; - struct page *page, *hpage = NULL; - struct folio *folio; + pgoff_t pgcnt, pgbuf = 0, pglimit, nr_pages; pgoff_t mapidx, chunkoff, maxchunks; struct hstate *hpstate; - int seals, ret = -EINVAL; + long ret = -EINVAL; + int seals; u32 i, flags; ubuf = kzalloc(sizeof(*ubuf), GFP_KERNEL); @@ -259,8 +258,7 @@ static long udmabuf_create(struct miscdevice *device, memfd = fget(list[i].memfd); if (!memfd) goto err; - mapping = memfd->f_mapping; - if (!shmem_mapping(mapping) && !is_file_hugepages(memfd)) + if (!shmem_file(memfd) && !is_file_hugepages(memfd)) goto err; seals = memfd_fcntl(memfd, F_GET_SEALS, 0); if (seals == -EINVAL) @@ -269,7 +267,7 @@ static long udmabuf_create(struct miscdevice *device, if ((seals & SEALS_WANTED) != SEALS_WANTED || (seals & SEALS_DENIED) != 0) goto err; - pgoff = list[i].offset >> PAGE_SHIFT; + mapidx = list[i].offset >> PAGE_SHIFT; pgcnt = list[i].size >> PAGE_SHIFT; if (is_file_hugepages(memfd)) { if (!ubuf->subpgoff) { @@ -287,42 +285,26 @@ static long udmabuf_create(struct miscdevice *device, ~huge_page_mask(hpstate)) >> PAGE_SHIFT; maxchunks = huge_page_size(hpstate) >> PAGE_SHIFT; } - for (pgidx = 0; pgidx < pgcnt; pgidx++) { + + do { + nr_pages = shmem_file(memfd) ? pgcnt : 1; + ret = pin_user_pages_fd(memfd, mapidx, nr_pages, + ubuf->pages + pgbuf); + if (ret < 0) + goto err; + if (is_file_hugepages(memfd)) { - if (!hpage) { - folio = __filemap_get_folio(mapping, mapidx, - FGP_ACCESSED, 0); - hpage = IS_ERR(folio) ? NULL: &folio->page; - if (!hpage) { - ret = -EINVAL; - goto err; - } - } - get_page(hpage); - ubuf->pages[pgbuf] = hpage; - ubuf->subpgoff[pgbuf++] = chunkoff << PAGE_SHIFT; + ubuf->subpgoff[pgbuf] = chunkoff << PAGE_SHIFT; if (++chunkoff == maxchunks) { - put_page(hpage); - hpage = NULL; chunkoff = 0; mapidx++; } - } else { - mapidx = pgoff + pgidx; - page = shmem_read_mapping_page(mapping, mapidx); - if (IS_ERR(page)) { - ret = PTR_ERR(page); - goto err; - } - ubuf->pages[pgbuf++] = page; } - } + pgbuf += nr_pages; + pgcnt -= nr_pages; + } while (pgcnt > 0); fput(memfd); memfd = NULL; - if (hpage) { - put_page(hpage); - hpage = NULL; - } } exp_info.ops = &udmabuf_ops; @@ -343,8 +325,9 @@ static long udmabuf_create(struct miscdevice *device, return dma_buf_fd(buf, flags); err: - while (pgbuf > 0) - put_page(ubuf->pages[--pgbuf]); + while (pgbuf-- > 0) + if (ubuf->pages[pgbuf]) + unpin_user_page(ubuf->pages[pgbuf]); if (memfd) fput(memfd); kfree(ubuf->subpgoff);