Message ID | 20190628123819.2785504-2-arnd@arndb.de (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [1/4,v2] structleak: disable STRUCTLEAK_BYREF in combination with KASAN_STACK | expand |
On 6/28/2019 5:37 AM, Arnd Bergmann wrote: > The lpfc_debug_dump_all_queues() function repeatedly calls into > lpfc_debug_dump_qe(), which has a temporary 128 byte buffer. > This was fine before the introduction of CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE > because each instance could occupy the same stack slot. However, > now they each get their own copy, which leads to a huge increase > in stack usage as seen from the compiler warning: > > drivers/scsi/lpfc/lpfc_debugfs.c: In function 'lpfc_debug_dump_all_queues': > drivers/scsi/lpfc/lpfc_debugfs.c:6474:1: error: the frame size of 1712 bytes is larger than 100 bytes [-Werror=frame-larger-than=] > > Avoid this by not marking lpfc_debug_dump_qe() as inline so the > compiler can choose to emit a static version of this function > when it's needed or otherwise silently drop it. As an added benefit, > not inlining multiple copies of this function means we save several > kilobytes of .text section, reducing the file size from 47kb to 43. > > It is somewhat unusual to have a function that is static but not > inline in a header file, but this does not cause problems here > because it is only used by other inline functions. It would > however seem reasonable to move all the lpfc_debug_dump_* functions > into lpfc_debugfs.c and not mark them inline as a later cleanup. I agree with this cleanup. > > Fixes: 81a56f6dcd20 ("gcc-plugins: structleak: Generalize to all variable types") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > drivers/scsi/lpfc/lpfc_debugfs.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Reviewed-by: James Smart <james.smart@broadcom.com> -- james
Arnd, > The lpfc_debug_dump_all_queues() function repeatedly calls into > lpfc_debug_dump_qe(), which has a temporary 128 byte buffer. This was > fine before the introduction of CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE > because each instance could occupy the same stack slot. However, now > they each get their own copy, which leads to a huge increase in stack > usage as seen from the compiler warning: Applied to 5.3/scsi-fixes. Thank you!
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.h b/drivers/scsi/lpfc/lpfc_debugfs.h index 2322ddb085c0..34070874616d 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.h +++ b/drivers/scsi/lpfc/lpfc_debugfs.h @@ -330,7 +330,7 @@ enum { * This function dumps an entry indexed by @idx from a queue specified by the * queue descriptor @q. **/ -static inline void +static void lpfc_debug_dump_qe(struct lpfc_queue *q, uint32_t idx) { char line_buf[LPFC_LBUF_SZ];
The lpfc_debug_dump_all_queues() function repeatedly calls into lpfc_debug_dump_qe(), which has a temporary 128 byte buffer. This was fine before the introduction of CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE because each instance could occupy the same stack slot. However, now they each get their own copy, which leads to a huge increase in stack usage as seen from the compiler warning: drivers/scsi/lpfc/lpfc_debugfs.c: In function 'lpfc_debug_dump_all_queues': drivers/scsi/lpfc/lpfc_debugfs.c:6474:1: error: the frame size of 1712 bytes is larger than 100 bytes [-Werror=frame-larger-than=] Avoid this by not marking lpfc_debug_dump_qe() as inline so the compiler can choose to emit a static version of this function when it's needed or otherwise silently drop it. As an added benefit, not inlining multiple copies of this function means we save several kilobytes of .text section, reducing the file size from 47kb to 43. It is somewhat unusual to have a function that is static but not inline in a header file, but this does not cause problems here because it is only used by other inline functions. It would however seem reasonable to move all the lpfc_debug_dump_* functions into lpfc_debugfs.c and not mark them inline as a later cleanup. Fixes: 81a56f6dcd20 ("gcc-plugins: structleak: Generalize to all variable types") Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- drivers/scsi/lpfc/lpfc_debugfs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)