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 76DDEC433FE for ; Mon, 7 Mar 2022 07:45:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BF8168D0001; Mon, 7 Mar 2022 02:45:31 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id BA8818D0005; Mon, 7 Mar 2022 02:45:31 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9D6278D0001; Mon, 7 Mar 2022 02:45:31 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0034.hostedemail.com [216.40.44.34]) by kanga.kvack.org (Postfix) with ESMTP id 7AC678D0001 for ; Mon, 7 Mar 2022 02:45:31 -0500 (EST) Received: from smtpin22.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 3159BA8336 for ; Mon, 7 Mar 2022 07:45:31 +0000 (UTC) X-FDA: 79216805262.22.D69439D Received: from out30-42.freemail.mail.aliyun.com (out30-42.freemail.mail.aliyun.com [115.124.30.42]) by imf21.hostedemail.com (Postfix) with ESMTP id 1527B1C000B for ; Mon, 7 Mar 2022 07:45:29 +0000 (UTC) X-Alimail-AntiSpam:AC=PASS;BC=-1|-1;BR=01201311R811e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04395;MF=dtcccc@linux.alibaba.com;NM=1;PH=DS;RN=7;SR=0;TI=SMTPD_---0V6SREei_1646639125; Received: from localhost.localdomain(mailfrom:dtcccc@linux.alibaba.com fp:SMTPD_---0V6SREei_1646639125) by smtp.aliyun-inc.com(127.0.0.1); Mon, 07 Mar 2022 15:45:26 +0800 From: Tianchen Ding To: Alexander Potapenko , Marco Elver , Dmitry Vyukov , Andrew Morton Cc: kasan-dev@googlegroups.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/2] kfence: Allow re-enabling KFENCE after system startup Date: Mon, 7 Mar 2022 15:45:15 +0800 Message-Id: <20220307074516.6920-2-dtcccc@linux.alibaba.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220307074516.6920-1-dtcccc@linux.alibaba.com> References: <20220307074516.6920-1-dtcccc@linux.alibaba.com> MIME-Version: 1.0 X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 1527B1C000B X-Stat-Signature: tqixj88tbsaq5ahg3uhio4tg6kam5nqo Authentication-Results: imf21.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=alibaba.com; spf=pass (imf21.hostedemail.com: domain of dtcccc@linux.alibaba.com designates 115.124.30.42 as permitted sender) smtp.mailfrom=dtcccc@linux.alibaba.com X-Rspam-User: X-HE-Tag: 1646639129-930132 Content-Transfer-Encoding: quoted-printable 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: If once KFENCE is disabled by: echo 0 > /sys/module/kfence/parameters/sample_interval KFENCE could never be re-enabled until next rebooting. Allow re-enabling it by writing a positive num to sample_interval. Signed-off-by: Tianchen Ding --- mm/kfence/core.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/mm/kfence/core.c b/mm/kfence/core.c index 13128fa13062..caa4e84c8b79 100644 --- a/mm/kfence/core.c +++ b/mm/kfence/core.c @@ -38,14 +38,17 @@ #define KFENCE_WARN_ON(cond) = \ ({ = \ const bool __cond =3D WARN_ON(cond); \ - if (unlikely(__cond)) \ + if (unlikely(__cond)) { \ WRITE_ONCE(kfence_enabled, false); \ + disabled_by_warn =3D true; \ + } \ __cond; \ }) =20 /* =3D=3D=3D Data =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D */ =20 static bool kfence_enabled __read_mostly; +static bool disabled_by_warn __read_mostly; =20 unsigned long kfence_sample_interval __read_mostly =3D CONFIG_KFENCE_SAM= PLE_INTERVAL; EXPORT_SYMBOL_GPL(kfence_sample_interval); /* Export for test modules. *= / @@ -55,6 +58,7 @@ EXPORT_SYMBOL_GPL(kfence_sample_interval); /* Export fo= r test modules. */ #endif #define MODULE_PARAM_PREFIX "kfence." =20 +static int kfence_enable_late(void); static int param_set_sample_interval(const char *val, const struct kerne= l_param *kp) { unsigned long num; @@ -65,10 +69,11 @@ static int param_set_sample_interval(const char *val,= const struct kernel_param =20 if (!num) /* Using 0 to indicate KFENCE is disabled. */ WRITE_ONCE(kfence_enabled, false); - else if (!READ_ONCE(kfence_enabled) && system_state !=3D SYSTEM_BOOTING= ) - return -EINVAL; /* Cannot (re-)enable KFENCE on-the-fly. */ =20 *((unsigned long *)kp->arg) =3D num; + + if (num && !READ_ONCE(kfence_enabled) && system_state !=3D SYSTEM_BOOTI= NG) + return disabled_by_warn ? -EINVAL : kfence_enable_late(); return 0; } =20 @@ -787,6 +792,16 @@ void __init kfence_init(void) (void *)(__kfence_pool + KFENCE_POOL_SIZE)); } =20 +static int kfence_enable_late(void) +{ + if (!__kfence_pool) + return -EINVAL; + + WRITE_ONCE(kfence_enabled, true); + queue_delayed_work(system_unbound_wq, &kfence_timer, 0); + return 0; +} + void kfence_shutdown_cache(struct kmem_cache *s) { unsigned long flags; --=20 2.27.0