| From 199c02500d8c071274ccf6283b1ccb01d46f4569 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 3 Feb 2026 17:33:15 +0100 |
| Subject: scsi: buslogic: Reduce stack usage |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit e17f0d4cc006265dd92129db4bf9da3a2e4a4f66 ] |
| |
| Some randconfig builds run into excessive stack usage with gcc-14 or |
| higher, which use __attribute__((cold)) where earlier versions did not do |
| that: |
| |
| drivers/scsi/BusLogic.c: In function 'blogic_init': |
| drivers/scsi/BusLogic.c:2398:1: error: the frame size of 1680 bytes is larger than 1536 bytes [-Werror=frame-larger-than=] |
| |
| The problem is that a lot of code gets inlined into blogic_init() here. Two |
| functions stick out, but they are a bit different: |
| |
| - blogic_init_probeinfo_list() actually uses a few hundred bytes of kernel |
| stack, which is a problem in combination with other functions that also |
| do. Marking this one as noinline means that the stack slots get get |
| reused between function calls |
| |
| - blogic_reportconfig() has a few large variables, but whenever it is not |
| inlined into its caller, the compiler is actually smart enough to reuse |
| stack slots for these automatically, so marking it as noinline saves |
| most of the stack space by itself. |
| |
| The combination of both of these should avoid the problem entirely. |
| |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Link: https://patch.msgid.link/20260203163321.2598593-1-arnd@kernel.org |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/BusLogic.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c |
| index 2135a2b3e2d00..c17b09d966f14 100644 |
| --- a/drivers/scsi/BusLogic.c |
| +++ b/drivers/scsi/BusLogic.c |
| @@ -920,7 +920,8 @@ static int __init blogic_init_fp_probeinfo(struct blogic_adapter *adapter) |
| a particular probe order. |
| */ |
| |
| -static void __init blogic_init_probeinfo_list(struct blogic_adapter *adapter) |
| +static noinline_for_stack void __init |
| +blogic_init_probeinfo_list(struct blogic_adapter *adapter) |
| { |
| /* |
| If a PCI BIOS is present, interrogate it for MultiMaster and |
| @@ -1690,7 +1691,8 @@ static bool __init blogic_rdconfig(struct blogic_adapter *adapter) |
| blogic_reportconfig reports the configuration of Host Adapter. |
| */ |
| |
| -static bool __init blogic_reportconfig(struct blogic_adapter *adapter) |
| +static noinline_for_stack bool __init |
| +blogic_reportconfig(struct blogic_adapter *adapter) |
| { |
| unsigned short alltgt_mask = (1 << adapter->maxdev) - 1; |
| unsigned short sync_ok, fast_ok; |
| -- |
| 2.51.0 |
| |