OSDN Git Service

dsa: sja1105: dynamically allocate stats structure
authorArnd Bergmann <arnd@arndb.de>
Tue, 5 May 2020 15:38:19 +0000 (17:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 May 2020 00:47:32 +0000 (17:47 -0700)
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/sja1105/sja1105_ethtool.c

index d742ffc..709f035 100644 (file)
@@ -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,