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 EE3CEC54EAA for ; Thu, 26 Jan 2023 23:41:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 683B36B0071; Thu, 26 Jan 2023 18:41:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 60CCB8E0001; Thu, 26 Jan 2023 18:41:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4AE226B0074; Thu, 26 Jan 2023 18:41:57 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 394D86B0071 for ; Thu, 26 Jan 2023 18:41:57 -0500 (EST) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id F04D6160B66 for ; Thu, 26 Jan 2023 23:41:56 +0000 (UTC) X-FDA: 80398575432.10.3C6ED1E Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf01.hostedemail.com (Postfix) with ESMTP id 311BE40008 for ; Thu, 26 Jan 2023 23:41:54 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b=DV+cnCxe; spf=pass (imf01.hostedemail.com: domain of akpm@linux-foundation.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1674776515; 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:in-reply-to:references:references:dkim-signature; bh=OB5ZkLo9l364peXRhzBM50+dXn0K3Oi3t9uRPiaH+qY=; b=3OUBVBreJY331cknz73AaeRUjiWrd9pbHd+wJne/yxbiwEs/VQIrG4eRu/laNbno5Fk43E dCDXlIsov/iIV489ML/acxYmy9Pt3ZtuJi+Sfymsb6C/13u/xBbbHnMsgFVBNoItGWzGRI wRA/3uYVJ5AxBoZW0p0+7aR1cVsSwNo= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b=DV+cnCxe; spf=pass (imf01.hostedemail.com: domain of akpm@linux-foundation.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1674776515; a=rsa-sha256; cv=none; b=EdKTNAbYJB35Dgk74uEb+TkAcrsBnKJRpSEbtSQOrgWU++PMpqV2xy+0o5NSIesiYtSkJE Mtdqe8U2HpbyE0ldzN6yuaAREvallg+BwpFCydHjOsB36m4FSsZJcaKf5BEp13iuILGm+z yY+sEaY2sw+8KuM3WYjoA2JMxiXgpU8= Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 401DE61976; Thu, 26 Jan 2023 23:41:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 81AE9C433EF; Thu, 26 Jan 2023 23:41:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1674776513; bh=OiPUHqgirjVxTh2w4QlA9W8nPKtQN2owuoVmFJo9198=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=DV+cnCxe/797o4CccJ1fV3SOHCbbRm3ukNPlsCRkf/gNbK0rFM3PaAEL3MPqGVZ9X +HrxhhCzy1CFrNPhlnuioD34+EGhJMb+wOCh89gktVfZAonExcZlhqA25vuSKJDJjj A0fpVNdsadiXiWciz2df0x9H/c8S3ox55lYrm1Gs= Date: Thu, 26 Jan 2023 15:41:52 -0800 From: Andrew Morton To: "Matthew Wilcox (Oracle)" Cc: "Fabio M. De Francesco" , Ira Weiny , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH] mm: Add memcpy_from_file_folio() Message-Id: <20230126154152.898a1bdfd7d729627e2a6bf4@linux-foundation.org> In-Reply-To: <20230126201552.1681588-1-willy@infradead.org> References: <20230126201552.1681588-1-willy@infradead.org> X-Mailer: Sylpheed 3.8.0beta1 (GTK+ 2.24.33; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Rspam-User: X-Rspamd-Server: rspam03 X-Stat-Signature: qry9un4k9k6g58kdwewxzhfanb8h1m5o X-Rspamd-Queue-Id: 311BE40008 X-HE-Tag: 1674776514-205655 X-HE-Meta: U2FsdGVkX1/d7tNJaXir281n4hwMjdzyKRv+JJWIiRMg1YSAuk3RL16nO0ZXG4roJGQFGG0mIKkKIXGOSr+sn0ubV2rQUjGXxW/xUtPNQEJL4ZZIvHGf1gG7okeJ2yENC53rCRpcl11BznDdbQjl4Oh6fqOboRlWBifYGCJ+dVgMhf/LIO6vFeyo/liq9e120lfO5PWQJv8VdNDzOyKDhQjw0GBGQzn8w2cBk6HPdBps37gz2zh65fKj1nLlc72ewTnczadUZKPlHRHK/FAis8ALfNXlWuF3JZnUtBwOVkqeKn0Wh2bmW+tVQv0SNJNBCuMZNLyxdw54zn60l2r826pluojeHX9N2H18oMvr+f7aNUh7ibaM8h2iN/9gylL9DSOOKHqi4WppHYglON7EwFNIu/YPxiZxHxRBaQ89oWZ7dqLDca2QaZ3Ciuda0u/4Qe4/logrqdzgk/+KeNGWNZ5cdwVszbO5erjt4omg+B/4ImdamxXOiQ3EmXYn/o2u0MAaAFDc5wv9kb5aWwPZ8irgAijfKD/glMc7mgS/cndDoOYu1M1wubgEo/jgzoH5zn2DIPiOfgPFOwnPTTXuHCu5iGNxd9ZiV/A6TtGVDg3VSQpC1mxxs2nldaZ7c5O2lm9NVrlLyS0NrnkzNDgXv1CKZrsSI1KBYs9nKSb/SmtfeF6KZTRX3pPsMcwi2eL7rQOJK/X1QeGdLFxELXQDLhCQ2awTXGMoQxkEVUyFVDRDKZUPf34fIwD6icPHJ0ZiOEEkj3SO3vw5Ro/KjCV1QjVx0ceZiR7CS4YbO3Fp6SeOKy1AhiE4fwMxY3GNRD8BOncIftbcncU//Lv6IzUdUkSa8SyWGS4FXyBZDGCSLj8X35aP/RAr+rt+lFbIe5axBGcKJGhHmLplagjTNFDq5ebqW1DxKJtoCcha4hDcOqblA7CCkuM+jZWx1pnWbCE3PbH7FQ6zalVoFWh+1B8 XnI8PuSG h4fQngbf+Uhc94cDj/duO7AIBF/90UOVOz87i3P83gnO4Ox/Hmbu46Rt1qb3BvmuVRbbgDvoU2159g71PIH+4jKjYepDvKg7jNaXITpNsUwFUHe86T/6Vfsk0MVY+Lb5LZ2rOCnf4W+OAKWZizLe2IFRSEHTe1yURCkF2B/HWvG9IyGPflhVceLQXOzQqsMvhlnXRhffc4DtUwCD8z7lfDb8IUZ2YQQt5NFfG+wvwB2iMyWJRkGvCbW2AS+0s7LfoknsnZMKKGd4y5e5mo9ksHk9dhJpIBaiCG7BREypYiV77uDn3LtC2UfOAP8dvq1Of1RtxsNmwZnJro9VsJmSLjv6nUacRu9lfa0KGO7riJg0nRxDfEZG3u99aUWn6n4hmTxKtDLY5Nbk0CJjIlQF1doatUpAGiCurM8St7RirDGLmSqKFtwTNJb0O+vawcAGLqpUg 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: On Thu, 26 Jan 2023 20:15:52 +0000 "Matthew Wilcox (Oracle)" wrote: > This is the equivalent of memcpy_from_page(). It differs in that it > takes the position in a file instead of offset in a folio, it accepts > the total number of bytes to be copied (instead of the number of bytes > to be copied from this folio) and it returns how many bytes were copied > from the folio, rather than making the caller calculate that and then > checking if the caller got it right. > > ... > > --- a/include/linux/highmem.h > +++ b/include/linux/highmem.h > @@ -413,6 +413,35 @@ static inline void memzero_page(struct page *page, size_t offset, size_t len) > kunmap_local(addr); > } > > +/** > + * memcpy_from_file_folio - Copy some bytes from a file folio. > + * @to: The destination buffer. > + * @folio: The folio to copy from. > + * @pos: The position in the file. > + * @len: The maximum number of bytes to copy. > + * > + * Copy up to @len bytes from this folio. This may be limited by PAGE_SIZE > + * if the folio comes from HIGHMEM, and by the size of the folio. > + * > + * Return: The number of bytes copied from the folio. > + */ > +static inline size_t memcpy_from_file_folio(char *to, struct folio *folio, > + loff_t pos, size_t len) > +{ > + size_t offset = offset_in_folio(folio, pos); > + char *from = kmap_local_folio(folio, offset); > + > + if (folio_test_highmem(folio)) > + len = min(len, PAGE_SIZE - offset); > + else > + len = min(len, folio_size(folio) - offset); min() blows up on arm allnoconfig. ./include/linux/highmem.h: In function 'memcpy_from_file_folio': ./include/linux/minmax.h:20:35: warning: comparison of distinct pointer types lacks a cast 20 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1))) | ^~ ./include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck' 26 | (__typecheck(x, y) && __no_side_effects(x, y)) | ^~~~~~~~~~~ ./include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp' 36 | __builtin_choose_expr(__safe_cmp(x, y), \ | ^~~~~~~~~~ ./include/linux/minmax.h:67:25: note: in expansion of macro '__careful_cmp' 67 | #define min(x, y) __careful_cmp(x, y, <) | ^~~~~~~~~~~~~ ./include/linux/highmem.h:435:23: note: in expansion of macro 'min' 435 | len = min(len, PAGE_SIZE - offset); | ^~~ We could use min_t(), but perhaps and explanatorialy named variable is nicer? --- a/include/linux/highmem.h~mm-add-memcpy_from_file_folio-fix +++ a/include/linux/highmem.h @@ -430,13 +430,14 @@ static inline size_t memcpy_from_file_fo { size_t offset = offset_in_folio(folio, pos); char *from = kmap_local_folio(folio, offset); + size_t remaining; if (folio_test_highmem(folio)) - len = min(len, PAGE_SIZE - offset); + remaining = PAGE_SIZE - offset; else - len = min(len, folio_size(folio) - offset); + remaining = folio_size(folio) - offset; - memcpy(to, from, len); + memcpy(to, from, min(len, remaining)); kunmap_local(from); return len; _