Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp13442107pxu; Sun, 3 Jan 2021 15:18:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJzdEw6/0aNnsnAGNB0s8wSrB0OSbbq39HYDwCUAmXW/dz+Mjc5Gf/gr2NIhWpw0yHfbLZoY X-Received: by 2002:a17:906:9452:: with SMTP id z18mr65548792ejx.389.1609715926207; Sun, 03 Jan 2021 15:18:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609715926; cv=none; d=google.com; s=arc-20160816; b=G/wzZmJUDwLa+OQ/XTxFDRKVD5gPYzf2YT93vMd1HUzZh59EPvZEz5r89SstRj2+Iu NAuG/TvFlfXWHm+ggAkKyrz4OKVo7DDQTidzsXELf/XHQK7xV74g+67GxFrm83WV2b2K U32dhUs1JoLDlrSZL4O9DKCTV3dgQCnl7sqERwmVc3E7dts8+ldGcGryD/aqbKwizb1d dLlQtc4O2DrykYlilEjoLqvbPcCynjBeU386DtLlX19M0oW5q92pGKk1/wM+hRx1flZc D2qyELYnSlDOISwy/AWgUneR/1utdRdxyDzCVCz+NGGCRqxzF3wngfv4BUQqnwkGSpcz 2ReQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=fky6HmHjwFpGSuMFXaKf+e9LizgnH1Sr1oCGkMJ9xWM=; b=iXio3itwzitqwiZ/fp07lmBNAjOeZ/A9tqsgORMIWA1Nwlrb2jQD/Aqi3fJhSdWPph BJdhe9S68kqCnFlPCuUhuGNkawhKvXQy1onkuND/KDbcAPius6DbmS0a6UrGCE05iP01 Ejc9142Q4/h2TdA23oKzma2bZSczQJKK6o9rKKR3nxgzb6wbydWPm2AO210XCqkCj8e+ j3c6/lamk+Hlu0b2iMnFtgocGjx6sSR+mC7VBUEtxEN1DvfyY1j+YP0zsPMtL7L/jgTX di2oTAhaagAEunJssDc/3faveuvn8G5U2baKV4yj5/yxYKZXY+HkPCkMHMG7Xuzlb/Qo EaCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=YNWdRMaI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n17si28465118eja.271.2021.01.03.15.18.23; Sun, 03 Jan 2021 15:18:46 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=YNWdRMaI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727318AbhACWg1 (ORCPT + 99 others); Sun, 3 Jan 2021 17:36:27 -0500 Received: from mail.kernel.org ([198.145.29.99]:42290 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726744AbhACWg1 (ORCPT ); Sun, 3 Jan 2021 17:36:27 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0C20A20773; Sun, 3 Jan 2021 22:35:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1609713346; bh=Me9+yYviHjIqHiUfSr0k4Que8xDqOAdBoV6RaYMLcWE=; h=From:To:Cc:Subject:Date:From; b=YNWdRMaIm4Ofh6VhIgM3VmR3x8tkW1KwbN5VnJUm+e3IO1xls5OFE6FvKXCa7B0gm /gMI1NMdFF95Lx6Dadb5Fu2JRbADMF2F6zcGhbILdWJ4uM47yaOJFIZoIpQKrRt0G6 pWDkimBgOqdKzRWL6oglNFxA3AR4t+5eMYRycpeanr5fySfQmaEWdid+qxD95BqC3M gTTurWEqJ9oGVm53kWjBVcixhEydLMj2o4Dr4tsjG9m94k7mt/JbxVXL/yo1cxyDsC 8YBak95rcld9TFYWnLmapAHJRx6+mMaUJgGUOWzQdk2/4VIvSpnfQZA7addD+/KSNN fiZNGtQF1pmaw== From: Arnd Bergmann To: Vaibhav Agarwal , Mark Greer , Johan Hovold , Alex Elder , Greg Kroah-Hartman , Nathan Chancellor , Nick Desaulniers Cc: Arnd Bergmann , Dan Carpenter , Coiby Xu , greybus-dev@lists.linaro.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, clang-built-linux@googlegroups.com Subject: [PATCH] staging: greybus: fix stack size warning with UBSAN Date: Sun, 3 Jan 2021 23:35:32 +0100 Message-Id: <20210103223541.2790855-1-arnd@kernel.org> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Arnd Bergmann 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. Signed-off-by: Arnd Bergmann --- drivers/staging/greybus/audio_topology.c | 106 ++++++++++------------- 1 file changed, 47 insertions(+), 59 deletions(-) diff --git a/drivers/staging/greybus/audio_topology.c b/drivers/staging/greybus/audio_topology.c index 96b8b29fe899..c03873915c20 100644 --- a/drivers/staging/greybus/audio_topology.c +++ b/drivers/staging/greybus/audio_topology.c @@ -974,6 +974,44 @@ static int gbaudio_widget_event(struct snd_soc_dapm_widget *w, return ret; } +static const struct snd_soc_dapm_widget gbaudio_widgets[] = { + [snd_soc_dapm_spk] = SND_SOC_DAPM_SPK("spk", gbcodec_event_spk), + [snd_soc_dapm_hp] = SND_SOC_DAPM_HP("hp", gbcodec_event_hp), + [snd_soc_dapm_mic] = SND_SOC_DAPM_MIC("mic", gbcodec_event_int_mic), + [snd_soc_dapm_output] = SND_SOC_DAPM_OUTPUT("output"), + [snd_soc_dapm_input] = SND_SOC_DAPM_INPUT("input"), + [snd_soc_dapm_switch] = SND_SOC_DAPM_SWITCH_E("switch", SND_SOC_NOPM, + 0, 0, NULL, + gbaudio_widget_event, + SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), + [snd_soc_dapm_pga] = SND_SOC_DAPM_PGA_E("pga", SND_SOC_NOPM, + 0, 0, NULL, 0, + gbaudio_widget_event, + SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), + [snd_soc_dapm_mixer] = SND_SOC_DAPM_MIXER_E("mixer", SND_SOC_NOPM, + 0, 0, NULL, 0, + gbaudio_widget_event, + SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), + [snd_soc_dapm_mux] = SND_SOC_DAPM_MUX_E("mux", SND_SOC_NOPM, + 0, 0, NULL, + gbaudio_widget_event, + SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), + [snd_soc_dapm_aif_in] = SND_SOC_DAPM_AIF_IN_E("aif_in", NULL, 0, + SND_SOC_NOPM, 0, 0, + gbaudio_widget_event, + SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), + [snd_soc_dapm_aif_out] = SND_SOC_DAPM_AIF_OUT_E("aif_out", NULL, 0, + SND_SOC_NOPM, 0, 0, + gbaudio_widget_event, + SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), +}; + static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module, struct snd_soc_dapm_widget *dw, struct gb_audio_widget *w, int *w_size) @@ -1050,78 +1088,28 @@ static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module, strlcpy(temp_name, w->name, NAME_SIZE); snprintf(w->name, NAME_SIZE, "GB %d %s", module->dev_id, temp_name); + if (w->type > ARRAY_SIZE(gbaudio_widgets)) { + ret = -EINVAL; + goto error; + } + *dw = gbaudio_widgets[w->type]; + dw->name = w->name; + switch (w->type) { case snd_soc_dapm_spk: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_SPK(w->name, gbcodec_event_spk); module->op_devices |= GBAUDIO_DEVICE_OUT_SPEAKER; break; case snd_soc_dapm_hp: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_HP(w->name, gbcodec_event_hp); module->op_devices |= (GBAUDIO_DEVICE_OUT_WIRED_HEADSET - | GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE); + | GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE), module->ip_devices |= GBAUDIO_DEVICE_IN_WIRED_HEADSET; break; case snd_soc_dapm_mic: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_MIC(w->name, gbcodec_event_int_mic); module->ip_devices |= GBAUDIO_DEVICE_IN_BUILTIN_MIC; break; - case snd_soc_dapm_output: - *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_OUTPUT(w->name); - break; - case snd_soc_dapm_input: - *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_INPUT(w->name); - break; - case snd_soc_dapm_switch: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_SWITCH_E(w->name, SND_SOC_NOPM, 0, 0, - widget_kctls, - gbaudio_widget_event, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD); - break; - case snd_soc_dapm_pga: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_PGA_E(w->name, SND_SOC_NOPM, 0, 0, NULL, 0, - gbaudio_widget_event, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD); - break; - case snd_soc_dapm_mixer: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_MIXER_E(w->name, SND_SOC_NOPM, 0, 0, NULL, - 0, gbaudio_widget_event, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD); - break; - case snd_soc_dapm_mux: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_MUX_E(w->name, SND_SOC_NOPM, 0, 0, - widget_kctls, gbaudio_widget_event, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD); - break; case snd_soc_dapm_aif_in: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_AIF_IN_E(w->name, w->sname, 0, - SND_SOC_NOPM, - 0, 0, gbaudio_widget_event, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD); - break; case snd_soc_dapm_aif_out: - *dw = (struct snd_soc_dapm_widget) - SND_SOC_DAPM_AIF_OUT_E(w->name, w->sname, 0, - SND_SOC_NOPM, - 0, 0, gbaudio_widget_event, - SND_SOC_DAPM_PRE_PMU | - SND_SOC_DAPM_POST_PMD); - break; - default: - ret = -EINVAL; - goto error; + dw->sname = w->sname; } dev_dbg(module->dev, "%s: widget of type %d created\n", dw->name, -- 2.29.2