From mboxrd@z Thu Jan 1 00:00:00 1970 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 BAF0EC54E76 for ; Sat, 18 Nov 2023 06:56:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DE4006B053D; Sat, 18 Nov 2023 01:56:15 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D953E6B053E; Sat, 18 Nov 2023 01:56:15 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C34706B0540; Sat, 18 Nov 2023 01:56:15 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id ACA356B053D for ; Sat, 18 Nov 2023 01:56:15 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 73C16C0E84 for ; Sat, 18 Nov 2023 06:56:15 +0000 (UTC) X-FDA: 81470165910.15.4DA6889 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.100]) by imf25.hostedemail.com (Postfix) with ESMTP id 6D8B2A0011 for ; Sat, 18 Nov 2023 06:56:12 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=T3gG15QG; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf25.hostedemail.com: domain of vivek.kasireddy@intel.com designates 134.134.136.100 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=1700290572; 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=ZW/8DcyIeh+0dLw6Bn8PpTwNfeCkDsY2FY8vV5XnrXw=; b=HmDEajHMay+/YEgAlH3orQDg15SB6f2C0Ra7Rv0NXz56mKLmfQw9n3zLzigDZPzhdLIwNo iRsrylqFAsp7UD35+SBVlGm2KoofoNybP8w2BE9vkpGs4SGKkWcZJnu3hQwiEb3300oJJI VF6zcK5jWfZpkbyx9iTNeFW5Qqima2A= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=T3gG15QG; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf25.hostedemail.com: domain of vivek.kasireddy@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=vivek.kasireddy@intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700290572; a=rsa-sha256; cv=none; b=5GQ3MhBNbMIeaFAev0xZ6ubdz/NYYFjGghAMUj7cD3in1nk6LjdjJfbX9wgVHsV694jgse 6wHviouyKGUhPZfhMMdGEUBssd0j0wsB4V5CLti9DI7b4gFQCRgouAQqu8ODtB0ky2uALT YlR70ZPf+BkH2xn6m+8V1+7ClHolm7Q= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700290572; x=1731826572; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Ue+VeqRqoLXQmcxX5yfx2PkL0r79LSA81sdXut6SbQU=; b=T3gG15QGTvLtW40FCcnoEkzNoOKRfLxLm0cQVqNVwl+uCIkijfYAi8ll q4cNFeXhE3s1whhJZsTIDEamkT4Cp7dyEXxogOSEhDrfekPdONvxPZjFg oN4Rzzdy94++k55/eP4nM9FWFJARrM63QYcnnxDPVG5xs1ChJKnxpM+2g qETzpwOCoYcAOZFWGSPx/KoYVlP5TTaAkxFHhIZl9dBKaIMxe5sVMnSCO C8qcSbNf/af+IFsXDZtcq1ttsybb9VOevARGfDEnbwvuQtXJjHNtiJrva QTeTnZJ58QbB52th3KvIMAk9lk1/Bhc6TC4SXlStFq6iafEITDEFppAfN A==; X-IronPort-AV: E=McAfee;i="6600,9927,10897"; a="457912377" X-IronPort-AV: E=Sophos;i="6.04,207,1695711600"; d="scan'208";a="457912377" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 22:56:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10897"; a="800686584" X-IronPort-AV: E=Sophos;i="6.04,207,1695711600"; d="scan'208";a="800686584" Received: from vkasired-desk2.fm.intel.com ([10.105.128.132]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 22:56:08 -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 v4 4/5] udmabuf: Pin the pages using pin_user_pages_fd() API (v3) Date: Fri, 17 Nov 2023 22:32:32 -0800 Message-Id: <20231118063233.733523-5-vivek.kasireddy@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231118063233.733523-1-vivek.kasireddy@intel.com> References: <20231118063233.733523-1-vivek.kasireddy@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 6D8B2A0011 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: oxk9w4kjhoiyckzbcien8diqpa6xqhp9 X-HE-Tag: 1700290572-704204 X-HE-Meta: U2FsdGVkX1/zRp9TNnYyKFlI/VoXUlB1yAzscMUkyS1WtQGS3sQ7g1eqP6wwMilEt/Up7bg/ghDcHRmXwC0O9gQV7VUk0DbRw8HvX2+PNpTLm4UIuVO697eXXakg2DfJOBT5a3a2GkU9OkL2SVZtebDe6RvFcFFvwy4iS31KgE5A/20s2+jrlSkRwGZABGmsSf+WKAiIotu4DJU8SBmTq19yf0asMGBmUGwcbrApRbzFbpeae3+lXqvinEdsonYwNHeJlBzdMRKIgZ3hsGyRqKtVYG//EaQVZf2KGv7w3FgUDiZZmfJuQTKzEe8/m6ZHGvHFBYWpqx/oHaC9ogjrc8r1kTfbqf+7DUcWUQBWQOTDGGLo3FnJvvEOwzS82x6DZnYmFB72YQRlpRNy/17WFBDbrVkhgbF62LOVzPZ2r+1T4P5i7pnjr+vc9GjNG84gMCpYjb7dsTQPPI55Ghb+HO63qgonoeTLdYfoC8fmA59f7/TxJrpuNA7WZR8EHooGz9wjXtj24tZJwUIuYVVF74F7H1i4khKtYsgFiCSDifHXQGJ2L0Q8D9C/WGfqxm3t5eHvqif5X/leTDNW9WWSVM9JZ+borc8Rdczo9aEBKb9x0KBzmsmdrpez8Tr+bP4p28KtQEuiDochn/h/qvQ0RVJCpAyjHVZHqoGk77QSn7l0vxPKMorQ5g+kkjfx6D0HmwWAyAKist7fpBYsWaaVMp8FdOwZAlvtxy3INCPp6RTrIivd+B6ytXG7BAX4g9CctNKItCH7bM4vipru1TwDdDS5x09y2xP3Ngg5L/HUd7tKGipV4byI6MpbQo8J5wnpqJJeOTSlwTooE+zHFyt6SqQ+5DGWdpPLQoEWvRXF/drWwK6OMMclhSk3R6Fw74FEj9swPh5HUx45zLX/IGn6O5E8M2oqoS/QBS435UOOfCl3pKIcCgdS1pDVQlQfcbzrUuIoV0yQSNYImCQCKrT VyleQgl1 PLhM5824aCLMpuOdqwbGSj8eIbdFd2k4U8Eg2oAv1qcVpQf11mFBy5PfE2dkiPZIBJJ16JybmP8U3npoU6aWjxSFcrkek9JezORo8qkKLwD9jbEcROQLR7Q94QIEA3FaHbo2c5cwBp/wQ9gzEdQoBRcMXcLQ7jzG5fuj7R5IuiPYz+uSzc4CNjaYY3pAFDjKgqGk36J3h1cXIytY76JBQX1Xf7G5vCMtXc8WRcnB2ebxaFH2CEMkgjX8508mh/GyV4PmSQOlfVv8PPuh6GvIcxG5YI4S/eaTtbA6Y6NZJBhGlAs0= 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 | 59 +++++++++++++++------------------------ 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index 1a41c4a069ea..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,14 +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; + 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); @@ -258,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) @@ -268,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) { @@ -286,41 +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) { - hpage = find_get_page_flags(mapping, mapidx, - FGP_ACCESSED); - 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; @@ -341,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); -- 2.39.2