Skip to content

Commit c009123

Browse files
arndbgregkh
authored andcommitted
staging: greybus: fix stack size warning with UBSAN
commit 144779e upstream. clang warns about excessive stack usage in this driver when UBSAN is enabled: drivers/staging/greybus/audio_topology.c:977:12: error: stack frame size of 1836 bytes in function 'gbaudio_tplg_create_widget' [-Werror,-Wframe-larger-than=] Rework this code to no longer use compound literals for initializing the structure in each case, but instead keep the common bits in a preallocated constant array and copy them as needed. Link: ClangBuiltLinux/linux#1535 Link: https://lore.kernel.org/r/20210103223541.2790855-1-arnd@kernel.org/ Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Reviewed-by: Alex Elder <elder@linaro.org> Signed-off-by: Arnd Bergmann <arnd@arndb.de> [nathan: Address review comments from v1] Signed-off-by: Nathan Chancellor <nathan@kernel.org> Link: https://lore.kernel.org/r/20211209195141.1165233-1-nathan@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 66d21c0 commit c009123

1 file changed

Lines changed: 45 additions & 47 deletions

File tree

drivers/staging/greybus/audio_topology.c

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,44 @@ static int gbaudio_widget_event(struct snd_soc_dapm_widget *w,
974974
return ret;
975975
}
976976

977+
static const struct snd_soc_dapm_widget gbaudio_widgets[] = {
978+
[snd_soc_dapm_spk] = SND_SOC_DAPM_SPK(NULL, gbcodec_event_spk),
979+
[snd_soc_dapm_hp] = SND_SOC_DAPM_HP(NULL, gbcodec_event_hp),
980+
[snd_soc_dapm_mic] = SND_SOC_DAPM_MIC(NULL, gbcodec_event_int_mic),
981+
[snd_soc_dapm_output] = SND_SOC_DAPM_OUTPUT(NULL),
982+
[snd_soc_dapm_input] = SND_SOC_DAPM_INPUT(NULL),
983+
[snd_soc_dapm_switch] = SND_SOC_DAPM_SWITCH_E(NULL, SND_SOC_NOPM,
984+
0, 0, NULL,
985+
gbaudio_widget_event,
986+
SND_SOC_DAPM_PRE_PMU |
987+
SND_SOC_DAPM_POST_PMD),
988+
[snd_soc_dapm_pga] = SND_SOC_DAPM_PGA_E(NULL, SND_SOC_NOPM,
989+
0, 0, NULL, 0,
990+
gbaudio_widget_event,
991+
SND_SOC_DAPM_PRE_PMU |
992+
SND_SOC_DAPM_POST_PMD),
993+
[snd_soc_dapm_mixer] = SND_SOC_DAPM_MIXER_E(NULL, SND_SOC_NOPM,
994+
0, 0, NULL, 0,
995+
gbaudio_widget_event,
996+
SND_SOC_DAPM_PRE_PMU |
997+
SND_SOC_DAPM_POST_PMD),
998+
[snd_soc_dapm_mux] = SND_SOC_DAPM_MUX_E(NULL, SND_SOC_NOPM,
999+
0, 0, NULL,
1000+
gbaudio_widget_event,
1001+
SND_SOC_DAPM_PRE_PMU |
1002+
SND_SOC_DAPM_POST_PMD),
1003+
[snd_soc_dapm_aif_in] = SND_SOC_DAPM_AIF_IN_E(NULL, NULL, 0,
1004+
SND_SOC_NOPM, 0, 0,
1005+
gbaudio_widget_event,
1006+
SND_SOC_DAPM_PRE_PMU |
1007+
SND_SOC_DAPM_POST_PMD),
1008+
[snd_soc_dapm_aif_out] = SND_SOC_DAPM_AIF_OUT_E(NULL, NULL, 0,
1009+
SND_SOC_NOPM, 0, 0,
1010+
gbaudio_widget_event,
1011+
SND_SOC_DAPM_PRE_PMU |
1012+
SND_SOC_DAPM_POST_PMD),
1013+
};
1014+
9771015
static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
9781016
struct snd_soc_dapm_widget *dw,
9791017
struct gb_audio_widget *w, int *w_size)
@@ -1052,77 +1090,37 @@ static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module,
10521090

