From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AFDB437B40B for ; Thu, 23 Apr 2026 16:45:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776962753; cv=none; b=DkH4Ch8/0Lax8ZVB6QA4b+owG8SlQGTp31WN0BJa6PQQsUgKIiVSC2qtNZ3tHG0wEHTlYDFYSqHc/8JZX1qqV9WaIQvniaTkkzBZZhbrq/tghL7LVfhyug/jdMhI/6uMmTS+pAw2kCHhyTyy3aIdnGaLQbxCTwzoHENfoLGFx34= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776962753; c=relaxed/simple; bh=LEN/1XSZQR4Tgmy0dQmqFFuDvneqjuPz6Hr17XofNAc=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=i/vcAYxXkBIYQWnb7dPykCW2OVZ3CKcEnI8NpKWHq2Ag7Y+Cx0UE4ZBI0NjicvSfXizmPOE8EXf/Lj6nW04QVKvr0msWKIckde0AKmq2zNXv2GpXH3MgUNYqi6L4QceKyyZx76FIwQU8Jc6lsPl7huRS5ACi3Hkq15Kv+cgoIGY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=none smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=Eq2Q8m79; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="Eq2Q8m79" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=rj3QxB8QaXsD9NXUDbwPU1Wt9X0ndQz+gr6/KzPzyok=; b=Eq2Q8m79i9v3IpWU+PsdQGhHKL xZgIfE52b4Pp8/M6gGF2v3Tx+bYVyCaZLIhkfb1PbQpgBgcU5JLyQ0d4NqQrLPidKAXM94li+AQn6 icqbeoNPsd5L1cHZ5a/HpFrXaR/lPhWvqDZaur1v1LkLjZS8e081LYownzdZulkAY69fTWxES5LQt 1TzoRK67SBKAHJ9uSGqpWyB7DNCRSipbBg7JonZglIfb9dVr3LwVhCVUywUIFavhw/wru2Xxthtjs a6tPf3PbdhqoGbLVfDqya3COL0uopQxxiqGQkJJZMuto8K7FdE+vJkV4QSaEzNsVz/UHHNT87QSWg VhWWMF4w==; Received: from authenticated user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.96) (envelope-from ) id 1wFxBH-002XLu-0S; Thu, 23 Apr 2026 16:45:35 +0000 Date: Thu, 23 Apr 2026 09:45:30 -0700 From: Breno Leitao To: Catalin Marinas , Will Deacon , mark.rutland@arm.com Cc: leo.bras@arm.com, leo.yan@arm.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, palmer@dabbelt.com, paulmck@kernel.org, puranjay@kernel.org, usama.arif@linux.dev, rmikey@meta.com, kernel-team@meta.com Subject: Re: [PATCH v2] arm64/irqflags: __always_inline the arch_local_irq_*() helpers Message-ID: References: <20260421-arm64_always_inline-v2-1-c59d1400514d@debian.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260421-arm64_always_inline-v2-1-c59d1400514d@debian.org> X-Debian-User: leitao On Tue, Apr 21, 2026 at 08:58:57AM -0700, Breno Leitao wrote: > The arch_local_irq_*() wrappers in dispatch between two > underlying primitives: the __daif_* path on most systems, and the > __pmr_* path on builds that use GIC PMR-based masking (Pseudo-NMI). The > leaf primitives are already __always_inline, but the wrappers themselves > are plain "static inline". > > That is unsafe for noinstr callers: nothing prevents the compiler from > emitting an out-of-line copy of e.g. arch_local_irq_disable(), and an > out-of-line copy can be instrumented (ftrace, kcov, sanitizers), which > breaks the noinstr contract on the entry/idle paths that rely on these > helpers. > > x86 hit and fixed exactly this class of bug in commit 7a745be1cc90 > ("x86/entry: __always_inline irqflags for noinstr"). > > Force-inline all of the arch_local_irq_*() wrappers so they cannot be > emitted out-of-line: > > - arch_local_irq_enable() > - arch_local_irq_disable() > - arch_local_save_flags() > - arch_irqs_disabled_flags() > - arch_irqs_disabled() > - arch_local_irq_save() > - arch_local_irq_restore() > > The primary motivation is noinstr safety. There is a useful side effect > for fleet-wide profiling: when the wrapper is emitted out-of-line, > samples taken inside it during the post-WFI IRQ unmask in > default_idle_call() are attributed to arch_local_irq_enable rather than > default_idle_call(), and the FP-unwinder loses default_idle_call() from > the chain. FWIW I run scripts/bloat-o-meter on the kernel with and without the patch, and the the code size is mostly the same. here is the result: add/remove: 4/12 grow/shrink: 40/0 up/down: 1684/-652 (1032) Function old new delta __schedule 8892 9024 +132 irqentry_exit 816 892 +76 lockdep_hardirqs_off 396 452 +56 lock_is_held_type 412 468 +56 ct_idle_exit 76 132 +56 cpu_idle_poll 304 360 +56 arch_stack_walk_reliable 1152 1196 +44 arch_stack_walk 1184 1228 +44 arch_bpf_stack_walk 996 1040 +44 lockdep_hardirqs_on 464 504 +40 el0_watchpt 576 616 +40 el0_undef 560 600 +40 el0_sys 560 600 +40 el0_sve_acc 560 600 +40 el0_svc 600 640 +40 el0_sp 564 604 +40 el0_softstp 728 768 +40 el0_sme_acc 560 600 +40 el0_pc 740 780 +40 el0_mops 560 600 +40 el0_inv 564 604 +40 el0_interrupt 656 696 +40 el0_ia 716 756 +40 el0_gcs 560 600 +40 el0_fpsimd_exc 560 600 +40 el0_fpsimd_acc 560 600 +40 el0_fpac 560 600 +40 el0_da 568 608 +40 el0_bti 552 592 +40 el0_brk64 560 600 +40 el0_breakpt 720 760 +40 asm_exit_to_user_mode 416 456 +40 __el0_error_handler_common 592 632 +40 cpuidle_enter_state 1220 1248 +28 check_preemption_disabled 228 252 +24 default_idle_call 252 272 +20 ct_kernel_enter 388 404 +16 ct_idle_enter 52 68 +16 look_up_lock_class 364 376 +12 check_flags 492 504 +12 __CortexA53843419_FFFF800081146000 - 8 +8 __CortexA53843419_FFFF8000809C3004 - 8 +8 __CortexA53843419_FFFF8000809AE000 - 8 +8 __CortexA53843419_FFFF800080248004 - 8 +8 __CortexA53843419_FFFF80008100C000 8 - -8 __CortexA53843419_FFFF8000809A9000 8 - -8 __CortexA53843419_FFFF8000809A8004 8 - -8 __CortexA53843419_FFFF800080448008 8 - -8 __CortexA53843419_FFFF8000801EE000 8 - -8 arch_local_irq_restore 48 - -48 arch_local_save_flags 80 - -80 arch_local_irq_save 80 - -80 arch_local_irq_enable 84 - -84 arch_local_irq_disable 96 - -96 arch_irqs_disabled_flags 96 - -96 arch_irqs_disabled 128 - -128 Total: Before=163062863, After=163063895, chg +0.00%