From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (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 955833DF001 for ; Tue, 19 May 2026 21:19:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779225543; cv=none; b=e1xkURZHJ/N3yRgdw01UWRsxNeM7N5MxfGYaRej9wopdMHwNxGmezeAc0TtC8UPvh36Zl8PmU7sFNA1aLCoFXDxXC7KUHuVxZgjCgbwMaUYlR9+G7ftyhlfaj09uBBN26H5meTlCMfO32UqwYnCr7lv0w2WI7/eWZm9Zrq4NewA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779225543; c=relaxed/simple; bh=IBF09qfDRqdYCSNy64ihKg6LHfXJIrB7IC2hLoNFDyE=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=vFPZNzvI4o41k12eOD8LVQN68cl49hYhRcntDANd0Z2UfmFMNBRkCJyydg2ulvIB9mTXq+360xEP4eTVXazB9wDmZu8jFCm7nZgxTZh4c/auVHhYEt2NtixAwL7Ba8BBirwrypqelD3cUhfnwt9/TYsVd/0t+0aIaGuXND95Bkk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=HlgEj3Q4; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="HlgEj3Q4" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64JJNqNb2789992; Tue, 19 May 2026 21:18:49 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=PNVNaL KBP7yOA780jlVaMjazdQ2yjIAupVVa0Xxlzew=; b=HlgEj3Q4sr5MCGdEml8VHY 76asfb+SVCKUp+eYkdb6ioePGfBfFdzvx440ZfMoNC/ir3JjLx9MgLyxI/DBT81T 7UpwO3bc9xwCgiOUHoBuCT7adRSobMOaZ8HJLSGCpCgmBRoNCPuJ5UGfp3xvpjzM u/sy+I8LOKYQKG6gefXSdoj6hOJ+ZpgYHwN2+3P51mhPSfHwqzaEdPsvUlR1+5QM b+vZZjReHVdEEOQZ4UkYdMkUleIjHXfG54iJokk4G1iEWlhVkruWzle8jC6BhWBY shHrRTIs+kMGoiWxTUD7DfZLZ18uPWXanc1EChYOGYjtY+6R41ScyYP6VORXoiKg == Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4e6h8mq5b7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 19 May 2026 21:18:49 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 64JL97Ah000488; Tue, 19 May 2026 21:18:47 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e739vvpt4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 19 May 2026 21:18:47 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 64JLIjsi54133006 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 19 May 2026 21:18:45 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CD34720043; Tue, 19 May 2026 21:18:45 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6C9C820040; Tue, 19 May 2026 21:18:43 +0000 (GMT) Received: from [9.124.216.9] (unknown [9.124.216.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 19 May 2026 21:18:43 +0000 (GMT) Message-ID: Date: Wed, 20 May 2026 02:48:42 +0530 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [patch V6 00/16] Improve /proc/interrupts further To: Thomas Gleixner , LKML Cc: x86@kernel.org, Michael Kelley , Dmitry Ilvokhin , Radu Rendec , Jan Kiszka , Kieran Bingham , Florian Fainelli , Marc Zyngier References: <20260517194421.705253664@kernel.org> Content-Language: en-US From: Shrikanth Hegde In-Reply-To: <20260517194421.705253664@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: SaYDCesH1o1fZbOn2Jc2yO1Xb0T0Hf8q X-Authority-Analysis: v=2.4 cv=GYMnWwXL c=1 sm=1 tr=0 ts=6a0cd3b9 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=U4QBUhp63rfvcbpUiXMA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: l6OYqZUE4I2afsirwM6K0N6Cx7WPj7Rs X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE5MDIxMSBTYWx0ZWRfX/RjhGusTyNWA Oax/wda1EAEUGT/O4Arl9ukfxLyaJzEz/P4NYM7XsZ8+QjDhAdEnh7onHomUQLjwAdaQISAanRI yv3dYAmTqwOdjQqmbihDwxm+Yrridpm8apgRBruT0eF7GizVVVINQytRyahquJIoEGe/f5YIjul Txv9rugusynEbkxRvXYSBR9F1UzlFo10BkrgHMudJN5M9qxedsTyTAW5Se2lnDbfzimj514gRV+ CkqLIYNtUux7DbNWTBzwefn3Edx7yVs3PdIWSlhK7O50Ir8HhaOx6oXVkAU2wgXKggfojwVHr3R JA4sdmXAXw2wcmIVsIhFpkSJbIDw/ExijEAgilCzj8Saigu12H2FDnw/UMi5NW0P+DTT3GvW1nj z+CuTGz5pay5m2Gniq3CBDNMMvVYF9LJIfVlg0Xme37656XtTsCtn0SwkaWdbZefsd06jdZOxoE /idB2v6KxvfTtV7HBvw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-19_05,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 clxscore=1011 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605190211 Hi Thomas. On 5/18/26 1:31 AM, Thomas Gleixner wrote: > This is a follow up to v5 which can be found here: > > https://lore.kernel.org/20260401195625.213446764@kernel.org > > The v1 cover letter contains a full analysis, explanation and numbers: > > https://lore.kernel.org/20260303150539.513068586@kernel.org > > TLDR: > > - The performance of reading of /proc/interrupts has been improved > piecewise over the years, but most of the low hanging fruit has been > left on the table. > Ran this on powerVM box with 240 CPUs. Ran perf stat -r 1000 cat /proc/interrupts > tmp.txt and Observed minimal improvement with series. Base: Performance counter stats for 'cat /proc/interrupts' (1000 runs): 0.32 msec task-clock:HG # 0.617 CPUs utilized ( +- 0.17% ) 0 context-switches:HG # 0.000 /sec 0 cpu-migrations:HG # 0.000 /sec 44 page-faults:HG # 136.122 K/sec ( +- 0.03% ) 1,313,263 cycles:HG # 4.063 GHz ( +- 0.17% ) 2,172,511 instructions:HG # 1.65 insn per cycle ( +- 0.05% ) 371,171 branches:HG # 1.148 G/sec ( +- 0.05% ) 4,918 branch-misses:HG # 1.32% of all branches ( +- 0.35% ) 0.000523661 +- 0.000000914 seconds time elapsed ( +- 0.17% ) v6 series: Performance counter stats for 'cat /proc/interrupts' (1000 runs): 0.30 msec task-clock:HG # 0.591 CPUs utilized ( +- 0.25% ) 0 context-switches:HG # 0.000 /sec 0 cpu-migrations:HG # 0.000 /sec 44 page-faults:HG # 145.802 K/sec ( +- 0.03% ) 1,224,666 cycles:HG # 4.058 GHz ( +- 0.25% ) 1,667,435 instructions:HG # 1.36 insn per cycle ( +- 0.08% ) 277,534 branches:HG # 919.660 M/sec ( +- 0.09% ) 5,066 branch-misses:HG # 1.83% of all branches ( +- 0.45% ) 0.00051099 +- 0.00000110 seconds time elapsed ( +- 0.21% ) << 3-4% improvement Looking at powerpc arch_show_interrupts, It could use the similar set of optimizations. - move to array based - use irq_proc_emit_counts - some interrupts such as machine check, is hardly set. set skip_vector. Copilot suggested below diff to quickly try irq_proc_emit_counts integration. It showed little gains compared to v6. So it maybe worth fixing that in the right way. (similar to x86 stuff you have done) Performance counter stats for 'cat /proc/interrupts' (1000 runs): 0.29 msec task-clock:HG # 0.586 CPUs utilized ( +- 0.22% ) 0 context-switches:HG # 0.000 /sec 0 cpu-migrations:HG # 0.000 /sec 44 page-faults:HG # 153.067 K/sec ( +- 0.03% ) 1,166,567 cycles:HG # 4.058 GHz ( +- 0.22% ) 1,475,365 instructions:HG # 1.26 insn per cycle ( +- 0.09% ) 249,051 branches:HG # 866.397 M/sec ( +- 0.10% ) 5,104 branch-misses:HG # 2.05% of all branches ( +- 0.33% ) 0.000490211 +- 0.000000992 seconds time elapsed ( +- 0.20% ) <<< 3-4% improvements. diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index a0e8b998c9b5..19c9f28c39d3 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c @@ -83,6 +83,18 @@ u32 tau_interrupts(unsigned long cpu); #endif #endif /* CONFIG_PPC32 */ + +/* + * Return a percpu pointer to a given unsigned int member of irq_stat. + */ +static __always_inline unsigned int __percpu *ppc_irq_stat_member(size_t off) +{ + return (unsigned int __percpu *)((char __percpu *)&irq_stat + off); +} + +#define PPC_IRQ_STAT_PCPU(member) \ + ppc_irq_stat_member(offsetof(irq_cpustat_t, member)) + int arch_show_interrupts(struct seq_file *p, int prec) { int j; @@ -97,33 +109,27 @@ int arch_show_interrupts(struct seq_file *p, int prec) #endif /* CONFIG_PPC32 && CONFIG_TAU_INT */ seq_printf(p, "%*s:", prec, "LOC"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).timer_irqs_event, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(timer_irqs_event)); seq_printf(p, " Local timer interrupts for timer event device\n"); seq_printf(p, "%*s:", prec, "BCT"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).broadcast_irqs_event, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(broadcast_irqs_event)); seq_printf(p, " Broadcast timer interrupts for timer event device\n"); seq_printf(p, "%*s:", prec, "LOC"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).timer_irqs_others, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(timer_irqs_others)); seq_printf(p, " Local timer interrupts for others\n"); seq_printf(p, "%*s:", prec, "SPU"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).spurious_irqs, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(spurious_irqs)); seq_printf(p, " Spurious interrupts\n"); seq_printf(p, "%*s:", prec, "PMI"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).pmu_irqs, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(pmu_irqs)); seq_printf(p, " Performance monitoring interrupts\n"); seq_printf(p, "%*s:", prec, "MCE"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).mce_exceptions, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(mce_exceptions)); seq_printf(p, " Machine check exceptions\n"); #ifdef CONFIG_PPC_BOOK3S_64 @@ -136,22 +142,19 @@ int arch_show_interrupts(struct seq_file *p, int prec) #endif seq_printf(p, "%*s:", prec, "NMI"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).sreset_irqs, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(sreset_irqs)); seq_printf(p, " System Reset interrupts\n"); #ifdef CONFIG_PPC_WATCHDOG seq_printf(p, "%*s:", prec, "WDG"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).soft_nmi_irqs, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(soft_nmi_irqs)); seq_printf(p, " Watchdog soft-NMI interrupts\n"); #endif #ifdef CONFIG_PPC_DOORBELL if (cpu_has_feature(CPU_FTR_DBELL)) { seq_printf(p, "%*s:", prec, "DBL"); - for_each_online_cpu(j) - seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).doorbell_irqs, 10); + irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(doorbell_irqs)); seq_printf(p, " Doorbell interrupts\n"); } #endif