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 3C267C83F1A for ; Fri, 11 Jul 2025 07:26:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3A0C86B0099; Fri, 11 Jul 2025 03:26:53 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 378EC6B009B; Fri, 11 Jul 2025 03:26:53 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B59A6B009D; Fri, 11 Jul 2025 03:26:53 -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 1D2856B0099 for ; Fri, 11 Jul 2025 03:26:53 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id AF4AA1126E5 for ; Fri, 11 Jul 2025 07:26:52 +0000 (UTC) X-FDA: 83651151864.14.20945DC Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by imf06.hostedemail.com (Postfix) with ESMTP id DB64D180010 for ; Fri, 11 Jul 2025 07:26:50 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=linutronix.de header.s=2020 header.b=1NeBlvT0; dkim=pass header.d=linutronix.de header.s=2020e header.b="4A/h/3Vv"; spf=pass (imf06.hostedemail.com: domain of bigeasy@linutronix.de designates 193.142.43.55 as permitted sender) smtp.mailfrom=bigeasy@linutronix.de; dmarc=pass (policy=none) header.from=linutronix.de ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752218811; 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=axeX5rHO1v0WWqEDd6CO74/uGVzY0aLrSXsg3JOknM0=; b=AQJsZ37ipXteHYX4EMb/1upGbtNOCaQd2IIVgZpgMDqjI4Y+yuRSew+202RM+7v9uRu0Ns +VOX1kWWdHCruAuS1Qw30k083GJOy8Wsp8y/SztZqW/kOkB++28Hc3GrbhUF6xBJS0kUX5 Cb9pOmwWoIAAQiZXJ8HGNlOL1mlpZ5o= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=linutronix.de header.s=2020 header.b=1NeBlvT0; dkim=pass header.d=linutronix.de header.s=2020e header.b="4A/h/3Vv"; spf=pass (imf06.hostedemail.com: domain of bigeasy@linutronix.de designates 193.142.43.55 as permitted sender) smtp.mailfrom=bigeasy@linutronix.de; dmarc=pass (policy=none) header.from=linutronix.de ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752218811; a=rsa-sha256; cv=none; b=eIbds6U8RlsxYXE5Mh626vY4rLe4KFZISdYEy6MlEiZNraTDuqD2M6SZdNWgSMBRbzjTQ0 Rpx9AO7VftFDA5JCJ/mw/vEHZO+va+oYZgRtiEsWKqkEIYzk0LsreWO4Ua7ESAy0Q0Edhd PSPXSd9IjUN+8NywSBYWnR7zKoi2M+w= Date: Fri, 11 Jul 2025 09:26:46 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1752218808; h=from:from: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; bh=axeX5rHO1v0WWqEDd6CO74/uGVzY0aLrSXsg3JOknM0=; b=1NeBlvT0YAe2FfUy5X9oDNf5b5P/VQ0NHEDFJabjBiaz1SNrlMfbSAVPMnZ5wBYtpd3RZB 6WoDT04hBsUUO7RrmmqaGFdMN5Z7PuNIXQMJdpgkW3ROMOK39MCmKJ4IewS7z4IUK8ifp1 FyN54r0m4dv6Y2FSTOpGE/J/JM3kz/A/GkHXAPraCk2l5+gVK4AqBH8zKWnCPNMI/tGjbU dYO3zik9dj5XNVa0zGiCaJQi1pk3bMUiHNTgjQk6RTST3LTX5Ia2S4dcOVLhwOiF9l71FE ArUkg5YKwmB44rIkpgR74qeWWe9D7MNzepxMUPSEx/CihSOiK36a9kyFG5WcEA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1752218808; h=from:from: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; bh=axeX5rHO1v0WWqEDd6CO74/uGVzY0aLrSXsg3JOknM0=; b=4A/h/3VvwkL2xRLm7rvrL8ASszAgLTOmPtgtI6lnWZDILs7nIdn2zKhDIbbdWppbLwhCGM XovhIKR+69S0+KBQ== From: Sebastian Andrzej Siewior To: Alexei Starovoitov Cc: bpf@vger.kernel.org, linux-mm@kvack.org, vbabka@suse.cz, harry.yoo@oracle.com, shakeel.butt@linux.dev, mhocko@suse.com, andrii@kernel.org, memxor@gmail.com, akpm@linux-foundation.org, peterz@infradead.org, rostedt@goodmis.org, hannes@cmpxchg.org Subject: Re: [PATCH v2 6/6] slab: Introduce kmalloc_nolock() and kfree_nolock(). Message-ID: <20250711072646.a63qm4tP@linutronix.de> References: <20250709015303.8107-1-alexei.starovoitov@gmail.com> <20250709015303.8107-7-alexei.starovoitov@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <20250709015303.8107-7-alexei.starovoitov@gmail.com> X-Rspamd-Queue-Id: DB64D180010 X-Stat-Signature: 9zhus6she956jkidppfrpdeehnbnkfn1 X-Rspam-User: X-Rspamd-Server: rspam07 X-HE-Tag: 1752218810-595391 X-HE-Meta: U2FsdGVkX19PLPkVJrGjIIMT0cSEPTkrAnWA6GaydOXAkQuQZpdx4r8VYokCMwrOuVXeypqkh2IVQbIfw3wC4qvSZPX5mbKOsSj93Q/goo3JO/DdPFSzjd3OQIuXW0Wir6AYbAyxJFEk9I5OSHqYNUDJo5WLpKtgvcn9lfeoWIt7iPF+he1xfe6/SFMl+yV/b/hVaHl5DpHBPwkUUdfhV+GS5Ca19nQYcNWEMlkhnGDGvCDM+Wi48kdOORZK72ClPStsfQxs1ximYNcZ35J9KDahxwFpjhSpINZztkW9cIhfQP5qPtd+La+YyfT6UAy1ckfktVB/A0gmemr748oK2Nzgju0A8JXfnKiWbRnWawUum10aTxlgOEpqqwZO1Tp+7FfhgOq+ypNtFpjoEzZL9yoph86wQeVKEG6EjLtmFN8pM7qzWGkJQmpxdRnU9IrcjfcpI0eAlGn8M7q8YTzT2FOUKiKpsDOoVReBaiA/cKgftteTGUdJHLNK44B7EAgQ51CqgPvXS6QlrP0sWP2QWmCjH5yEvw5nneN0iPhplb9UbBKiRtnUaWodCvyNCtIxZXy9yO41W7BgWxerlhajwJkuDa0OLQXbI210+Ncer6rey6C59b06EVR0SoNXJj1WJWOop3qIgODrJ/5aRT+NvbIuz/Yi23n8tKG95QO/XjkrMza0G/SSFTrIQHjui40A17VYpdzdAkT/LBKhnyx1BCvcyFI2Lw9/9QKdfxVpFC1hINdfmNy45W0JuG25yOD2xGVV66LTdYPVr34MGvFe8yJA2uGPURSq8V91or54DUGNE0z2dgKSY7IBTdAZBQpcDVfgP4FUWaFwuJJZ3VmIRxJ8SIufg79FJGl1/Iwyjd1JuiLZOmGIqJFsqtQfoB9A1C2zrxJIZHvbtGxaf/8Cn5wra4aQ2WEa6Eag5YOJADjjy2GnVm8Ok8t3xDKauHlWEXnxA20SgXNWILX0lhJ JgU2pFHW jFSyzo1TiAqodruX2CUUUZuKCl8tJwsVkDCjE6Wf0V+LkPHfQ7/FEkfhBiq25B8afr0c16p76/22uiHfJpnJ+IexE/Jp/0ArWfOT+vYkK+yKmPLeybofuY5i0/dkVJA7HbjLGzHexx3acqSG7qEsTdQ3JxRlewrXsnhA3sNQq1oUYS0M84JxKI21IsXG4sjTrC3HMvkUIAl7OtiSaCzlgx8Fd2EiyDbKFzcwjBNvF1JM74c3ndTRROsNwEVB215sRmp3F7nCSIOUYu42YQBjbBE1gEw== 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: On 2025-07-08 18:53:03 [-0700], Alexei Starovoitov wrote: > @@ -4555,6 +4707,53 @@ static void __slab_free(struct kmem_cache *s, stru= ct slab *slab, > discard_slab(s, slab); > } > =20 > +static DEFINE_PER_CPU(struct llist_head, defer_free_objects); > +static DEFINE_PER_CPU(struct irq_work, defer_free_work); static DEFINE_PER_CPU(struct llist_head, defer_free_objects) =3D LLIST_HEAD= _INIT(defer_free_objects); static DEFINE_PER_CPU(struct irq_work, defer_free_work) =3D IRQ_WORK_INIT(f= ree_deferred_objects); would allow you to avoid init_defer_work(). > +static void free_deferred_objects(struct irq_work *work) > +{ > + struct llist_head *llhead =3D this_cpu_ptr(&defer_free_objects); > + struct llist_node *llnode, *pos, *t; =E2=80=A6 > +} > + > +static int __init init_defer_work(void) > +{ > + int cpu; > + > + for_each_possible_cpu(cpu) { > + init_llist_head(per_cpu_ptr(&defer_free_objects, cpu)); > + init_irq_work(per_cpu_ptr(&defer_free_work, cpu), > + free_deferred_objects); > + } > + return 0; > +} > +late_initcall(init_defer_work); > + > +static void defer_free(void *head) > +{ > + if (llist_add(head, this_cpu_ptr(&defer_free_objects))) > + irq_work_queue(this_cpu_ptr(&defer_free_work)); If you group &defer_free_objects and &defer_free_work into a struct you could avoid using this_cpu_ptr twice. Having both in one struct would allow to use container_of() in free_deferred_objects() to get the free list. > +} =E2=80=A6 > @@ -4844,6 +5064,62 @@ void kfree(const void *object) > } > EXPORT_SYMBOL(kfree); > =20 > +/* > + * Can be called while holding raw_spin_lock or from IRQ and NMI, raw_spinlock_t > + * but only for objects allocated by kmalloc_nolock(), > + * since some debug checks (like kmemleak and kfence) were > + * skipped on allocation. large_kmalloc is not supported either. > + */ > +void kfree_nolock(const void *object) > +{ =E2=80=A6 Sebastian