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 D6610C433EF for ; Mon, 13 Jun 2022 15:29:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4244E8D019E; Mon, 13 Jun 2022 11:29:38 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3AC558D0171; Mon, 13 Jun 2022 11:29:38 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1D7FA8D019E; Mon, 13 Jun 2022 11:29:38 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 077978D0171 for ; Mon, 13 Jun 2022 11:29:38 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay12.hostedemail.com (Postfix) with ESMTP id C2D38120A31 for ; Mon, 13 Jun 2022 15:29:37 +0000 (UTC) X-FDA: 79573597194.05.D8DC246 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by imf30.hostedemail.com (Postfix) with ESMTP id A732B80085 for ; Mon, 13 Jun 2022 15:29:36 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 32EEA21C02; Mon, 13 Jun 2022 15:29:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1655134175; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HG2c7QRA7LmjvXQgNVMoQal5GEXXI7tkfFKUpqSd2z8=; b=czyA+tBfBCwTJOMp7LQ71/HM3bzoVcVGJuRd65H5Q8g2oHOrEdfz3xqt+xGxBxaS0mJ4g1 mb3AQdYg+cRAU7bu85jvxmr8WpRTLLPfQfxpYZYbd+naKCQJoozlM6I5bx33+Ah0SIxaAb DHxDCgO8HZACpkt4vrHlc8lznWh7n3k= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1655134175; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HG2c7QRA7LmjvXQgNVMoQal5GEXXI7tkfFKUpqSd2z8=; b=Xr5Lc72c5+loPOl6f2E61jBpyyFSZpsF2oW6juvDPVZZImNYsSYTIVJTBvb36HN/bq0FOL T6gksCq6OMBEk4DA== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 078A813443; Mon, 13 Jun 2022 15:29:35 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id KeE6Ad9Xp2KmWwAAMHmgww (envelope-from ); Mon, 13 Jun 2022 15:29:35 +0000 Message-ID: <933b1ca6-6ae8-c932-f751-f2feb74c19ea@suse.cz> Date: Mon, 13 Jun 2022 17:29:34 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH] mm/slub: Move the stackdepot related allocation out of IRQ-off section. Content-Language: en-US To: Sebastian Andrzej Siewior , linux-mm@kvack.org Cc: Andrew Morton , Christoph Lameter , David Rientjes , Hyeonggon Yoo <42.hyeyoo@gmail.com>, Joonsoo Kim , Oliver Glitta , Pekka Enberg , Roman Gushchin , Thomas Gleixner References: From: Vlastimil Babka In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1655134177; a=rsa-sha256; cv=none; b=UTb2FWnZ7MEdZHYZHLuoOq4/61ed6GWHt/vvoKtWYv/XPy8E/pmj8h4HJb8fPeswMvRurr 0v5jdVPEkOht2nTJ7EYf30Fww8N5zYNiZnaSVbC83ECgCahJ5awCJoEIOXiaCqaP/kFTLQ 3RSXMBey3mZUATf7Hc78OErbQu21NW4= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=czyA+tBf; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=Xr5Lc72c; dmarc=none; spf=pass (imf30.hostedemail.com: domain of vbabka@suse.cz designates 195.135.220.28 as permitted sender) smtp.mailfrom=vbabka@suse.cz ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1655134177; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=HG2c7QRA7LmjvXQgNVMoQal5GEXXI7tkfFKUpqSd2z8=; b=mkpqzBVeSugxpKYToulR75v4JiLSdNR5eY9vcXjEu4g8bL4wq3zvqVvy30WiTT0FqYrlj6 IDxiY/Bfm47QqUQHnENs5l711Xz6xcgMtg8D6pRtIeQRk9BYq13fU3rScH9ZdI4zL/kYza EiiGXmCt4USjwe0VdXGwz62AsK2XYDk= X-Rspamd-Queue-Id: A732B80085 X-Rspam-User: Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=czyA+tBf; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=Xr5Lc72c; dmarc=none; spf=pass (imf30.hostedemail.com: domain of vbabka@suse.cz designates 195.135.220.28 as permitted sender) smtp.mailfrom=vbabka@suse.cz X-Rspamd-Server: rspam06 X-Stat-Signature: 1urobckh1phexjia7qzqzjajx4g59ceu X-HE-Tag: 1655134176-728605 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: On 6/7/22 17:20, Sebastian Andrzej Siewior wrote: > The set_track() invocation in free_debug_processing() is invoked with > acquired slab_lock(). The lock disables interrupts on PREEMPT_RT and > this forbids to allocate memory which is done in stack_depot_save(). > > Split set_track() into two parts: set_track_prepare() which allocate > memory and set_track_update() which only performs the assignment of the > trace data structure. Use set_track_prepare() before disabling > interrupts. > > Fixes: 5cf909c553e9e ("mm/slub: use stackdepot to save stack trace in objects") > Signed-off-by: Sebastian Andrzej Siewior Thanks! What about calling set_track_update() from set_track() so the assignments are not duplicated, like this? ----8<---- >From c3fbd9cb11043c69f1073f438edd40d267f46cef Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 7 Jun 2022 17:20:10 +0200 Subject: [PATCH] mm/slub: Move the stackdepot related allocation out of IRQ-off section. The set_track() invocation in free_debug_processing() is invoked with acquired slab_lock(). The lock disables interrupts on PREEMPT_RT and this forbids to allocate memory which is done in stack_depot_save(). Split set_track() into two parts: set_track_prepare() which allocate memory and set_track_update() which only performs the assignment of the trace data structure. Use set_track_prepare() before disabling interrupts. [ vbabka@suse.cz: make set_track() call set_track_update() instead of open-coded assignments ] Fixes: 5cf909c553e9e ("mm/slub: use stackdepot to save stack trace in objects") Signed-off-by: Sebastian Andrzej Siewior Reviewed-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Signed-off-by: Vlastimil Babka Link: https://lore.kernel.org/r/Yp9sqoUi4fVa5ExF@linutronix.de --- mm/slub.c | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/mm/slub.c b/mm/slub.c index e5535020e0fd..f3b1e19b81f2 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -726,25 +726,48 @@ static struct track *get_track(struct kmem_cache *s, void *object, return kasan_reset_tag(p + alloc); } -static void noinline set_track(struct kmem_cache *s, void *object, - enum track_item alloc, unsigned long addr) -{ - struct track *p = get_track(s, object, alloc); - #ifdef CONFIG_STACKDEPOT +static noinline depot_stack_handle_t set_track_prepare(void) +{ + depot_stack_handle_t handle; unsigned long entries[TRACK_ADDRS_COUNT]; unsigned int nr_entries; nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 3); - p->handle = stack_depot_save(entries, nr_entries, GFP_NOWAIT); + handle = stack_depot_save(entries, nr_entries, GFP_NOWAIT); + + return handle; +} +#else +static inline depot_stack_handle_t set_track_prepare(void) +{ + return 0; +} #endif +static void set_track_update(struct kmem_cache *s, void *object, + enum track_item alloc, unsigned long addr, + depot_stack_handle_t handle) +{ + struct track *p = get_track(s, object, alloc); + +#ifdef CONFIG_STACKDEPOT + p->handle = handle; +#endif p->addr = addr; p->cpu = smp_processor_id(); p->pid = current->pid; p->when = jiffies; } +static __always_inline void set_track(struct kmem_cache *s, void *object, + enum track_item alloc, unsigned long addr) +{ + depot_stack_handle_t handle = set_track_prepare(); + + set_track_update(s, object, alloc, addr, handle); +} + static void init_tracking(struct kmem_cache *s, void *object) { struct track *p; @@ -1373,6 +1396,10 @@ static noinline int free_debug_processing( int cnt = 0; unsigned long flags, flags2; int ret = 0; + depot_stack_handle_t handle = 0; + + if (s->flags & SLAB_STORE_USER) + handle = set_track_prepare(); spin_lock_irqsave(&n->list_lock, flags); slab_lock(slab, &flags2); @@ -1391,7 +1418,7 @@ static noinline int free_debug_processing( } if (s->flags & SLAB_STORE_USER) - set_track(s, object, TRACK_FREE, addr); + set_track_update(s, object, TRACK_FREE, addr, handle); trace(s, slab, object, 0); /* Freepointer not overwritten by init_object(), SLAB_POISON moved it */ init_object(s, object, SLUB_RED_INACTIVE); -- 2.36.1