From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.zytor.com (terminus.zytor.com [198.137.202.136]) (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 0E77E2ECEBB for ; Thu, 18 Dec 2025 10:14:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.137.202.136 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766052873; cv=none; b=PmsMSovx3EvVWuhdPOi8SPKVlmoBwRgFuuZ7QKXYVWm0WzX3AuLkgxBROVET8mvax8sWSoFjNPKMiBa1gbi3AC8PcMurwJZzjyop1fq7ZgcVclOivmeL+EwoZtf01vuq5od94IdhIu05ey+8MJmQw0Xcr9w8mdy0Zx16vhHbQps= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766052873; c=relaxed/simple; bh=hDsvGuKMscjN2Au5BDvRgDs+xZIwXgYT88Y6lkm7U2M=; h=Date:From:To:CC:Subject:In-Reply-To:References:Message-ID: MIME-Version:Content-Type; b=UZBYVICcQvv/kcrT+Gecfr9WKSqIAawmkc4A7lZbakZKxMPYsj7Q68QkVgS377CrjDyCf5z0zh8IA8tLGPOyNx1iHZpnqNhXHih/PiUdaCgJ3nXYzAIRJTYTzDxwGWpSBbvFb2JubkIQ6U7Mc5WgNsoBvhGZlIm8E7awO8eoqHE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zytor.com; spf=pass smtp.mailfrom=zytor.com; dkim=pass (2048-bit key) header.d=zytor.com header.i=@zytor.com header.b=sU8ANrzu; arc=none smtp.client-ip=198.137.202.136 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zytor.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zytor.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=zytor.com header.i=@zytor.com header.b="sU8ANrzu" Received: from ehlo.thunderbird.net (c-76-133-66-138.hsd1.ca.comcast.net [76.133.66.138]) (authenticated bits=0) by mail.zytor.com (8.18.1/8.17.1) with ESMTPSA id 5BIAD0ec2024394 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NO); Thu, 18 Dec 2025 02:13:00 -0800 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.zytor.com 5BIAD0ec2024394 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zytor.com; s=2025112201; t=1766052780; bh=xvoumk5JfZD05GrrN3CdFw6dYa4owqQd6vEfDUjoGbA=; h=Date:From:To:CC:Subject:In-Reply-To:References:From; b=sU8ANrzuHujMY1bxSJr4Ft3FVSN0dqBMTdOgfI320ysl1F1wc5wqAmnuv1KlqkFmI 2X5twpI2wDgvAz2yOxAbgFxEsF0AnS5nHOqMGhJT5fPLY89i6P+QpJAwm/g8hEP8Ju TekVw+Ha4FFylROc3WHQIRiJzlDN00eEN89liQdmoO/0Nud6WoOkcIw08LuyZfqXxV aX34N7cJEBou5aaesceMOiIIgMySa4+j20+ypeJFVcSUkxevVo5EoZKPncJlJcucE1 ImxV4VjG8XKaY7XMO0pxOS3KOQIYRHrT+XOnCFDb0UEXUcRqRaEENuS1OIqxhFLOKC SZVCkPC/lf71A== Date: Thu, 18 Dec 2025 02:12:59 -0800 From: "H. Peter Anvin" To: Eric Dumazet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org CC: linux-kernel , Eric Dumazet Subject: Re: [PATCH] x86/irqflags: Force a register output in native_save_fl() User-Agent: K-9 Mail for Android In-Reply-To: <20251218095434.1052422-1-edumazet@google.com> References: <20251218095434.1052422-1-edumazet@google.com> Message-ID: <0214B313-79AF-411F-AE04-8FF2705C5A92@zytor.com> 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=utf-8 Content-Transfer-Encoding: quoted-printable On December 18, 2025 1:54:33 AM PST, Eric Dumazet w= rote: >clang is generating very inefficient code for native_save_fl() which >is used for local_irq_save() in few critical spots=2E > >Allowing the "pop %0" to use memory : > >1) forces the compiler to add annoying stack canaries when > CONFIG_STACKPROTECTOR_STRONG=3Dy in many places=2E > >2) Almost always is followed by an immediate "move memory,register" > >One good example is _raw_spin_lock_irqsave, with 8 extra instructions > >ffffffff82067a30 <_raw_spin_lock_irqsave>: >ffffffff82067a30: =2E=2E=2E >ffffffff82067a39: 53 push %rbx > >// Three instructions to ajust the stack, read the per-cpu canary >// and copy it to 8(%rsp) >ffffffff82067a3a: 48 83 ec 10 sub $0x10,%rsp >ffffffff82067a3e: 65 48 8b 05 da 15 45 02 mov %gs:0x24515da(%rip= ),%rax # <__stack_chk_guard> >ffffffff82067a46: 48 89 44 24 08 mov %rax,0x8(%rsp) > >ffffffff82067a4b: 9c pushf > >// instead of pop %rbx, compiler uses 2 instructions=2E >ffffffff82067a4c: 8f 04 24 pop (%rsp) >ffffffff82067a4f: 48 8b 1c 24 mov (%rsp),%rbx > >ffffffff82067a53: fa cli >ffffffff82067a54: b9 01 00 00 00 mov $0x1,%ecx >ffffffff82067a59: 31 c0 xor %eax,%eax >ffffffff82067a5b: f0 0f b1 0f lock cmpxchg %ecx,(%rdi) >ffffffff82067a5f: 75 1d jne ffffffff82067a7e <= _raw_spin_lock_irqsave+0x4e> > >// three instructions to check the stack canary >ffffffff82067a61: 65 48 8b 05 b7 15 45 02 mov %gs:0x24515b7(%rip= ),%rax # <__stack_chk_guard> >ffffffff82067a69: 48 3b 44 24 08 cmp 0x8(%rsp),%rax >ffffffff82067a6e: 75 17 jne ffffffff82067a87 > >=2E=2E=2E > >// One extra instruction to adjust the stack=2E >ffffffff82067a73: 48 83 c4 10 add $0x10,%rsp >=2E=2E=2E > >// One more instruction in case the stack was mangled=2E >ffffffff82067a87: e8 a4 35 ff ff call ffffffff8205b030 <= __stack_chk_fail> > >This patch changes almost nothing for gcc, but saves 23153 bytes >of text with clang, while allowing more functions to be inlined=2E > >$ size vmlinux=2Egcc=2Ebefore vmlinux=2Egcc=2Eafter vmlinux=2Eclang=2Ebef= ore vmlinux=2Eclang=2Eafter > text data bss dec hex filename >45564911 25005415 4708896 75279221 47cab75 vmlinux=2Egcc=2Ebefore >45564901 25005414 4708896 75279211 47cab6b vmlinux=2Egcc=2Eafter >45115647 24638569 5537072 75291288 47cda98 vmlinux=2Eclang=2Ebefore >45092494 24638585 5545000 75276079 47c9f2f vmlinux=2Eclang=2Eafter > >$ scripts/bloat-o-meter -t vmlinux=2Eclang=2Ebefore vmlinux=2Eclang=2Eaft= er >add/remove: 0/3 grow/shrink: 22/533 up/down: 5162/-25088 (-19926) >Function old new delta >__noinstr_text_start 640 3584 +2944 >wakeup_cpu_via_vmgexit 1002 1447 +445 >rcu_tasks_trace_pregp_step 1052 1454 +402 >snp_kexec_finish 1290 1527 +237 >check_all_holdout_tasks_trace 909 1106 +197 >x2apic_send_IPI_mask_allbutself 38 198 +160 >hpet_set_rtc_irq_bit 118 265 +147 >x2apic_send_IPI_mask 38 184 +146 >ring_buffer_poll_wait 261 405 +144 >rb_watermark_hit 253 386 +133 >=2E=2E=2E >tcp_wfree 402 332 -70 >stacktrace_trigger 133 62 -71 >w1_touch_bit 418 343 -75 >w1_triplet 446 370 -76 >link_create 980 902 -78 >drain_dead_softirq_workfn 425 347 -78 >kcryptd_queue_crypt 253 174 -79 >perf_event_aux_pause 448 368 -80 >idle_worker_timeout 320 240 -80 >srcu_funnel_exp_start 418 333 -85 >call_rcu 751 666 -85 >enable_IR_x2apic 279 191 -88 >bpf_link_free 432 342 -90 >synchronize_rcu 497 403 -94 >identify_cpu 2665 2569 -96 >ftrace_modify_all_code 355 258 -97 >load_gs_index 212 104 -108 >verity_end_io 369 257 -112 >bpf_prog_detach 672 555 -117 >__x2apic_send_IPI_mask 552 275 -277 >snp_cleanup_vmsa 284 - -284 >__end_rodata 606208 602112 -4096 >Total: Before=3D28577927, After=3D28558001, chg -0=2E07% > >Signed-off-by: Eric Dumazet >--- > arch/x86/include/asm/irqflags=2Eh | 7 +------ > 1 file changed, 1 insertion(+), 6 deletions(-) > >diff --git a/arch/x86/include/asm/irqflags=2Eh b/arch/x86/include/asm/irq= flags=2Eh >index b30e5474c18e1be63b7c69354c26ae6a6cb02731=2E=2Ea06bdc51b6e3d04c06352= c28389b10ec66551a0e 100644 >--- a/arch/x86/include/asm/irqflags=2Eh >+++ b/arch/x86/include/asm/irqflags=2Eh >@@ -18,14 +18,9 @@ extern __always_inline unsigned long native_save_fl(vo= id) > { > unsigned long flags; >=20 >- /* >- * "=3Drm" is safe here, because "pop" adjusts the stack before >- * it evaluates its effective address -- this is part of the >- * documented behavior of the "pop" instruction=2E >- */ > asm volatile("# __raw_save_flags\n\t" > "pushf ; pop %0" >- : "=3Drm" (flags) >+ : "=3Dr" (flags) > : /* no input */ > : "memory"); >=20 Maybe report a bug to the clang team?