On Thu, Jul 21, 2022 at 05:28:09PM +0200, Amadeusz Sławiński wrote:
On 7/21/2022 4:42 PM, Mark Brown wrote:
On Thu, Jul 21, 2022 at 02:25:20PM +0200, Amadeusz Sławiński wrote:
On 7/20/2022 8:52 PM, Nathan Chancellor wrote:
This warning is also visible with allmodconfig on other architectures.
My first question would be what clang does differently in this configuration (ARM) than in all other configurations (x86, etc.) and gcc.
See above from Nathan's commit message...
Ah, missed that. Anyway, what about if we replace multiple calls to guid_equal with lookup table and one call in loop?
Do let me know if something like the following works and I will send it as a proper patch:
Yes, that works! With ARCH=arm64 allmodconfig + CONFIG_FRAME_WARN=128, there is no single large function, they are all far below the default 2048 limit.
sound/soc/intel/avs/path.c:819:18: warning: stack frame size (256) exceeds limit (128) in 'avs_path_create' [-Wframe-larger-than] struct avs_path *avs_path_create(struct avs_dev *adev, u32 dma_id, ^ sound/soc/intel/avs/path.c:877:5: warning: stack frame size (272) exceeds limit (128) in 'avs_path_bind' [-Wframe-larger-than] int avs_path_bind(struct avs_path *path) ^ sound/soc/intel/avs/path.c:143:12: warning: stack frame size (144) exceeds limit (128) in 'avs_copier_create' [-Wframe-larger-than] static int avs_copier_create(struct avs_dev *adev, struct avs_path_module *mod) ^ sound/soc/intel/avs/path.c:379:12: warning: stack frame size (144) exceeds limit (128) in 'avs_micsel_create' [-Wframe-larger-than] static int avs_micsel_create(struct avs_dev *adev, struct avs_path_module *mod) ^ sound/soc/intel/avs/path.c:344:12: warning: stack frame size (160) exceeds limit (128) in 'avs_mux_create' [-Wframe-larger-than] static int avs_mux_create(struct avs_dev *adev, struct avs_path_module *mod) ^ sound/soc/intel/avs/path.c:267:12: warning: stack frame size (160) exceeds limit (128) in 'avs_updown_mix_create' [-Wframe-larger-than] static int avs_updown_mix_create(struct avs_dev *adev, struct avs_path_module *mod) ^ sound/soc/intel/avs/path.c:325:12: warning: stack frame size (176) exceeds limit (128) in 'avs_aec_create' [-Wframe-larger-than] static int avs_aec_create(struct avs_dev *adev, struct avs_path_module *mod) ^ sound/soc/intel/avs/path.c:306:12: warning: stack frame size (144) exceeds limit (128) in 'avs_asrc_create' [-Wframe-larger-than] static int avs_asrc_create(struct avs_dev *adev, struct avs_path_module *mod) ^ 8 warnings generated.
Feel free to add either
Tested-by: Nathan Chancellor nathan@kernel.org # build
or
Build-tested-by: Nathan Chancellor nathan@kernel.org
when formally sending, thank you a lot for the fix!
Cheers, Nathan
diff --git a/sound/soc/intel/avs/path.c b/sound/soc/intel/avs/path.c index 3d46dd5e5bc4..ce157a8d6552 100644 --- a/sound/soc/intel/avs/path.c +++ b/sound/soc/intel/avs/path.c @@ -449,35 +449,39 @@ static int avs_modext_create(struct avs_dev *adev, struct avs_path_module *mod) return ret; }
+static int avs_probe_create(struct avs_dev *adev, struct avs_path_module *mod) +{
dev_err(adev->dev, "Probe module can't be instantiated by
topology");
return -EINVAL;
+}
+struct avs_module_create {
guid_t *guid;
int (*create)(struct avs_dev *adev, struct avs_path_module *mod);
+};
+static struct avs_module_create avs_module_create[] = {
{ &AVS_MIXIN_MOD_UUID, avs_modbase_create },
{ &AVS_MIXOUT_MOD_UUID, avs_modbase_create },
{ &AVS_KPBUFF_MOD_UUID, avs_modbase_create },
{ &AVS_COPIER_MOD_UUID, avs_copier_create },
{ &AVS_MICSEL_MOD_UUID, avs_micsel_create },
{ &AVS_MUX_MOD_UUID, avs_mux_create },
{ &AVS_UPDWMIX_MOD_UUID, avs_updown_mix_create },
{ &AVS_SRCINTC_MOD_UUID, avs_src_create },
{ &AVS_AEC_MOD_UUID, avs_aec_create },
{ &AVS_ASRC_MOD_UUID, avs_asrc_create },
{ &AVS_INTELWOV_MOD_UUID, avs_wov_create },
{ &AVS_PROBE_MOD_UUID, avs_probe_create },
+};
static int avs_path_module_type_create(struct avs_dev *adev, struct avs_path_module *mod) { const guid_t *type = &mod->template->cfg_ext->type;
if (guid_equal(type, &AVS_MIXIN_MOD_UUID) ||
guid_equal(type, &AVS_MIXOUT_MOD_UUID) ||
guid_equal(type, &AVS_KPBUFF_MOD_UUID))
return avs_modbase_create(adev, mod);
if (guid_equal(type, &AVS_COPIER_MOD_UUID))
return avs_copier_create(adev, mod);
if (guid_equal(type, &AVS_MICSEL_MOD_UUID))
return avs_micsel_create(adev, mod);
if (guid_equal(type, &AVS_MUX_MOD_UUID))
return avs_mux_create(adev, mod);
if (guid_equal(type, &AVS_UPDWMIX_MOD_UUID))
return avs_updown_mix_create(adev, mod);
if (guid_equal(type, &AVS_SRCINTC_MOD_UUID))
return avs_src_create(adev, mod);
if (guid_equal(type, &AVS_AEC_MOD_UUID))
return avs_aec_create(adev, mod);
if (guid_equal(type, &AVS_ASRC_MOD_UUID))
return avs_asrc_create(adev, mod);
if (guid_equal(type, &AVS_INTELWOV_MOD_UUID))
return avs_wov_create(adev, mod);
if (guid_equal(type, &AVS_PROBE_MOD_UUID)) {
dev_err(adev->dev, "Probe module can't be instantiated by
topology");
return -EINVAL;
}
for (int i = 0; i < ARRAY_SIZE(avs_module_create); i++)
if (guid_equal(type, avs_module_create[i].guid))
return avs_module_create[i].create(adev, mod); return avs_modext_create(adev, mod);
}