* [PATCH] [net-next] dsa: sja1105: dynamically allocate stats structure
@ 2020-05-05 13:58 Arnd Bergmann
2020-05-05 14:04 ` Andrew Lunn
0 siblings, 1 reply; 3+ messages in thread
From: Arnd Bergmann @ 2020-05-05 13:58 UTC (permalink / raw)
To: Vladimir Oltean, Andrew Lunn, Vivien Didelot, Florian Fainelli,
David S. Miller
Cc: Arnd Bergmann, Vladimir Oltean, Nathan Chancellor, linux-kernel, netdev
The addition of sja1105_port_status_ether structure into the
statistics causes the frame size to go over the warning limit:
drivers/net/dsa/sja1105/sja1105_ethtool.c:421:6: error: stack frame size of 1104 bytes in function 'sja1105_get_ethtool_stats' [-Werror,-Wframe-larger-than=]
Use dynamic allocation to avoid this.
Fixes: 336aa67bd027 ("net: dsa: sja1105: show more ethtool statistics counters for P/Q/R/S")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
drivers/net/dsa/sja1105/sja1105_ethtool.c | 144 +++++++++++-----------
include/linux/warnings.h | 4 +-
2 files changed, 76 insertions(+), 72 deletions(-)
diff --git a/drivers/net/dsa/sja1105/sja1105_ethtool.c b/drivers/net/dsa/sja1105/sja1105_ethtool.c
index d742ffcbfce9..1f8bd4f2c004 100644
--- a/drivers/net/dsa/sja1105/sja1105_ethtool.c
+++ b/drivers/net/dsa/sja1105/sja1105_ethtool.c
@@ -421,92 +421,96 @@ static char sja1105pqrs_extra_port_stats[][ETH_GSTRING_LEN] = {
void sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data)
{
struct sja1105_private *priv = ds->priv;
- struct sja1105_port_status status;
+ struct sja1105_port_status *status;
int rc, i, k = 0;
- memset(&status, 0, sizeof(status));
+ status = kzalloc(sizeof(*status), GFP_KERNEL);
+ if (!status)
+ goto out;
- rc = sja1105_port_status_get(priv, &status, port);
+ rc = sja1105_port_status_get(priv, status, port);
if (rc < 0) {
dev_err(ds->dev, "Failed to read port %d counters: %d\n",
port, rc);
- return;
+ goto out;;
}
memset(data, 0, ARRAY_SIZE(sja1105_port_stats) * sizeof(u64));
- data[k++] = status.mac.n_runt;
- data[k++] = status.mac.n_soferr;
- data[k++] = status.mac.n_alignerr;
- data[k++] = status.mac.n_miierr;
- data[k++] = status.mac.typeerr;
- data[k++] = status.mac.sizeerr;
- data[k++] = status.mac.tctimeout;
- data[k++] = status.mac.priorerr;
- data[k++] = status.mac.nomaster;
- data[k++] = status.mac.memov;
- data[k++] = status.mac.memerr;
- data[k++] = status.mac.invtyp;
- data[k++] = status.mac.intcyov;
- data[k++] = status.mac.domerr;
- data[k++] = status.mac.pcfbagdrop;
- data[k++] = status.mac.spcprior;
- data[k++] = status.mac.ageprior;
- data[k++] = status.mac.portdrop;
- data[k++] = status.mac.lendrop;
- data[k++] = status.mac.bagdrop;
- data[k++] = status.mac.policeerr;
- data[k++] = status.mac.drpnona664err;
- data[k++] = status.mac.spcerr;
- data[k++] = status.mac.agedrp;
- data[k++] = status.hl1.n_n664err;
- data[k++] = status.hl1.n_vlanerr;
- data[k++] = status.hl1.n_unreleased;
- data[k++] = status.hl1.n_sizeerr;
- data[k++] = status.hl1.n_crcerr;
- data[k++] = status.hl1.n_vlnotfound;
- data[k++] = status.hl1.n_ctpolerr;
- data[k++] = status.hl1.n_polerr;
- data[k++] = status.hl1.n_rxfrm;
- data[k++] = status.hl1.n_rxbyte;
- data[k++] = status.hl1.n_txfrm;
- data[k++] = status.hl1.n_txbyte;
- data[k++] = status.hl2.n_qfull;
- data[k++] = status.hl2.n_part_drop;
- data[k++] = status.hl2.n_egr_disabled;
- data[k++] = status.hl2.n_not_reach;
+ data[k++] = status->mac.n_runt;
+ data[k++] = status->mac.n_soferr;
+ data[k++] = status->mac.n_alignerr;
+ data[k++] = status->mac.n_miierr;
+ data[k++] = status->mac.typeerr;
+ data[k++] = status->mac.sizeerr;
+ data[k++] = status->mac.tctimeout;
+ data[k++] = status->mac.priorerr;
+ data[k++] = status->mac.nomaster;
+ data[k++] = status->mac.memov;
+ data[k++] = status->mac.memerr;
+ data[k++] = status->mac.invtyp;
+ data[k++] = status->mac.intcyov;
+ data[k++] = status->mac.domerr;
+ data[k++] = status->mac.pcfbagdrop;
+ data[k++] = status->mac.spcprior;
+ data[k++] = status->mac.ageprior;
+ data[k++] = status->mac.portdrop;
+ data[k++] = status->mac.lendrop;
+ data[k++] = status->mac.bagdrop;
+ data[k++] = status->mac.policeerr;
+ data[k++] = status->mac.drpnona664err;
+ data[k++] = status->mac.spcerr;
+ data[k++] = status->mac.agedrp;
+ data[k++] = status->hl1.n_n664err;
+ data[k++] = status->hl1.n_vlanerr;
+ data[k++] = status->hl1.n_unreleased;
+ data[k++] = status->hl1.n_sizeerr;
+ data[k++] = status->hl1.n_crcerr;
+ data[k++] = status->hl1.n_vlnotfound;
+ data[k++] = status->hl1.n_ctpolerr;
+ data[k++] = status->hl1.n_polerr;
+ data[k++] = status->hl1.n_rxfrm;
+ data[k++] = status->hl1.n_rxbyte;
+ data[k++] = status->hl1.n_txfrm;
+ data[k++] = status->hl1.n_txbyte;
+ data[k++] = status->hl2.n_qfull;
+ data[k++] = status->hl2.n_part_drop;
+ data[k++] = status->hl2.n_egr_disabled;
+ data[k++] = status->hl2.n_not_reach;
if (priv->info->device_id == SJA1105E_DEVICE_ID ||
priv->info->device_id == SJA1105T_DEVICE_ID)
- return;
+ goto out;;
memset(data + k, 0, ARRAY_SIZE(sja1105pqrs_extra_port_stats) *
sizeof(u64));
for (i = 0; i < 8; i++) {
- data[k++] = status.hl2.qlevel_hwm[i];
- data[k++] = status.hl2.qlevel[i];
+ data[k++] = status->hl2.qlevel_hwm[i];
+ data[k++] = status->hl2.qlevel[i];
}
- data[k++] = status.ether.n_drops_nolearn;
- data[k++] = status.ether.n_drops_noroute;
- data[k++] = status.ether.n_drops_ill_dtag;
- data[k++] = status.ether.n_drops_dtag;
- data[k++] = status.ether.n_drops_sotag;
- data[k++] = status.ether.n_drops_sitag;
- data[k++] = status.ether.n_drops_utag;
- data[k++] = status.ether.n_tx_bytes_1024_2047;
- data[k++] = status.ether.n_tx_bytes_512_1023;
- data[k++] = status.ether.n_tx_bytes_256_511;
- data[k++] = status.ether.n_tx_bytes_128_255;
- data[k++] = status.ether.n_tx_bytes_65_127;
- data[k++] = status.ether.n_tx_bytes_64;
- data[k++] = status.ether.n_tx_mcast;
- data[k++] = status.ether.n_tx_bcast;
- data[k++] = status.ether.n_rx_bytes_1024_2047;
- data[k++] = status.ether.n_rx_bytes_512_1023;
- data[k++] = status.ether.n_rx_bytes_256_511;
- data[k++] = status.ether.n_rx_bytes_128_255;
- data[k++] = status.ether.n_rx_bytes_65_127;
- data[k++] = status.ether.n_rx_bytes_64;
- data[k++] = status.ether.n_rx_mcast;
- data[k++] = status.ether.n_rx_bcast;
+ data[k++] = status->ether.n_drops_nolearn;
+ data[k++] = status->ether.n_drops_noroute;
+ data[k++] = status->ether.n_drops_ill_dtag;
+ data[k++] = status->ether.n_drops_dtag;
+ data[k++] = status->ether.n_drops_sotag;
+ data[k++] = status->ether.n_drops_sitag;
+ data[k++] = status->ether.n_drops_utag;
+ data[k++] = status->ether.n_tx_bytes_1024_2047;
+ data[k++] = status->ether.n_tx_bytes_512_1023;
+ data[k++] = status->ether.n_tx_bytes_256_511;
+ data[k++] = status->ether.n_tx_bytes_128_255;
+ data[k++] = status->ether.n_tx_bytes_65_127;
+ data[k++] = status->ether.n_tx_bytes_64;
+ data[k++] = status->ether.n_tx_mcast;
+ data[k++] = status->ether.n_tx_bcast;
+ data[k++] = status->ether.n_rx_bytes_1024_2047;
+ data[k++] = status->ether.n_rx_bytes_512_1023;
+ data[k++] = status->ether.n_rx_bytes_256_511;
+ data[k++] = status->ether.n_rx_bytes_128_255;
+ data[k++] = status->ether.n_rx_bytes_65_127;
+ data[k++] = status->ether.n_rx_bytes_64;
+ data[k++] = status->ether.n_rx_mcast;
+ data[k++] = status->ether.n_rx_bcast;
+out:
+ kfree(status);
}
void sja1105_get_strings(struct dsa_switch *ds, int port,
diff --git a/include/linux/warnings.h b/include/linux/warnings.h
index c02563d62d5a..3d77f710df24 100644
--- a/include/linux/warnings.h
+++ b/include/linux/warnings.h
@@ -136,7 +136,7 @@ KBUILD_WARN(0, CLANG_8, "-Warc-repeated-use-of-weak")
KBUILD_WARN(0, CLANG_8, "-Warc-maybe-repeated-use-of-weak")
KBUILD_WARN(0, CLANG_8, "-Warray-bounds")
KBUILD_WARN(0, CLANG_8, "-Wasm")
-//KBUILD_WARN(0, CLANG_8, "-Wasm-ignored-qualifier")
+KBUILD_WARN(0, CLANG_8, "-Wasm-ignored-qualifier")
KBUILD_WARN(0, CLANG_8, "-Wasm-operand-widths")
KBUILD_WARN(0, CLANG_8, "-Watimport-in-framework-header")
KBUILD_WARN(0, CLANG_8, "-Wattributes")
@@ -169,7 +169,7 @@ KBUILD_WARN(0, CLANG_8, "-Wextra-tokens")
KBUILD_WARN(0, CLANG_8, "-Wenum-compare")
KBUILD_WARN(0, CLANG_8, "-Wenum-compare-switch")
KBUILD_WARN(0, CLANG_8, "-Wenum-too-large")
-//KBUILD_WARN(0, CLANG_8, "-Wexperimental-isel")
+KBUILD_WARN(0, CLANG_8, "-Wexperimental-isel")
KBUILD_WARN(0, CLANG_8, "-Wexplicit-initialize-call")
KBUILD_WARN(0, CLANG_8, "-Wfallback")
KBUILD_WARN(0, CLANG_8, "-Wflag-enum")
--
2.26.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] [net-next] dsa: sja1105: dynamically allocate stats structure
2020-05-05 13:58 [PATCH] [net-next] dsa: sja1105: dynamically allocate stats structure Arnd Bergmann
@ 2020-05-05 14:04 ` Andrew Lunn
2020-05-05 15:34 ` Arnd Bergmann
0 siblings, 1 reply; 3+ messages in thread
From: Andrew Lunn @ 2020-05-05 14:04 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Vladimir Oltean, Vivien Didelot, Florian Fainelli,
David S. Miller, Vladimir Oltean, Nathan Chancellor,
linux-kernel, netdev
> - rc = sja1105_port_status_get(priv, &status, port);
> + rc = sja1105_port_status_get(priv, status, port);
> if (rc < 0) {
> dev_err(ds->dev, "Failed to read port %d counters: %d\n",
> port, rc);
> - return;
> + goto out;;
Hi Arnd
I expect static checker people will drive by soon with a fix for the ;; :-)
Andrew
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] [net-next] dsa: sja1105: dynamically allocate stats structure
2020-05-05 14:04 ` Andrew Lunn
@ 2020-05-05 15:34 ` Arnd Bergmann
0 siblings, 0 replies; 3+ messages in thread
From: Arnd Bergmann @ 2020-05-05 15:34 UTC (permalink / raw)
To: Andrew Lunn
Cc: Vladimir Oltean, Vivien Didelot, Florian Fainelli,
David S. Miller, Vladimir Oltean, Nathan Chancellor,
linux-kernel, Networking
On Tue, May 5, 2020 at 4:04 PM Andrew Lunn <andrew@lunn.ch> wrote:
>
> > - rc = sja1105_port_status_get(priv, &status, port);
> > + rc = sja1105_port_status_get(priv, status, port);
> > if (rc < 0) {
> > dev_err(ds->dev, "Failed to read port %d counters: %d\n",
> > port, rc);
> > - return;
> > + goto out;;
>
> Hi Arnd
>
> I expect static checker people will drive by soon with a fix for the ;; :-)
I need to fix the patch up anyway, as it accidentally included an unrelated
change that fails to apply. Fixed now.
Arnd
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-05-05 15:34 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-05 13:58 [PATCH] [net-next] dsa: sja1105: dynamically allocate stats structure Arnd Bergmann
2020-05-05 14:04 ` Andrew Lunn
2020-05-05 15:34 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).