From patchwork Wed Mar 12 16:47:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 14013691 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 4B310C28B28 for ; Wed, 12 Mar 2025 16:48:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BF8A9280006; Wed, 12 Mar 2025 12:48:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BD5BE280001; Wed, 12 Mar 2025 12:48:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A71B1280006; Wed, 12 Mar 2025 12:48:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 80971280001 for ; Wed, 12 Mar 2025 12:48:00 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 74AF5121437 for ; Wed, 12 Mar 2025 16:48:01 +0000 (UTC) X-FDA: 83213481162.30.0E1E399 Received: from nyc.source.kernel.org (nyc.source.kernel.org [147.75.193.91]) by imf12.hostedemail.com (Postfix) with ESMTP id DD41740005 for ; Wed, 12 Mar 2025 16:47:59 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=j0R2BVOR; spf=pass (imf12.hostedemail.com: domain of sj@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741798079; 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=766bFuMSEMQSVYPIJ8mS7qhrM1JBolsiUH1n2zHNRvk=; b=SXkA5r0Oh8Dv/aXr8cUP3lFBtFtKmpENaTDrQpZSZSkrZzno6b3kM0SeXB28YvP2p1wHx8 A5FJp+JkNofDZsYACLcQ3OekyMxE0kENMxo9kz0J60QL02AFOiBXPvD2mt6uBtVrNkFVv9 6d6JZitevvkXMAFx3BRQjN+O6eUGwRc= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=j0R2BVOR; spf=pass (imf12.hostedemail.com: domain of sj@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741798079; a=rsa-sha256; cv=none; b=DtukPc3Z+KA7Ie/pBMG6LHuYY02mQxNfFk9ePxNgxqcIpESTGOcpXKR+/gjaa7MjIFhpti zkG1dSCgTv7zvWLoriCbeIKhpKcMymbQi1Wg1Z67mNhmCI/ubx1yITJZlG47u7laM+L4SD Nw/j0zIBkUQBh4aqEDT8RQWDBa3Mkeg= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by nyc.source.kernel.org (Postfix) with ESMTP id 53B2BA45F83; Wed, 12 Mar 2025 16:42:29 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5A71C4CEF0; Wed, 12 Mar 2025 16:47:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741798078; bh=oQN+mH789PvTmGLvlHTcsIxu+Znjze2S0+wMa1s72FE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j0R2BVORIe3z3UqUZHwFFZiyYbMSgywv0UHdCOInvRehpN+8M8jbPX0167V/218YG 2qliFJ0mz4oVhqtkYaYWxKe2lkFz02tzY6LYW5mtMnMSptWnh8H3l7geT0gB5ZLYIy GVHYLAUraEAbLRgf+zuN+hUBplGQ45BwMF/QUW8U+Kr4AzUqNkDZ6l84Nf6X9mogRg scc7lFkhIPwaxHi8n6+e02hoWJWOEjkGji4YNe88ubCHrlq87dnOx7cgjqWIJjhXO1 0P3wJu6fSNnOmmCBXgWmWiycwscR3SABGzd9IFDFN6hf8ssnoDlMvK0CSyDomfjHJH ED5w+PmylaquQ== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , "Liam R. Howlett" , David Hildenbrand , Lorenzo Stoakes , Shakeel Butt , Vlastimil Babka , kernel-team@meta.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 3/4] mm/madvise: deduplicate madvise_do_behavior() skip case handlings Date: Wed, 12 Mar 2025 09:47:49 -0700 Message-Id: <20250312164750.59215-4-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250312164750.59215-1-sj@kernel.org> References: <20250312164750.59215-1-sj@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: DD41740005 X-Rspamd-Server: rspam08 X-Stat-Signature: foxrsn6kryheyd1rwe9ky8ejgujmok33 X-HE-Tag: 1741798079-10850 X-HE-Meta: U2FsdGVkX1/7Px0nOz8WFVBk5RFFbZNR7CuEQ7/NOQkMz7Mh796V1C0+waG8SFoXbZJVdxa3oR2wYDT6EUa/aS8ClJ2ttwtt13deTw+zlvkGTiVnNm/2VSgWdWwLJdZrXpoq0tOS3dVJ0gwCqOLE7tsIuXtcgRKxWCOT8AxfXvOvio1QqErtDMcjm6HHWauiGtranSUkSkoIwCOw7v27Fq2vrhyWeBxOQ8i1MrvbR2GrTqko/8pF2PAWKTxI9sUSM986qlWfW2z6oMFjVxArMYDVyVkoYN9CAKvBkQCvjSFe4VLTk0RBqVNjxPK0F/a1a/Qdf3h5YIW+yglrWvpAeGtrSldNEoRGbzn3PVOoT5feHa4AHQVwRgGkCvLV0aCs7p/Hj8PSA9kwS2O6Bao1iI85Jt2Xb6uUXzEFQXt+49l9RogI0SHBqaY6r3NEr+VrRmWF+0LvCD/sSCu+UX5hWobm1HHIe4t0BEpWDuhuhL35GVu6/AXgWyfNag78bq/hptLlV5wspN4I3/y/tL61EOqunhmeLEYxluXN01664VxujkSSA7txviHK9sbFk+1FfuKwsXTGUq7wGzoBK+0LMB8dWDbf5jWMC2YQ7roNoIHiFfW3fHx/wBdmH8M2J7kvzfyo592r0rtAvpZRbnMCquAYE3DoWi60zaXMacDvnHtkNBl2koGyKZCNguznQc3EpqFaynuTRK96pCwMULWeHuZMQwCOnYnaoLH86MiHQUiwk4CLZBNOxhywFuLewmHL0P8jsbHNKoUGw9pkGr2mdFxQ0WwLH3VALdy5QZHuzHAhf1lkOANS7Vp0FmRd2YtUvjZs+hjWB3DXOWA7TA30KrJVNVTPWtyjJ1uAg14WsMMwGbhM/KUesWHr/MWKXf/0t8wNqPD/e9gbPLu6BEvaWahyU52EfS+J4st4oZgzjGRyaf7HE1dkFMMu1bsEX6PwmmyCGkwIrIWcWkps2P2 e+irzEaK nF7W+eYt/1qmZ0tX3jrP2FVme/u0vFe/z4S1fMTOQk6Y6yIKPdS4KeXtjncX7x43Tg/fN/Vl5pxdEYTYUlyy0+jNI5jNVgzfOp8XSDYFw1Felh3a3vKaXqwLkznDIS0pA04CxI3t6SVPxOcL4Q6C72DL7ZBNQzdAd7k3TCGQjTwdXlBNuTDw4aFU3koVawZ42FmxcISZYkFjw+IMNVo0LW9zpmlY43kB713rtyrtQm8CbWm7TAVGIu6chu36S2iPHI+KrHBwo7j/ofxfPsJQsw5Qt34D2gzwq1huVik2uOrx+cxw= 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: The logic for checking if a given madvise() request for a single memory range can skip real work, namely madvise_do_behavior(), is duplicated in do_madvise() and vector_madvise(). Split out the logic to a function and reuse it. Signed-off-by: SeongJae Park Reviewed-by: Lorenzo Stoakes Reviewed-by: Shakeel Butt --- mm/madvise.c | 57 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 611db868ae38..ba006d05c7ea 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -1640,6 +1640,31 @@ static bool is_valid_madvise(unsigned long start, size_t len_in, int behavior) return true; } +/* + * madvise_should_skip() - Return if the request is invalid or nothing. + * @start: Start address of madvise-requested address range. + * @len_in: Length of madvise-requested address range. + * @behavior: Requested madvise behavor. + * @err: Pointer to store an error code from the check. + * + * If the specified behaviour is invalid or nothing would occur, we skip the + * operation. This function returns true in the cases, otherwise false. In + * the former case we store an error on @err. + */ +static bool madvise_should_skip(unsigned long start, size_t len_in, + int behavior, int *err) +{ + if (!is_valid_madvise(start, len_in, behavior)) { + *err = -EINVAL; + return true; + } + if (start + PAGE_ALIGN(len_in) == start) { + *err = 0; + return true; + } + return false; +} + static bool is_madvise_populate(int behavior) { switch (behavior) { @@ -1747,23 +1772,15 @@ static int madvise_do_behavior(struct mm_struct *mm, */ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int behavior) { - unsigned long end; int error; - size_t len; - - if (!is_valid_madvise(start, len_in, behavior)) - return -EINVAL; - - len = PAGE_ALIGN(len_in); - end = start + len; - - if (end == start) - return 0; + if (madvise_should_skip(start, len_in, behavior, &error)) + return error; error = madvise_lock(mm, behavior); if (error) return error; - error = madvise_do_behavior(mm, start, len_in, len, behavior); + error = madvise_do_behavior(mm, start, len_in, PAGE_ALIGN(len_in), + behavior); madvise_unlock(mm, behavior); return error; @@ -1790,19 +1807,13 @@ static ssize_t vector_madvise(struct mm_struct *mm, struct iov_iter *iter, while (iov_iter_count(iter)) { unsigned long start = (unsigned long)iter_iov_addr(iter); size_t len_in = iter_iov_len(iter); - size_t len; - - if (!is_valid_madvise(start, len_in, behavior)) { - ret = -EINVAL; - break; - } + int error; - len = PAGE_ALIGN(len_in); - if (start + len == start) - ret = 0; + if (madvise_should_skip(start, len_in, behavior, &error)) + ret = error; else - ret = madvise_do_behavior(mm, start, len_in, len, - behavior); + ret = madvise_do_behavior(mm, start, len_in, + PAGE_ALIGN(len_in), behavior); /* * An madvise operation is attempting to restart the syscall, * but we cannot proceed as it would not be correct to repeat