From patchwork Tue Jul 30 19:42:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Danilo Krummrich X-Patchwork-Id: 13747821 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 2D76DC3DA70 for ; Tue, 30 Jul 2024 19:42:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A3F066B007B; Tue, 30 Jul 2024 15:42:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9EF306B0082; Tue, 30 Jul 2024 15:42:27 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8B75A6B0083; Tue, 30 Jul 2024 15:42:27 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 6CC7C6B007B for ; Tue, 30 Jul 2024 15:42:27 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 10EA7C048F for ; Tue, 30 Jul 2024 19:42:27 +0000 (UTC) X-FDA: 82397440734.02.8B2FFE9 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf17.hostedemail.com (Postfix) with ESMTP id F3F1A40013 for ; Tue, 30 Jul 2024 19:42:24 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=qWfirlZU; spf=pass (imf17.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1722368518; 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:references:dkim-signature; bh=/bWAIu40nTHf4GuUtyXHloV34XIazGbVHKXM4aLzzAs=; b=UpVDgOz3IhQgT8E46/M6agRfKR6F7P0s55lV4Uu8btNvm3bNtUHbFiWPI0KfmdODzv72Q3 fmsrxCOigou07hxOfVD2jgJhrO2QzG7nkcjMDfIXBTswNZAgYKWKGaVn1HWNNzxvcgEViq cxcbxGoulrO++kmi3+7jxV3+vC6JRS0= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=qWfirlZU; spf=pass (imf17.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1722368518; a=rsa-sha256; cv=none; b=EWSPEPLpAiQ+eYX8868OOGcrlQu/gFcx4IHhoK7gjg6WcjGtAlTfX3IALGXcTcUFxDsO+L VLiDpmTBgai9a7TRobxy90fiErwhuXwtSbS3XYBytXZFUwjs9W4LsCrKiY5gu6IIsn71YG CBgbBfRjC3Ryf8F8g1qcC2OnfyLvgbA= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id A219DCE114E; Tue, 30 Jul 2024 19:42:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 88303C4AF0B; Tue, 30 Jul 2024 19:42:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722368539; bh=2LdP+yaGyLvvhYc3Idvuj/mK+BX++D9CaCktI4AVghc=; h=From:To:Cc:Subject:Date:From; b=qWfirlZUmxvQU4E3uad68ZRUdQdYOQoS2Dlu3zOu90XNN3UVB2SfIEI1u93uByfs4 /nAnsk9fzX+GOzuQElEDngL2EzwpGr0fiGlyhKKKFUb6OqXA1+DCWFF017EAIblUm8 eYn5+orLLFewFDwnymqLVrwTZprZc80wHvOwiMf1K2JgSbyQvH9XGxYBfMiFzyy+Z6 YQlg1kLbrVVjlfdAabf00WPulMXYXIsOQo/sLuLvVfl+E4UsXmlVVnnW44B/lvOFcR eiqCk1VZ2UunbCoVl67eqd356b126hCOuEgoR0J+ec1T4aps1lvp9qv82mHz4yKh6z 2v71OZIVs64Iw== From: Danilo Krummrich To: akpm@linux-foundation.org, cl@linux.com, penberg@kernel.org, rientjes@google.com, iamjoonsoo.kim@lge.com, vbabka@suse.cz, roman.gushchin@linux.dev, 42.hyeyoo@gmail.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Danilo Krummrich Subject: [PATCH 1/2] mm: krealloc: consider spare memory for __GFP_ZERO Date: Tue, 30 Jul 2024 21:42:05 +0200 Message-ID: <20240730194214.31483-1-dakr@kernel.org> X-Mailer: git-send-email 2.45.2 MIME-Version: 1.0 X-Rspamd-Server: rspam03 X-Rspam-User: X-Rspamd-Queue-Id: F3F1A40013 X-Stat-Signature: woe5hynq5mpwb7k3d6e5tu5819wm91pc X-HE-Tag: 1722368544-277248 X-HE-Meta: U2FsdGVkX198kRBCSPjyh1VtXz3DJXWad0tf8nwyXQ9yYhFT+fIkCRlKwelrIWOYiXlRWOgptsz8613XeRq2SaQg76+LMQDMENpgUoNh1W+p3SJKi0iBMPzQmZZ6Ctyxy5paoE+cd/5cisxRLIww32OTfd6XGBl39NnCdu1kVbINLDTBgve6MQqFcJ9jerCTvCIpIB4CCPM59A4EWCoL6ySqp/axBcoOQaMA8o2XkIGHXFZJRlGbLNksvQ7RNu3dS9zgoPZd+vOcC0sqVJeoeJ1BYmCDc40pij0Q20465ockMXL7wHFiao18afYNM+bncEJHscVYUQhhWpZQfUEmzlo6kLFHat5OzB7Eaq6zySJQ1/oBYg5wHiFlY636iY1Mx9R2UBbUVnevJ1JKP4IW1lO4enbVJeubR4Wt0po7NHsyOka4lxMzEQvUWNnLZU1wfagkXmkZRPL0f9EOfGc+u0PYy7kib4vqly60UJVJWxH7UoMPdLVNt+LgzeYsCDI0g9R1xy2e0/fOowGnYNeG3i84U4rAA92v0OEp6Pagq7QTNVqWGmHVPi9l9br8yPVHkOgpHZRR8P1BdVlPZvKBuEVByhsMuwqGUKG8fPnIvjRYtzDG9d9jN7JfJAT/PpUTbav/MZiO2Rcu/5FPxSxyPZQ8IODSA3lV7xE4uQ0jrHgpwTdq432Kl8J0+oBSENY3xYlYkK0KHNLdnJLJcKSimrgkCpSrMrhL6MARXFJljIolVuVPmpl1+qUkMSp63DSr0vACOn4umdupGsz0dD7RoTTirvLzVO/ioH9kdDrmq7RQFFsSheTL+imblVntWXgftZe+/JSfv3bwkfdY/4e0n+ulIPoErdFbdsreedFzXQ4kSK1OD6+evYFX+4L7OLXPPJWZFg+/t/jroPOQ6fDKGl6YiUQjvCfdS6SMhRJ/Dy7Qhwk0bNwFn9JiaJKvExvON8RMAoSPbRKA2+4pcub Vqliv448 rAc1rpMJDtf0jj/Pf5HQ8hc4McLVq3sSxJuCXza9Z5jb4uc5iExvKqFqDBNhi4lSp9FPJZ//fCvoaa/KS89YAC5VVsFTgVVHl2WFwko052fzXPKvBN1mimHLXMeKPrgNwUo00Hc9Dvpm4ODZXXeKzlzeucm91wbnY6ZUoQxtgKD076fs0F9AYvIqSodjdd1JkFwkVWh18KVw9cuPb2gNWiSca7ECoE2lrjGBIIUl4YMLC/6Cfn5S53/rO2MnPDDfoZcI6Fb9NyErgWUShrnYPSZFFFTWjiipqMty42PN+4KjobM2COm5CapNZeID4yVMH5lblNJ4WeATRdM/7GxyygtrHr4k4T/Yn4N// 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: As long as krealloc() is called with __GFP_ZERO consistently, starting with the initial memory allocation, __GFP_ZERO should be fully honored. However, if for an existing allocation krealloc() is called with a decreased size, it is not ensured that the spare portion the allocation is zeroed. Thus, if krealloc() is subsequently called with a larger size again, __GFP_ZERO can't be fully honored, since we don't know the previous size, but only the bucket size. Example: buf = kzalloc(64, GFP_KERNEL); memset(buf, 0xff, 64); buf = krealloc(buf, 48, GFP_KERNEL | __GFP_ZERO); /* After this call the last 16 bytes are still 0xff. */ buf = krealloc(buf, 64, GFP_KERNEL | __GFP_ZERO); Fix this, by explicitly setting spare memory to zero, when shrinking an allocation with __GFP_ZERO flag set or init_on_alloc enabled. Signed-off-by: Danilo Krummrich Acked-by: Vlastimil Babka --- mm/slab_common.c | 7 +++++++ 1 file changed, 7 insertions(+) base-commit: 7c3dd6d99f2df6a9d7944ee8505b195ba51c9b68 diff --git a/mm/slab_common.c b/mm/slab_common.c index 40b582a014b8..cff602cedf8e 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -1273,6 +1273,13 @@ __do_krealloc(const void *p, size_t new_size, gfp_t flags) /* If the object still fits, repoison it precisely. */ if (ks >= new_size) { + /* Zero out spare memory. */ + if (want_init_on_alloc(flags)) { + kasan_disable_current(); + memset((void *)p + new_size, 0, ks - new_size); + kasan_enable_current(); + } + p = kasan_krealloc((void *)p, new_size, flags); return (void *)p; } From patchwork Tue Jul 30 19:42:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Danilo Krummrich X-Patchwork-Id: 13747822 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 A5BA3C3DA49 for ; Tue, 30 Jul 2024 19:42:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1B3856B0082; Tue, 30 Jul 2024 15:42:29 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 164736B0083; Tue, 30 Jul 2024 15:42:29 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 003AE6B0085; Tue, 30 Jul 2024 15:42:28 -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 D63136B0082 for ; Tue, 30 Jul 2024 15:42:28 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 87C091204CE for ; Tue, 30 Jul 2024 19:42:28 +0000 (UTC) X-FDA: 82397440776.28.C6E52CC Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf20.hostedemail.com (Postfix) with ESMTP id 4769A1C0021 for ; Tue, 30 Jul 2024 19:42:25 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Hz3I3PPg; spf=pass (imf20.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1722368491; 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=a5ocU4KAyrFKyR1RuDmhZKkk0avy0OYrZVsZgIhVomk=; b=3w8VBW0L+QUDqol6c9pk+SIKNWb6DT62DroWi6tGbW8jfsFGN+hzabihg4u2lbRPSqOItH mPXW/8TFVW7ghLWsLaneSTpcYmWrwgbzUdFl87PQS7wAnSoC2OvSRtdT3rs8mR8/d9NSB+ c14ZA5wO8kS7SV6jPdCBda+x+jl4280= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1722368491; a=rsa-sha256; cv=none; b=d6sGmx1PFbxiXngOLgRDGlrdudDYDDVcRzpQFWRQXecahS2RtjcYjX7py08MgZUXnt3Xb2 RWzdAQGmELmvcWMcIT74K9t7ytZ9O4OBIN2/yvrbfTUtXOPmayVL6FAmT0oTxNnnGIuXFp 6ecXJtOP+3Y9WOhcq9HqSMpdOnGnoLw= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Hz3I3PPg; spf=pass (imf20.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org; dmarc=pass (policy=none) header.from=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 6819CCE11DF; Tue, 30 Jul 2024 19:42:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5FA1AC4AF0A; Tue, 30 Jul 2024 19:42:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722368542; bh=M76h9UGEvDOvQR6+2Hn3EAWaBbezIN4frYXV3T3puu8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Hz3I3PPgpwhw3lVSMpgtM9ztVA3tbfI3MKtbxzj+0dqVYZnDDiwozDj8zEop394Cg Lo4e9zEyKWlHpuwes3fvlngGhlKbyJ3hEfxUckaBRS8L4XYmHhfNGkGrHH4LwRFp2d gmSUg53aPKuRhlU2exxn36PshWOinMgX2bl3ZpmINY16Two2v7FM5XcCx7ZuG6yqX/ t7DVl5p2nTwixIb9yqcJSqSlsM8NlCBn8hPAzkCGpqgAD39qhx/7JPa8R3zbLAdF3e 8F+baNJp21sb5CKXM0Ya0JuaXP5kaEj7OWUc7KsCsbju0tjkN4OsaAYA3D8bOUJ57y Pt0i6ic5OCsEQ== From: Danilo Krummrich To: akpm@linux-foundation.org, cl@linux.com, penberg@kernel.org, rientjes@google.com, iamjoonsoo.kim@lge.com, vbabka@suse.cz, roman.gushchin@linux.dev, 42.hyeyoo@gmail.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Danilo Krummrich Subject: [PATCH 2/2] mm: krealloc: clarify valid usage of __GFP_ZERO Date: Tue, 30 Jul 2024 21:42:06 +0200 Message-ID: <20240730194214.31483-2-dakr@kernel.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240730194214.31483-1-dakr@kernel.org> References: <20240730194214.31483-1-dakr@kernel.org> MIME-Version: 1.0 X-Stat-Signature: 1zoek19t3srq4orsjekq75fe3nhorh9n X-Rspamd-Queue-Id: 4769A1C0021 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1722368545-562309 X-HE-Meta: U2FsdGVkX18MXnr5CmMPz+8qWQjEopMLy5kqyyNVelcy4Wm8VXkEXV7hxGdJZBFQTbBt1W64vHUhQ/W41Yjsby+bYY64yoHonWf0HKKDodwY3HAYZfE+Q1mONjgCkLMB5mjhY69U2STMHyl1SnhJCyOE3pPWuOacgcGQeQUimpXWGlXtWSZBamUktI1PTtRtexy4Zfnm74ymanAdIKbcKQUMR1C76B5nG/IZGSu2sl2kGjo+Jkxk9iJA4q7Jl3hFLlN838JCosdWiZn2A+Ig9yS9QlbSvfRwT7DRBfU1PWHZ7lTyTbXqOFPvOa5B1lhLJZfUIogs174/MsRO3ICtF+U8PRc6nmqKGyV4e/i3rdMk8rfmraJCrrSAHELG9P8wC6ELjfb3SvUxpysD760uk9bL8ohDhJClTNJ81KeUnMYLptmdXPeVFJ898BsTL/qEgard93oIyzPGJhNLIY1bCl0/M4QRpt0IUUdrMf6DwTifLE05tLUIxfEN8zsq/9P4D1YQOkW2+ZrT3Cxxug65mgE53c4k92MymM978BNDavM/gqufBDbl3jBl+Kvpg5vNXNOqncZEPJSdzUju+tAeC34YT90vFAqsywM510AxQ9lTSQ9YkFbgmlCFnOlGh4gSq0IdQrpTekVSV8TYooH20WdeVtmO+XkraFDq8TSZMOtho/3LUn0S08pJrDHUuziqyAb48ZMk6zyGDihmTlqbW2qzUQ9JAgdKgGu1KWiwUXfC5Th7A7v64mdjypq504+bQ7k6GcdAKjq46FzOb9gw4ezIhaC/H3qa3MgICscqe+ULdzHV+O7u/AVw9dD4Rliz5BLzkktRrAA9FOJBqxOglmj2UX1wus/Up0hLtr5Q5OFPVZsVSGZIG7gdKFAXTN0JMtjOyP7hXgb64DSCx/IuqllDBWK7IEsi5Nq/vUiD6BBcoUnQVa5uu2VNwu9nDMX478MwLleTxuqbuvZ9j3U ZbE6xBBJ NEYRqwqzi6G7148K889E9AkP9inV3akKnwHlyTOknKwYme21kPXj+9VZmoYBxAioFNYRtgk1rITeZ/8vTg3in4gIlvPZ0ViosLN/mddzfhqPfPVYJ4GcKvPIxFPiNgnfjNuqQ4Dz+TJhqWHhFTrNxZ0xqfk3kZESeXTfGS3k7HCwJg2bqm59SeRMoUUochqhwBa8WMX8TG3oHnx8e00WC3ACl/Bm8wFPJnme8vvU52chNZ5M3ilS0p+SIFleR+f4r8FHkQ5x8hE8Xxg4ysdMxoQ2XsL4lHQjuMv1Y7aH8lSdns8fo8OD31r8Vo8T6PSRnU2Vl8lg+gOYTc12OMdFAyT3Ay1MuVO1CLW6+ 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: Properly document that if __GFP_ZERO logic is requested, callers must ensure that, starting with the initial memory allocation, every subsequent call to this API for the same memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that __GFP_ZERO is not fully honored by this API. Signed-off-by: Danilo Krummrich --- include/linux/slab.h | 8 ++++++++ mm/slab_common.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/linux/slab.h b/include/linux/slab.h index c9cb42203183..26f14c04000a 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -733,6 +733,14 @@ static inline __alloc_size(1, 2) void *kmalloc_array_noprof(size_t n, size_t siz * @new_n: new number of elements to alloc * @new_size: new size of a single member of the array * @flags: the type of memory to allocate (see kmalloc) + * + * If __GFP_ZERO logic is requested, callers must ensure that, starting with the + * initial memory allocation, every subsequent call to this API for the same + * memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that + * __GFP_ZERO is not fully honored by this API. + * + * In any case, the contents of the object pointed to are preserved up to the + * lesser of the new and old sizes. */ static inline __realloc_size(2, 3) void * __must_check krealloc_array_noprof(void *p, size_t new_n, diff --git a/mm/slab_common.c b/mm/slab_common.c index cff602cedf8e..faa13f42b111 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -1301,11 +1301,17 @@ __do_krealloc(const void *p, size_t new_size, gfp_t flags) * @new_size: how many bytes of memory are required. * @flags: the type of memory to allocate. * - * The contents of the object pointed to are preserved up to the - * lesser of the new and old sizes (__GFP_ZERO flag is effectively ignored). * If @p is %NULL, krealloc() behaves exactly like kmalloc(). If @new_size * is 0 and @p is not a %NULL pointer, the object pointed to is freed. * + * If __GFP_ZERO logic is requested, callers must ensure that, starting with the + * initial memory allocation, every subsequent call to this API for the same + * memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that + * __GFP_ZERO is not fully honored by this API. + * + * In any case, the contents of the object pointed to are preserved up to the + * lesser of the new and old sizes. + * * Return: pointer to the allocated memory or %NULL in case of error */ void *krealloc_noprof(const void *p, size_t new_size, gfp_t flags)