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 4272AC3ABDD for ; Wed, 14 May 2025 17:06:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CDB2A6B019F; Wed, 14 May 2025 13:06:14 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C126B6B01A1; Wed, 14 May 2025 13:06:14 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id ADC826B01A2; Wed, 14 May 2025 13:06:14 -0400 (EDT) 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 8A77B6B019F for ; Wed, 14 May 2025 13:06:14 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 1A1E0140F5C for ; Wed, 14 May 2025 17:06:16 +0000 (UTC) X-FDA: 83442141552.17.473B280 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf21.hostedemail.com (Postfix) with ESMTP id 75AF41C000B for ; Wed, 14 May 2025 17:06:14 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=ktTN6aWL; spf=none (imf21.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747242374; 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=QIP/rHjINrJ5Ni5+lZKt00BgN3DmtdYKNBZJi9LlujY=; b=4sUhjp98y2fy+SgIIG149WssueRyUnSBA0206opEuH6i/fpB8BAPxXX4tPEJhVib4ika2B 7Q/e+knQN9F6uSynWMRapXVZjrib+gtT2jnAf50Qx+Pexjleg5lzlsHrQRjjyH0wKVYiIO uy6TIf3O+S82T9NSlASPbvjYfRvGkqk= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=ktTN6aWL; spf=none (imf21.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747242374; a=rsa-sha256; cv=none; b=T9ihXaJ4vg4BNPnn9slHzA//u+NrJC9mNLcPyJ3xfMgzzhsAvFkYljqFinOc0XfwM0notb vz9SdKlbByXO8fvkedIkcQazdKgxeMJN5B+lhhrn27uJWPToXFsGfs68yyuoHO6IZjvOb4 DcUNL2MOzSt5CqnfXv9K+NNvUvYB6/Y= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=QIP/rHjINrJ5Ni5+lZKt00BgN3DmtdYKNBZJi9LlujY=; b=ktTN6aWLboPg8RRtuHowj055yI 5BNKpu9DCOyR8lO09SYykWdCBjOVaqrswNmwV7cOEWdE3WYs0NKxZIM8+uJjUQGpjJxsv1iSQmy+N hszPebTIiTLmgBnCEKky4kdGru6r0oJpRWzTqxvuidvX7mwsLNAVGlfhHl1XD2vtYQqB7uH2EzRNP xfCjh+zUZSq6KulNQIz6r/YhLYMoTXsMqfQFy2+oKTsPtZ7xt50anXkQKNAMeGZ0/+DSIKUFi7Z/K wpWce5OnORGq9dv3WpB/fYZXnHLSyzX0YNAYCjEKC/rZNXag7JhVB47Yqe/rgtRj5xEkd+htoTlw5 2TWtn39Q==; Received: from willy by casper.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1uFFYW-0000000CahV-3QRd; Wed, 14 May 2025 17:06:08 +0000 From: "Matthew Wilcox (Oracle)" To: Andrew Morton Cc: "Matthew Wilcox (Oracle)" , ntfs3@lists.linux.dev, linux-mm@kvack.org, Alexander Viro , linux-fsdevel@vger.kernel.org, Hugh Dickins Subject: [PATCH 3/3] iov: Remove copy_page_from_iter_atomic() Date: Wed, 14 May 2025 18:06:04 +0100 Message-ID: <20250514170607.3000994-4-willy@infradead.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250514170607.3000994-1-willy@infradead.org> References: <20250514170607.3000994-1-willy@infradead.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 75AF41C000B X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: nocxfnmpodoe7487x1wqeb3hcghsi5kj X-HE-Tag: 1747242374-366310 X-HE-Meta: U2FsdGVkX18PreSNfrw+S317R7zbYzK8XCmo+VQs45wv1YltUL2fgZGLu7mALHH4YJ1AyXuLtKQyicpFcOa5EgJza6p9ace59E2KmvcusExzcvrhG9f9dxWPypToREhXQyvVIwvDK6o0PgNoX8AJSS/PG7bx4Tv7R6WN+rvdY3V3LZWBgriF7RByw0tFhU41ufeQKUjUdmH1WP2qbRyyXuI8ExzwCw8lDRA6G8RZbgENP5ydNuUEBl7HMi2aGD/6SfC6TYF/ZJHTKmIeZ5aHJFW2cIry8vatbFZlSCUkO0mWi8qPyNo7KxrYTBxsqrFVA1s9wPtH01oq48iQtCQgIp78AtoM3UHNHSA0mENQ+4eauTLRDrT6cttmzJZe2XvHSeQOw9/OshA6hqBmuyjUxaNpBCNvPwRSu8H0SJTMC8sHNBP5BiyYd2q6Kqlq18GRJRctcqWa/EUgUNJR1hNmQIezpkaa8H8vBxwup1xkOVT5nlcD59djLv1n+7OjMJibb4I2nhrcLRqoJu41JGyI116bf0g3SLsxmjuHcjvD5lJNEgPvSw3IbnqC/UZQ2IuVFsPrYC//wnh9AZ7Vtu1lKAYQUEvJJVQyhN6eNWlJjcaGRuP5X2bv9YODN89k/T3es0yqnP0Zid4TZarl5jmZTunQjs0sxDu+mWWlzuxu7xorkpruwingl7pm2/iMtgNxg48LNi8S2rKEVR6HkjlbNiQEkwHt90c5zlTbslkT/6utBylZGBEOtpHomXzGnDmCsoj3Iw4q5SBdefHx+AfiudoTZRd5pDvpUfHlh0wwlutyXxvr24pfpBdZx1YTnRoQ0t042uVWzoFx5FrRmIeUPpQlPSRtQguamBAuLlCWMdDsNrRt6rUe1wMPKdFa/9LBojbl3Q4YitmCz4Gaj8PCmBPQzJkfFQ16BywS2BOcrphAZKh53RftDNO4WDOYlBNDNKs2gqSqIx9AMydU2V6 AC53WtJR HlkY5gSMoJwe//fWZBLw3OROrlQGKwBeRdtqOLhAUp0J2uWk/0ushA41vsMVNbMWyIS62bnRvyWcNxEnwbfnRhVF5F0d/yR+JORVrE8frc8vLrclYjrGMc+z5tbEWHwjS1pRuKaiK7svu8V4Imqorm4N78bppiB/8lSl8SnKQ1YNCzPWBQ1qL9cvJCQJDnD3vy7AZZq2tpECw1ylwWY925mpnkQ9McbM/lef9TYHxX928TH6uEKZSxTZZZ5Ra0X60ElMPaWCvhqwewZx6qvgwEf0PSSB0kXnujHQq 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: All callers now use copy_folio_from_iter_atomic(), so convert copy_page_from_iter_atomic(). While I'm in there, use kmap_local_folio() and pagefault_disable() instead of kmap_atomic(). That allows preemption and/or task migration to happen during the copy_from_user(). Also use the new folio_test_partial_kmap() predicate instead of open-coding it. Signed-off-by: Matthew Wilcox (Oracle) --- include/linux/uio.h | 10 ++-------- lib/iov_iter.c | 29 +++++++++++++---------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/include/linux/uio.h b/include/linux/uio.h index 49ece9e1888f..e46477482663 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -176,8 +176,6 @@ static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs) return ret; } -size_t copy_page_from_iter_atomic(struct page *page, size_t offset, - size_t bytes, struct iov_iter *i); void iov_iter_advance(struct iov_iter *i, size_t bytes); void iov_iter_revert(struct iov_iter *i, size_t bytes); size_t fault_in_iov_iter_readable(const struct iov_iter *i, size_t bytes); @@ -187,6 +185,8 @@ size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, struct iov_iter *i); size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes, struct iov_iter *i); +size_t copy_folio_from_iter_atomic(struct folio *folio, size_t offset, + size_t bytes, struct iov_iter *i); size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i); size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i); @@ -204,12 +204,6 @@ static inline size_t copy_folio_from_iter(struct folio *folio, size_t offset, return copy_page_from_iter(&folio->page, offset, bytes, i); } -static inline size_t copy_folio_from_iter_atomic(struct folio *folio, - size_t offset, size_t bytes, struct iov_iter *i) -{ - return copy_page_from_iter_atomic(&folio->page, offset, bytes, i); -} - size_t copy_page_to_iter_nofault(struct page *page, unsigned offset, size_t bytes, struct iov_iter *i); diff --git a/lib/iov_iter.c b/lib/iov_iter.c index d9e19fb2dcf3..969d4ad510df 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -457,38 +457,35 @@ size_t iov_iter_zero(size_t bytes, struct iov_iter *i) } EXPORT_SYMBOL(iov_iter_zero); -size_t copy_page_from_iter_atomic(struct page *page, size_t offset, +size_t copy_folio_from_iter_atomic(struct folio *folio, size_t offset, size_t bytes, struct iov_iter *i) { size_t n, copied = 0; - bool uses_kmap = IS_ENABLED(CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP) || - PageHighMem(page); - if (!page_copy_sane(page, offset, bytes)) + if (!page_copy_sane(&folio->page, offset, bytes)) return 0; if (WARN_ON_ONCE(!i->data_source)) return 0; do { - char *p; + char *to = kmap_local_folio(folio, offset); n = bytes - copied; - if (uses_kmap) { - page += offset / PAGE_SIZE; - offset %= PAGE_SIZE; - n = min_t(size_t, n, PAGE_SIZE - offset); - } - - p = kmap_atomic(page) + offset; - n = __copy_from_iter(p, n, i); - kunmap_atomic(p); + if (folio_test_partial_kmap(folio) && + n > PAGE_SIZE - offset_in_page(offset)) + n = PAGE_SIZE - offset_in_page(offset); + + pagefault_disable(); + n = __copy_from_iter(to, n, i); + pagefault_enable(); + kunmap_local(to); copied += n; offset += n; - } while (uses_kmap && copied != bytes && n > 0); + } while (copied != bytes && n > 0); return copied; } -EXPORT_SYMBOL(copy_page_from_iter_atomic); +EXPORT_SYMBOL(copy_folio_from_iter_atomic); static void iov_iter_bvec_advance(struct iov_iter *i, size_t size) { -- 2.47.2