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 B0A3DC54E71 for ; Wed, 21 May 2025 16:06:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 348BB6B008A; Wed, 21 May 2025 12:06:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 31FE46B008C; Wed, 21 May 2025 12:06:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 235E66B0092; Wed, 21 May 2025 12:06:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 0415A6B008A for ; Wed, 21 May 2025 12:06:08 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 7559DE446E for ; Wed, 21 May 2025 16:06:08 +0000 (UTC) X-FDA: 83467391616.30.2B79E8D Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by imf26.hostedemail.com (Postfix) with ESMTP id CBD38140013 for ; Wed, 21 May 2025 16:06:06 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=fyx1zKSx; spf=pass (imf26.hostedemail.com: domain of 37fktaAYKCOAUWTGPDIQQING.EQONKPWZ-OOMXCEM.QTI@flex--surenb.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=37fktaAYKCOAUWTGPDIQQING.EQONKPWZ-OOMXCEM.QTI@flex--surenb.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747843566; 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:in-reply-to: references:dkim-signature; bh=Ql9Z9xm5K7XH9O9hnF7qelsAjP39T8fR3nTvKKw0nvo=; b=xSr2Rcrky72CgH5EVOEcoiCmXNw1ZP+RANTSRXX2rfdwhjN9fqsDHuBWwsdQCzi6UVMYf0 Zi/9nGKssMotaR/G/9dzhItXvdfbQjq6qOQlrU3uOP3qNqw8u3h8zXX5nWUpKG5TyNbeUg LRBu9pnkPbVYty1BvhSg8PKOLdaCF3M= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747843566; a=rsa-sha256; cv=none; b=SMXfVAifSxQcYRWrmo4UAlNg92UHep3ncrG0muSP6dTh6YdsbaPyuOBN3DYPPqwh3HyLOo j4aTY6s7euM+VrACbNVqBTOS2vCsEG16VoxIqnKjvFV40fmPuitW/1dFMheObJF9q+AQyR GvpdM5Z9Y1CoBM1w/f2dDP5gTpI6BBM= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=fyx1zKSx; spf=pass (imf26.hostedemail.com: domain of 37fktaAYKCOAUWTGPDIQQING.EQONKPWZ-OOMXCEM.QTI@flex--surenb.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=37fktaAYKCOAUWTGPDIQQING.EQONKPWZ-OOMXCEM.QTI@flex--surenb.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b26e0fee459so4489145a12.1 for ; Wed, 21 May 2025 09:06:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747843565; x=1748448365; darn=kvack.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=Ql9Z9xm5K7XH9O9hnF7qelsAjP39T8fR3nTvKKw0nvo=; b=fyx1zKSxQSi0/AgSJ62XegvsQjcYbCGJvsXOPR6g+I2dYSUT1r8k9GCtWSO4pqNCdr Dcsmf86uWghdKCrpjUMCnnmHQqemCNiCphZvf9elCgdvMLVDoRq0ZQ6QWdlvipWfrmks lAvS9FCEOpyn50HEcVl3dj/bMYIiiuuvCzbG0fw1UiCvw8WpcI5rwJ0Sah0V/TRNk6qV KDchszm5ADeJNYtqLPR1NBxjClsX/19n5CdEILtMKVqxm/tcOocBLgdlMsWgDwJxzSId hmWmeh9FUInvg6l8vY2y76ee+rTzoXhxoBEp12PacXPQkyFOxNixeWDICjBVy4+omSfS n19g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747843565; x=1748448365; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=Ql9Z9xm5K7XH9O9hnF7qelsAjP39T8fR3nTvKKw0nvo=; b=tld2qAVR/Rg5cNX+c//UP7QXDMN5Q+oFXldWYtx4TiOz1/VlwIVy1h19SF6a/9eONY 4jLKQj2Ei91fWRnyFkmbx4dUBZ5HrAAt5YnmGkH16Yjgt7e7Xuf4xqAtYWpPJYyrAQID XKF7/VsuX4lc9mpwOq6VDDLk1Eu0GjRkBJJUV7Ts2TOETlAa7HZ508WWa9kd99T72ADK O9CVtEZ3wNq2jAbRrjaDdr8Amm1D0dkl/uiFVa0LALn92N8l9ekNR3txbaCM5z+/wwJV iTElOMhz0f5lD4JTmE+jrst1/+W0zECu7Iox2Ez65vYXyZKD+khMti/+WSj6dDgYJLoT sSeg== X-Forwarded-Encrypted: i=1; AJvYcCVM9/W38akfGgEIY2RZJxZFtakakjuX79EaawCFPAl6NTD5+UZenHVpLJygu752q5pxiIiwZPSIeA==@kvack.org X-Gm-Message-State: AOJu0Yxf5n9Dm3YULLXpYXSR16FfHD8wrPRWUrUJWUz3A5lFDxxfJw4B Re0Bc8W/VxgPBQU+EZ8gB4poQ4rcomMdj24UeWqzqbjs59w97YVmj1/s+eZRQ5lreYu7n8Zcld+ B8johvQ== X-Google-Smtp-Source: AGHT+IFNeaIVQ685CZL/ir/FqHiM6qg4cufw1xi0AGG2BDj+FgfngqEqs+kjHu3RZknxYhNp6O6Iptv6chk= X-Received: from plke8.prod.google.com ([2002:a17:903:1948:b0:232:afa:7ca1]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce91:b0:232:219c:2a4f with SMTP id d9443c01a7336-232219c2f99mr194334555ad.1.1747843565544; Wed, 21 May 2025 09:06:05 -0700 (PDT) Date: Wed, 21 May 2025 09:06:02 -0700 Mime-Version: 1.0 X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250521160602.1940771-1-surenb@google.com> Subject: [PATCH 1/1] alloc_tag: handle module codetag load errors as module load failures From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: kent.overstreet@linux.dev, mcgrof@kernel.org, petr.pavlu@suse.com, samitolvanen@google.com, da.gomez@samsung.com, 00107082@163.com, cachen@purestorage.com, linux-kernel@vger.kernel.org, linux-modules@vger.kernel.org, linux-mm@kvack.org, stable@vger.kernel.org, surenb@google.com Content-Type: text/plain; charset="UTF-8" X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: CBD38140013 X-Stat-Signature: znx6j4gqum95y41zre6oww6dhtwdrfh6 X-Rspam-User: X-HE-Tag: 1747843566-36123 X-HE-Meta: U2FsdGVkX199VcX5os3uzuJdSf0CZsWXiXKiYo/R2xW0xGvCGzQK5BdAQRr0NKRWR/Sm3zEnjtxm8qtzOoQQ0QDjc2JaIFpkAu9a/YGBwEUIDJ3t2ZU2s3PwJQjT+H0Xy49twCMKC5aaX5vdqAAEn0OPmdNyxt2rfrVb2xsXVtaOXonPu+WbMt5ZVKqtLA68+dNmy6ClJTqV5spQMAvC12Go1ERPUyLm05kzdgOigXrMWkP7oAg7uv+Hqp+d5vAvIjuyIe+g8jYyCftha1t5LYdWxHFD0Bhh2DTtYdP4ktfS5AkqOfIi+ixvEA7R2Gbm0ZajiErOREhgGZeyXyuoZqonz4ouZZbHL1O4RqLGdDcIbIzSqeYF0NOMlrV7nZsXtgqqhnM9q6cKbFy5hUpEc41K8tVjvqLmyBIxBT9A5AvqmL/dtpqa8NXsQUOcXezhOFI6Z3Xp7a9Aeek1J6qvebEHkBN3kUvv7CJETGeTo23XXHLFMWMuSbCCYWqU4kU1d+aVLpd+SYZIKb0GtYcs7vNh4D58lLuvAbdNK4kV29Ay0MLMwNkhgKoDAGHL5niapRTMr/CmDUmzETJ/oVVXcl5664sNkwyIrgwASP0SEy3E2sUTfKlS1LBEB2Ck+NZPXmiAtK9DqVo8dkG4pVym+sQDExiVGdi7f5wfVW1YlEbXC8F+KpIXZLE3Dvh38L+xZfTaivTuOA7qIu5RlEOrO0+1qRZKyQZ0WwVvItysWjVzzCxSVmPUq1LbtrAQJpNpvowCLSfuxwpxXHH/3FH5vFzjBSRTat/psZm2FoXq5vZjgxFn1/AmhxcZ8Ljk9f2I8GLEMqNECTsscAM++QHKYa2JCt5Df+rfSaTFlV5v2RLAcviiR25ojFzEV987TMULtBT/WGDDAEhjOMV8q4CN6bM7phoVPDqF1SVTk+Txys3lsi9Ohky7vT1HwQxkrsKLnpPB0qxc1aFoE1zT084 wapAzbN9 5bPBndhiG88Bkcd4Hbj2uGNoWO5L/C8Kyu/w8PJI+TwECBvIDUzKissjkYJ5L4671C9LPgkpYb0kLubj9WZ3ZbyWqEQJOayU0DmItQMsNCmlGnfSULyIBvfB2MxvBiN6gFltdHBAOp+mI+8G+kulkjP5fyiD/8i3sTyO/bsHaEobEoY7g7JXLsXoAAIeRiK5cBY88csI+0YjHL0QqKV7FJTkwSOe/lUOGmdFXG+SQqgI+ZP5xPImSIoG80vibuebK2YStVAxo0V2gllbcCZNedptK/YBSIFV+IrXFHdb5Ww7QtVhT0zyLucqZ9Q== 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: Failures inside codetag_load_module() are currently ignored. As a result an error there would not cause a module load failure and freeing of the associated resources. Correct this behavior by propagating the error code to the caller and handling possible errors. With this change, error to allocate percpu counters, which happens at this stage, will not be ignored and will cause a module load failure and freeing of resources. With this change we also do not need to disable memory allocation profiling when this error happens, instead we fail to load the module. Fixes: 10075262888b ("alloc_tag: allocate percpu counters for module tags dynamically") Reported-by: Casey Chen Closes: https://lore.kernel.org/all/20250520231620.15259-1-cachen@purestorage.com/ Signed-off-by: Suren Baghdasaryan Cc: stable@vger.kernel.org --- include/linux/codetag.h | 8 ++++---- kernel/module/main.c | 5 +++-- lib/alloc_tag.c | 12 +++++++----- lib/codetag.c | 34 +++++++++++++++++++++++++--------- 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/include/linux/codetag.h b/include/linux/codetag.h index 0ee4c21c6dbc..5f2b9a1f722c 100644 --- a/include/linux/codetag.h +++ b/include/linux/codetag.h @@ -36,8 +36,8 @@ union codetag_ref { struct codetag_type_desc { const char *section; size_t tag_size; - void (*module_load)(struct module *mod, - struct codetag *start, struct codetag *end); + int (*module_load)(struct module *mod, + struct codetag *start, struct codetag *end); void (*module_unload)(struct module *mod, struct codetag *start, struct codetag *end); #ifdef CONFIG_MODULES @@ -89,7 +89,7 @@ void *codetag_alloc_module_section(struct module *mod, const char *name, unsigned long align); void codetag_free_module_sections(struct module *mod); void codetag_module_replaced(struct module *mod, struct module *new_mod); -void codetag_load_module(struct module *mod); +int codetag_load_module(struct module *mod); void codetag_unload_module(struct module *mod); #else /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */ @@ -103,7 +103,7 @@ codetag_alloc_module_section(struct module *mod, const char *name, unsigned long align) { return NULL; } static inline void codetag_free_module_sections(struct module *mod) {} static inline void codetag_module_replaced(struct module *mod, struct module *new_mod) {} -static inline void codetag_load_module(struct module *mod) {} +static inline int codetag_load_module(struct module *mod) { return 0; } static inline void codetag_unload_module(struct module *mod) {} #endif /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */ diff --git a/kernel/module/main.c b/kernel/module/main.c index 5c6ab20240a6..9861c2ac5fd5 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -3399,11 +3399,12 @@ static int load_module(struct load_info *info, const char __user *uargs, goto sysfs_cleanup; } + if (codetag_load_module(mod)) + goto sysfs_cleanup; + /* Get rid of temporary copy. */ free_copy(info, flags); - codetag_load_module(mod); - /* Done! */ trace_module_load(mod); diff --git a/lib/alloc_tag.c b/lib/alloc_tag.c index 45dae7da70e1..d48b80f3f007 100644 --- a/lib/alloc_tag.c +++ b/lib/alloc_tag.c @@ -607,15 +607,16 @@ static void release_module_tags(struct module *mod, bool used) mas_unlock(&mas); } -static void load_module(struct module *mod, struct codetag *start, struct codetag *stop) +static int load_module(struct module *mod, struct codetag *start, struct codetag *stop) { /* Allocate module alloc_tag percpu counters */ struct alloc_tag *start_tag; struct alloc_tag *stop_tag; struct alloc_tag *tag; + /* percpu counters for core allocations are already statically allocated */ if (!mod) - return; + return 0; start_tag = ct_to_alloc_tag(start); stop_tag = ct_to_alloc_tag(stop); @@ -627,12 +628,13 @@ static void load_module(struct module *mod, struct codetag *start, struct codeta free_percpu(tag->counters); tag->counters = NULL; } - shutdown_mem_profiling(true); - pr_err("Failed to allocate memory for allocation tag percpu counters in the module %s. Memory allocation profiling is disabled!\n", + pr_err("Failed to allocate memory for allocation tag percpu counters in the module %s\n", mod->name); - break; + return -ENOMEM; } } + + return 0; } static void replace_module(struct module *mod, struct module *new_mod) diff --git a/lib/codetag.c b/lib/codetag.c index de332e98d6f5..650d54d7e14d 100644 --- a/lib/codetag.c +++ b/lib/codetag.c @@ -167,6 +167,7 @@ static int codetag_module_init(struct codetag_type *cttype, struct module *mod) { struct codetag_range range; struct codetag_module *cmod; + int mod_id; int err; range = get_section_range(mod, cttype->desc.section); @@ -190,11 +191,20 @@ static int codetag_module_init(struct codetag_type *cttype, struct module *mod) cmod->range = range; down_write(&cttype->mod_lock); - err = idr_alloc(&cttype->mod_idr, cmod, 0, 0, GFP_KERNEL); - if (err >= 0) { - cttype->count += range_size(cttype, &range); - if (cttype->desc.module_load) - cttype->desc.module_load(mod, range.start, range.stop); + mod_id = idr_alloc(&cttype->mod_idr, cmod, 0, 0, GFP_KERNEL); + if (mod_id >= 0) { + if (cttype->desc.module_load) { + err = cttype->desc.module_load(mod, range.start, range.stop); + if (!err) + cttype->count += range_size(cttype, &range); + else + idr_remove(&cttype->mod_idr, mod_id); + } else { + cttype->count += range_size(cttype, &range); + err = 0; + } + } else { + err = mod_id; } up_write(&cttype->mod_lock); @@ -295,17 +305,23 @@ void codetag_module_replaced(struct module *mod, struct module *new_mod) mutex_unlock(&codetag_lock); } -void codetag_load_module(struct module *mod) +int codetag_load_module(struct module *mod) { struct codetag_type *cttype; + int ret = 0; if (!mod) - return; + return 0; mutex_lock(&codetag_lock); - list_for_each_entry(cttype, &codetag_types, link) - codetag_module_init(cttype, mod); + list_for_each_entry(cttype, &codetag_types, link) { + ret = codetag_module_init(cttype, mod); + if (ret) + break; + } mutex_unlock(&codetag_lock); + + return ret; } void codetag_unload_module(struct module *mod) base-commit: 9f3e87f6c8d4b28b96eb8bddb22d3ba4b846e10b -- 2.49.0.1112.g889b7c5bd8-goog