From patchwork Fri Feb 10 21:15:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: andrey.konovalov@linux.dev X-Patchwork-Id: 13136454 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 2701BC636D4 for ; Fri, 10 Feb 2023 21:16:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 21C126B0188; Fri, 10 Feb 2023 16:16:16 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 1A3256B018A; Fri, 10 Feb 2023 16:16:16 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 01C616B018B; Fri, 10 Feb 2023 16:16:15 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id E1BE26B0188 for ; Fri, 10 Feb 2023 16:16:15 -0500 (EST) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id A9DAC121218 for ; Fri, 10 Feb 2023 21:16:15 +0000 (UTC) X-FDA: 80452640310.27.76A236B Received: from out-35.mta0.migadu.com (out-35.mta0.migadu.com [91.218.175.35]) by imf17.hostedemail.com (Postfix) with ESMTP id D88EB40011 for ; Fri, 10 Feb 2023 21:16:13 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=NMUMtEuq; spf=pass (imf17.hostedemail.com: domain of andrey.konovalov@linux.dev designates 91.218.175.35 as permitted sender) smtp.mailfrom=andrey.konovalov@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1676063774; 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=b3Y1ZbtnHRjNaHONV9sUdyWjn+clMFk+2c4Skh5NOGM=; b=I7tCIOsKJwmq/x/ovFHwn79uVITyJsDex4vCSTJVplZ7pybg2TDNXHEkRwGH0pZAJM1S0y 4R5p4oWlge0nDlhCeLO3MqiRBhL0nsyu303FX7iPfqP3JOyEqdqKq1W5Zx6dJIEgbntHlG Dt7MirBBTjIaWDY8SDikrjvBRVLvrd4= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=NMUMtEuq; spf=pass (imf17.hostedemail.com: domain of andrey.konovalov@linux.dev designates 91.218.175.35 as permitted sender) smtp.mailfrom=andrey.konovalov@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1676063774; a=rsa-sha256; cv=none; b=Mr8NbLwskJadUdf0Hr/v/V3PnWsCJDuepoCImNav8+09kMkwEpd2zZpPmRlx4cpfHd/jz9 2MUm6vyoNl7UDhbxeKPVruoITIfkRJ07ANqsOIidC9/g23uBdqtesgKN88JkBLF/cn0o4G SUBrL+NgUWq+enfxBiePYxRsJSrU0b0= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1676063772; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=b3Y1ZbtnHRjNaHONV9sUdyWjn+clMFk+2c4Skh5NOGM=; b=NMUMtEuqwG0vlR2vqyaN6nCSOlFMRLLh2rBnX4ez3xSLDuXFeviXMGAoN1X/Gw8TaR2kMk vtoOxPtdDghv1NP+wPb2bGmxgUWe7yTaTqOfl3aWDVxPWgAJOi9o7DnwQMwnwQ9VH1Oy9s +feNTY56vXN778kgFVfIUPPpUMerwac= From: andrey.konovalov@linux.dev To: Marco Elver , Alexander Potapenko Cc: Andrey Konovalov , Vlastimil Babka , kasan-dev@googlegroups.com, Evgenii Stepanov , Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Konovalov Subject: [PATCH v2 05/18] lib/stackdepot: annotate init and early init functions Date: Fri, 10 Feb 2023 22:15:53 +0100 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: D88EB40011 X-Stat-Signature: dcgbymnropekrpedq1h6tqqi8ezrtgxr X-Rspam-User: X-HE-Tag: 1676063773-997221 X-HE-Meta: U2FsdGVkX18Xf71INR+qpDOwB97kKEtFTnWPyT0yBFOz7nzCRBtmWjkq4/rEsKI11p3qxWkIPUrEn+dbwZOEgMhn1JyVPmwwcChJ/q2daDVkwDMSQcAayiwF4tQa4DPD9Z6Ad+UrSINeIB/06KD7i0MOm8miaesndTRKRN1xiSaIqcRgGp2OPBgnNNwqHp+jpwyJAbPTzozxpEQ0h6rzgELwwKdksyV5XtG0IDlRFGEowyLQk6qatPO3qNHh+yTmUp4iZC+bWs/ADCABkL2xUZeTl6oXi3VhWcdh9Ltk4cV1MGnfkHNkraESyWNQjZpMu+qk54bxVUS7dz1WujKfCOJeVUDJ6mUB77BMDaPttcJpJLaGy3kTe3DKLgWG67Ctnss850D4oSunmWTim3zXYvbpD0vZX52swZXxDc5Opke92xUwmvN07VkvpGS61v0Du5GhPomprLmrOZD0xPBjUwTeXbQ3EDdXp1kEnkmxjvVP5q8rQD6uZR0zzY+Fd1UfTjaFAlmirEqFxgIMJPq6D2SauJNk5R4MSOoShuENmHPQNn0so9XzXwCmUqNShUyM9RjDQ7em71YmgixlWwCvyWl0nu/GOEOcc4Ja6Q1ZZDjGgG4Aud6wwH4vf5JgVTQd3xP/PrZ2Zlkp2bZnAEf30BCgrGboHLw7o4x3GPop6WcJYDnEK//zv+UoY7GxfmuCX1QbLvzkdRUr6Flvd00EVfsVq2NRTG3d7RLKYvlFVkJFi+BzLEoc9HaOv2OKSW87SaooZywmflK6XrrzRTDdgUIMaSK60lr3OkNeQ9Rok6K2j4nlxyhb9ul9FkxlnVg6tAHBKMJqKRWbsz7FpDFe7lg+taoBo38JFmtoFFuv3gpCQVj7yg6veGlB3htDdvq8yliJWnA4WDLSw0JH3VvtsudokCHrU7N1fSQ/k9EZXMCpoIObJ8/y8ABhgCUHCZmQJx7zzWwCYNyHAwUtfJs q7qibGSu UW0SsEspY6FFy8HdeHNCSTclzl+scG+AsfMQCFcgpF020Bo3w+avb4I0ZXME3D7S8QaQjf4jI/iSqsnWrHZob//NTVPJJtKqs/g9A 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: From: Andrey Konovalov Add comments to stack_depot_early_init and stack_depot_init to explain certain parts of their implementation. Also add a pr_info message to stack_depot_early_init similar to the one in stack_depot_init. Also move the scale variable in stack_depot_init to the scope where it is being used. Reviewed-by: Alexander Potapenko Signed-off-by: Andrey Konovalov --- lib/stackdepot.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/stackdepot.c b/lib/stackdepot.c index 202e07c4f02d..9fab711e4826 100644 --- a/lib/stackdepot.c +++ b/lib/stackdepot.c @@ -115,24 +115,34 @@ void __init stack_depot_request_early_init(void) __stack_depot_early_init_requested = true; } +/* Allocates a hash table via memblock. Can only be used during early boot. */ int __init stack_depot_early_init(void) { unsigned long entries = 0; - /* This is supposed to be called only once, from mm_init() */ + /* This function must be called only once, from mm_init(). */ if (WARN_ON(__stack_depot_early_init_passed)) return 0; - __stack_depot_early_init_passed = true; + /* + * If KASAN is enabled, use the maximum order: KASAN is frequently used + * in fuzzing scenarios, which leads to a large number of different + * stack traces being stored in stack depot. + */ if (kasan_enabled() && !stack_hash_order) stack_hash_order = STACK_HASH_ORDER_MAX; if (!__stack_depot_early_init_requested || stack_depot_disabled) return 0; + /* + * If stack_hash_order is not set, leave entries as 0 to rely on the + * automatic calculations performed by alloc_large_system_hash. + */ if (stack_hash_order) - entries = 1UL << stack_hash_order; + entries = 1UL << stack_hash_order; + pr_info("allocating hash table via alloc_large_system_hash\n"); stack_table = alloc_large_system_hash("stackdepot", sizeof(struct stack_record *), entries, @@ -142,7 +152,6 @@ int __init stack_depot_early_init(void) &stack_hash_mask, 1UL << STACK_HASH_ORDER_MIN, 1UL << STACK_HASH_ORDER_MAX); - if (!stack_table) { pr_err("hash table allocation failed, disabling\n"); stack_depot_disabled = true; @@ -152,6 +161,7 @@ int __init stack_depot_early_init(void) return 0; } +/* Allocates a hash table via kvcalloc. Can be used after boot. */ int stack_depot_init(void) { static DEFINE_MUTEX(stack_depot_init_mutex); @@ -160,11 +170,16 @@ int stack_depot_init(void) mutex_lock(&stack_depot_init_mutex); if (!stack_depot_disabled && !stack_table) { unsigned long entries; - int scale = STACK_HASH_SCALE; + /* + * Similarly to stack_depot_early_init, use stack_hash_order + * if assigned, and rely on automatic scaling otherwise. + */ if (stack_hash_order) { entries = 1UL << stack_hash_order; } else { + int scale = STACK_HASH_SCALE; + entries = nr_free_buffer_pages(); entries = roundup_pow_of_two(entries); @@ -179,7 +194,7 @@ int stack_depot_init(void) if (entries > 1UL << STACK_HASH_ORDER_MAX) entries = 1UL << STACK_HASH_ORDER_MAX; - pr_info("allocating hash table of %lu entries with kvcalloc\n", + pr_info("allocating hash table of %lu entries via kvcalloc\n", entries); stack_table = kvcalloc(entries, sizeof(struct stack_record *), GFP_KERNEL); if (!stack_table) {