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 48CAAC6FD20 for ; Tue, 21 Mar 2023 20:54:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D6B0D6B007B; Tue, 21 Mar 2023 16:54:46 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CF4DD900004; Tue, 21 Mar 2023 16:54:46 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AF95F900003; Tue, 21 Mar 2023 16:54:46 -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 88B5B6B007B for ; Tue, 21 Mar 2023 16:54:46 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 5A8881201B9 for ; Tue, 21 Mar 2023 20:54:46 +0000 (UTC) X-FDA: 80594109372.28.2C4E502 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) by imf12.hostedemail.com (Postfix) with ESMTP id 42C754001E for ; Tue, 21 Mar 2023 20:54:44 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b="DtrM/GAK"; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf12.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.43 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1679432084; 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=b4AaWDqV89kHBZGOLd4BouvpuEGkoHHTR7oX6vXaXkQ=; b=y4PPcJgPOcwOvb+0q/jQn/tEzTrPp9jtsrvsE8Qo6mAvFJ8LisrFlCNZxnhY9J7gQoWxJU 6d1Kl0LMdIq/8vTdIngecpphncmsJG2xdhoDFfGAE3Vgh8p9VuRWSf95tJS/jfloEZKrUM 5p8TQnBZBy81cP48tjtdfLyXPWnopXY= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b="DtrM/GAK"; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf12.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.43 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1679432084; a=rsa-sha256; cv=none; b=LdfnObqQHrdm3SWp7haYRAw7MKo77L5frk5vcoXCl6qfEgd+MvOc+wFnaWQOAl80WYuAUd aB2Q42hbe5KpyCAzPMqy6VAPfDYIoa99wAmGoC88nYDkN4EMEp714gqI3MgwReUpQkexwU /tZeVK1xzIZJTMU3i3RBBtOvRALO26E= Received: by mail-wr1-f43.google.com with SMTP id t15so15045599wrz.7 for ; Tue, 21 Mar 2023 13:54:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679432082; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=b4AaWDqV89kHBZGOLd4BouvpuEGkoHHTR7oX6vXaXkQ=; b=DtrM/GAKL+afDECOYccj2A5NhbOt6QK4UCjV13FFWN1N4jdaBAT7gMxRmDEF1VBl0P q3bv04VT2AAKYj3fgVyGX+Bgl1DxuKhi2zmCw43Wrs0lCpWjbH64Spf8AoWlaPVMN/v/ oAhA+kOXLwYCnp/iFu8s+4yz1zzFzZ2ooIjv9OsNw2iC1z23zCT8m8r2AxgC6o1idz71 eZD3+7KhlXMM3oNj2pL+K/eVyfuLeAoQLKL7AyCM9Qq+cSBR2dA4BjZdpGTHKfh2lRNz TLHUqXEDW+pMxZc41EOW+Mj0c3BRWjubPngA3fKrogTi6IMSk6P29qijajn8rQOmbvO0 5weQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679432082; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=b4AaWDqV89kHBZGOLd4BouvpuEGkoHHTR7oX6vXaXkQ=; b=HydVFHDHeBiaqhxIDWEFnX8GaBUA9MVsFoHXePpcOZkRpzYGwLun1Z1P7AJ4P5cyTK lZF3PsZizCFO9Ht8Xic3BckF2J6SP+b47lflnmtRATEIE8MlkxnzzNr5xfN30Smsf4lf QeV5SUEcKjzrM19iRP4T22Jh8NszwFynNbnYpJ5g0Yh8hGwrrU77Y+nYBgx55YQD7PMp RwbrvLqplOHf45LdsVFYSukwkb/jh7Sw/43ObOlaLAqMnK96ZZEFd6/1ToJRcgS0fZ6V XqtMrrQDHRqAXAcExCvSdsuyUAdZy4qm5Boif3noHuA6ZuV0Y6Lnfx9vEPdD3LWJRyY5 gy0Q== X-Gm-Message-State: AO0yUKUN7z69MN4gIfOGbwBUpXDVh/D8NBti8g9vAX7zR502lOcsrPQn qcQMpq7ZmoPdaZVatLc/qyHJP9rF3gM= X-Google-Smtp-Source: AK7set+oirJx1dsvQlN/Z2V/fsl/sXGk9/Y29eUdqktVmfmf2jbXPagkewMzFvuQJ63lAYAj1jwkaQ== X-Received: by 2002:adf:e652:0:b0:2ce:a80c:3747 with SMTP id b18-20020adfe652000000b002cea80c3747mr3208960wrn.71.1679432082307; Tue, 21 Mar 2023 13:54:42 -0700 (PDT) Received: from lucifer.home (host86-146-209-214.range86-146.btcentralplus.com. [86.146.209.214]) by smtp.googlemail.com with ESMTPSA id a8-20020a056000100800b002d8566128e5sm3744575wrx.25.2023.03.21.13.54.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 13:54:41 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Andrew Morton Cc: Baoquan He , Uladzislau Rezki , Matthew Wilcox , David Hildenbrand , Liu Shixin , Jiri Olsa , Jens Axboe , Alexander Viro , Lorenzo Stoakes Subject: [PATCH v4 3/4] iov_iter: add copy_page_to_iter_atomic() Date: Tue, 21 Mar 2023 20:54:32 +0000 Message-Id: <31482908634cbb68adafedb65f0b21888c194a1b.1679431886.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 42C754001E X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: sii534xyk43ymp9osqjsxbotzepard69 X-HE-Tag: 1679432084-520570 X-HE-Meta: U2FsdGVkX18GK/hqMLlG1PeQZ7JFc64sVdROxKPc5GizJH4UKLyabRvmDsqldmzzNsqrZg7kakMTv64IRKA268t9rgmYdlCi/c/9fPYF4EacaHk8uCqgVILnlxaV0KKrldxISfAfmBsoDK7PhC74UAELAXMV0FrKrLL3aZI4d+MB5TAOTb5XGKCB+myownu4LbbvG7k7eXfLUbSDHq9Ti4B6sC+xZLEtabGcYb1yEBpcqkvb3dttcDkXnmMHngEpeBZixZ67DVlkyEu/jHkDVSXlxJuWUTOcwcN9pZ0f3I5dGetocSdHifcB6vpwOBfQsT6Q/engyz6gq0BFILhLKY2YlTIFqhvHUvV1DYJUGQsmX7g8+kGBGmeehg4TpxjxYLlz/5DsuEQRKhiTuF0343xueJA7NTiq4X8QcFdCdj2yzxuiHKbuXWACctHBWx3W+dQtKbAzC9EzsClBaQhVKMCd9SaLHRSf3TzirmNncQijyTHnHYzCfw1n77fppGxryrcuIZj+Q4dlWcPHD0noo8OVr3WlyfzJ59Qg9uobquQrePqQwFjeguCb/iKgM4MlvYfiw1+k3UIL6SPL8zQ3mKdO3gV1jP3NYGKCEH6SN1I49B48tJ7DFRl2YfLVuz7y5FJiBf44Lk2nJf5OkB7oqPaPYoPbuDPMnwcSr6evlJGA0wFo+BFrupPqon73jzFxTttir6n0y8QD4US84wlg2qEmUcg2j2D92BWMzKL3g9Kf0ghxNGM/KzbPWknJmTCRwISdJuy2LOBIHKZv1Py7Tx+RwTuZPvDNxC4fvn+ERzhJkMH3jsmlDGyAA2xnr5XUXfvYOwCASsxZf7Yrw1rEXzrOKLGxKezpyP6ORI/iQF7+rkNKqyMaqVFtgtDYP1kD4HVaaTSzqTrAQbZb4wPVq5JfZ5Edx/kAZB1M5nhWz1e3DjfhRGQg5eKpgZKlv4LD6eRkSao1ERDznBgviwy 6uoUilsG +0U5Kh5cbd0ZMNLKfuFdrqo9ZBrBNi/d08MF836l97oPBtZWsWJrcY2uCzVF362bdj6QgxEOadrktgbclfgrGwOUxgylV0Y7KSh7h0G7RhaHi/V/DcOENd7TBJqDGpIRbG6/9pqUebzbtRTZuBWUwDrNFLdi56gKHQn8HQzBItUWWk4s84lwyn1wCmmSp+ubpU2A3pCCz64LR0tzjwo/jmdX18a0RD8MFFdP6Bj9YsladF9s5Irr9f9VS7xKyal7LPW/iPZ6GiRTmUkG4D9E9QXcV3KAUzo3LSLgUg66BxfktAmRtm6fq2TEmTLZyL+bSxA30Ms5lSyjCJdHy4g9luoJuaZdYv/iK6PW3E9yjPzgsWRwd9eF3ey8e+dc3RlmUiNDrUiu6DpBpRpLA4RQR4p+UjLeaYIVYN2NdEckearUamM3Be098OFDecs8h8BtYcxS73lfeAJPrHvRrTM2afBnQy1OFQz6laY5VkNnjNGypZTE0Gb1ZP4idGs3BHQV83Vsl 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: Provide an atomic context equivalent for copy_page_to_iter(). This eschews the might_fault() check copies memory in the same way that copy_page_from_iter_atomic() does. This functions assumes a non-compound page, however this mimics the existing behaviour of copy_page_from_iter_atomic(). I am keeping the behaviour consistent between the two, deferring any such change to an explicit folio-fication effort. This is being added in order that an iteratable form of vread() can be implemented with known prefaulted pages to avoid the need for mutex locking. Signed-off-by: Lorenzo Stoakes --- include/linux/uio.h | 2 ++ lib/iov_iter.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/linux/uio.h b/include/linux/uio.h index 27e3fd942960..fab07103090f 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -154,6 +154,8 @@ static inline struct iovec iov_iter_iovec(const struct iov_iter *iter) size_t copy_page_from_iter_atomic(struct page *page, unsigned offset, size_t bytes, struct iov_iter *i); +size_t copy_page_to_iter_atomic(struct page *page, unsigned 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); diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 274014e4eafe..48ca1c5dfc04 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -821,6 +821,34 @@ size_t copy_page_from_iter_atomic(struct page *page, unsigned offset, size_t byt } EXPORT_SYMBOL(copy_page_from_iter_atomic); +size_t copy_page_to_iter_atomic(struct page *page, unsigned offset, size_t bytes, + struct iov_iter *i) +{ + char *kaddr = kmap_local_page(page); + char *p = kaddr + offset; + size_t copied = 0; + + if (!page_copy_sane(page, offset, bytes) || + WARN_ON_ONCE(i->data_source)) + goto out; + + if (unlikely(iov_iter_is_pipe(i))) { + copied = copy_page_to_iter_pipe(page, offset, bytes, i); + goto out; + } + + iterate_and_advance(i, bytes, base, len, off, + copyout(base, p + off, len), + memcpy(base, p + off, len) + ) + copied = bytes; + +out: + kunmap_local(kaddr); + return copied; +} +EXPORT_SYMBOL(copy_page_to_iter_atomic); + static void pipe_advance(struct iov_iter *i, size_t size) { struct pipe_inode_info *pipe = i->pipe; -- 2.39.2