10531091
switch (w->type) {
10541092
case snd_soc_dapm_spk:
1055-
*dw = (struct snd_soc_dapm_widget)
1056-
SND_SOC_DAPM_SPK(w->name, gbcodec_event_spk);
1093+
*dw = gbaudio_widgets[w->type];
10571094
module->op_devices |= GBAUDIO_DEVICE_OUT_SPEAKER;
10581095
break;
10591096
case snd_soc_dapm_hp:
1060-
*dw = (struct snd_soc_dapm_widget)
1061-
SND_SOC_DAPM_HP(w->name, gbcodec_event_hp);
1097+
*dw = gbaudio_widgets[w->type];
10621098
module->op_devices |= (GBAUDIO_DEVICE_OUT_WIRED_HEADSET
10631099
| GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE);
10641100
module->ip_devices |= GBAUDIO_DEVICE_IN_WIRED_HEADSET;
10651101
break;
10661102
case snd_soc_dapm_mic:
1067-
*dw = (struct snd_soc_dapm_widget)
1068-
SND_SOC_DAPM_MIC(w->name, gbcodec_event_int_mic);
1103+
*dw = gbaudio_widgets[w->type];
10691104
module->ip_devices |= GBAUDIO_DEVICE_IN_BUILTIN_MIC;
10701105
break;
10711106
case snd_soc_dapm_output:
1072-
*dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_OUTPUT(w->name);
1073-
break;
10741107
case snd_soc_dapm_input:
1075-
*dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_INPUT(w->name);
1076-
break;
10771108
case snd_soc_dapm_switch:
1078-
*dw = (struct snd_soc_dapm_widget)
1079-
SND_SOC_DAPM_SWITCH_E(w->name, SND_SOC_NOPM, 0, 0,
1080-
widget_kctls,
1081-
gbaudio_widget_event,
1082-
SND_SOC_DAPM_PRE_PMU |
1083-
SND_SOC_DAPM_POST_PMD);
1084-
break;
10851109
case snd_soc_dapm_pga:
1086-
*dw = (struct snd_soc_dapm_widget)
1087-
SND_SOC_DAPM_PGA_E(w->name, SND_SOC_NOPM, 0, 0, NULL, 0,
1088-
gbaudio_widget_event,
1089-
SND_SOC_DAPM_PRE_PMU |
1090-
SND_SOC_DAPM_POST_PMD);
1091-
break;
10921110
case snd_soc_dapm_mixer:
1093-
*dw = (struct snd_soc_dapm_widget)
1094-
SND_SOC_DAPM_MIXER_E(w->name, SND_SOC_NOPM, 0, 0, NULL,
1095-
0, gbaudio_widget_event,
1096-
SND_SOC_DAPM_PRE_PMU |
1097-
SND_SOC_DAPM_POST_PMD);
1098-
break;
10991111
case snd_soc_dapm_mux:
1100-
*dw = (struct snd_soc_dapm_widget)
1101-
SND_SOC_DAPM_MUX_E(w->name, SND_SOC_NOPM, 0, 0,
1102-
widget_kctls, gbaudio_widget_event,
1103-
SND_SOC_DAPM_PRE_PMU |
1104-
SND_SOC_DAPM_POST_PMD);
1112+
*dw = gbaudio_widgets[w->type];
11051113
break;
11061114
case snd_soc_dapm_aif_in:
1107-
*dw = (struct snd_soc_dapm_widget)
1108-
SND_SOC_DAPM_AIF_IN_E(w->name, w->sname, 0,
1109-
SND_SOC_NOPM,
1110-
0, 0, gbaudio_widget_event,
1111-
SND_SOC_DAPM_PRE_PMU |
1112-
SND_SOC_DAPM_POST_PMD);
1113-
break;
11141115
case snd_soc_dapm_aif_out:
1115-
*dw = (struct snd_soc_dapm_widget)
1116-
SND_SOC_DAPM_AIF_OUT_E(w->name, w->sname, 0,
1117-
SND_SOC_NOPM,
1118-
0, 0, gbaudio_widget_event,
1119-
SND_SOC_DAPM_PRE_PMU |
1120-
SND_SOC_DAPM_POST_PMD);
1116+
*dw = gbaudio_widgets[w->type];
1117+
dw->sname = w->sname;
11211118
break;
11221119
default:
11231120
ret = -EINVAL;
11241121
goto error;
11251122
}
1123+
dw->name = w->name;
11261124

11271125
dev_dbg(module->dev, "%s: widget of type %d created\n", dw->name,
11281126
dw->id);

0 commit comments

Comments
 (0)