Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dsa: sja1105: dynamically allocate stats structure

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>

authored by

Arnd Bergmann and committed by
David S. Miller
ae1804de 9e330bf4

+74 -70
+74 -70
drivers/net/dsa/sja1105/sja1105_ethtool.c
··· 421 421 void sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data) 422 422 { 423 423 struct sja1105_private *priv = ds->priv; 424 - struct sja1105_port_status status; 424 + struct sja1105_port_status *status; 425 425 int rc, i, k = 0; 426 426 427 - memset(&status, 0, sizeof(status)); 427 + status = kzalloc(sizeof(*status), GFP_KERNEL); 428 + if (!status) 429 + goto out; 428 430 429 - rc = sja1105_port_status_get(priv, &status, port); 431 + rc = sja1105_port_status_get(priv, status, port); 430 432 if (rc < 0) { 431 433 dev_err(ds->dev, "Failed to read port %d counters: %d\n", 432 434 port, rc); 433 - return; 435 + goto out; 434 436 } 435 437 memset(data, 0, ARRAY_SIZE(sja1105_port_stats) * sizeof(u64)); 436 - data[k++] = status.mac.n_runt; 437 - data[k++] = status.mac.n_soferr; 438 - data[k++] = status.mac.n_alignerr; 439 - data[k++] = status.mac.n_miierr; 440 - data[k++] = status.mac.typeerr; 441 - data[k++] = status.mac.sizeerr; 442 - data[k++] = status.mac.tctimeout; 443 - data[k++] = status.mac.priorerr; 444 - data[k++] = status.mac.nomaster; 445 - data[k++] = status.mac.memov; 446 - data[k++] = status.mac.memerr; 447 - data[k++] = status.mac.invtyp; 448 - data[k++] = status.mac.intcyov; 449 - data[k++] = status.mac.domerr; 450 - data[k++] = status.mac.pcfbagdrop; 451 - data[k++] = status.mac.spcprior; 452 - data[k++] = status.mac.ageprior; 453 - data[k++] = status.mac.portdrop; 454 - data[k++] = status.mac.lendrop; 455 - data[k++] = status.mac.bagdrop; 456 - data[k++] = status.mac.policeerr; 457 - data[k++] = status.mac.drpnona664err; 458 - data[k++] = status.mac.spcerr; 459 - data[k++] = status.mac.agedrp; 460 - data[k++] = status.hl1.n_n664err; 461 - data[k++] = status.hl1.n_vlanerr; 462 - data[k++] = status.hl1.n_unreleased; 463 - data[k++] = status.hl1.n_sizeerr; 464 - data[k++] = status.hl1.n_crcerr; 465 - data[k++] = status.hl1.n_vlnotfound; 466 - data[k++] = status.hl1.n_ctpolerr; 467 - data[k++] = status.hl1.n_polerr; 468 - data[k++] = status.hl1.n_rxfrm; 469 - data[k++] = status.hl1.n_rxbyte; 470 - data[k++] = status.hl1.n_txfrm; 471 - data[k++] = status.hl1.n_txbyte; 472 - data[k++] = status.hl2.n_qfull; 473 - data[k++] = status.hl2.n_part_drop; 474 - data[k++] = status.hl2.n_egr_disabled; 475 - data[k++] = status.hl2.n_not_reach; 438 + data[k++] = status->mac.n_runt; 439 + data[k++] = status->mac.n_soferr; 440 + data[k++] = status->mac.n_alignerr; 441 + data[k++] = status->mac.n_miierr; 442 + data[k++] = status->mac.typeerr; 443 + data[k++] = status->mac.sizeerr; 444 + data[k++] = status->mac.tctimeout; 445 + data[k++] = status->mac.priorerr; 446 + data[k++] = status->mac.nomaster; 447 + data[k++] = status->mac.memov; 448 + data[k++] = status->mac.memerr; 449 + data[k++] = status->mac.invtyp; 450 + data[k++] = status->mac.intcyov; 451 + data[k++] = status->mac.domerr; 452 + data[k++] = status->mac.pcfbagdrop; 453 + data[k++] = status->mac.spcprior; 454 + data[k++] = status->mac.ageprior; 455 + data[k++] = status->mac.portdrop; 456 + data[k++] = status->mac.lendrop; 457 + data[k++] = status->mac.bagdrop; 458 + data[k++] = status->mac.policeerr; 459 + data[k++] = status->mac.drpnona664err; 460 + data[k++] = status->mac.spcerr; 461 + data[k++] = status->mac.agedrp; 462 + data[k++] = status->hl1.n_n664err; 463 + data[k++] = status->hl1.n_vlanerr; 464 + data[k++] = status->hl1.n_unreleased; 465 + data[k++] = status->hl1.n_sizeerr; 466 + data[k++] = status->hl1.n_crcerr; 467 + data[k++] = status->hl1.n_vlnotfound; 468 + data[k++] = status->hl1.n_ctpolerr; 469 + data[k++] = status->hl1.n_polerr; 470 + data[k++] = status->hl1.n_rxfrm; 471 + data[k++] = status->hl1.n_rxbyte; 472 + data[k++] = status->hl1.n_txfrm; 473 + data[k++] = status->hl1.n_txbyte; 474 + data[k++] = status->hl2.n_qfull; 475 + data[k++] = status->hl2.n_part_drop; 476 + data[k++] = status->hl2.n_egr_disabled; 477 + data[k++] = status->hl2.n_not_reach; 476 478 477 479 if (priv->info->device_id == SJA1105E_DEVICE_ID || 478 480 priv->info->device_id == SJA1105T_DEVICE_ID) 479 - return; 481 + goto out;; 480 482 481 483 memset(data + k, 0, ARRAY_SIZE(sja1105pqrs_extra_port_stats) * 482 484 sizeof(u64)); 483 485 for (i = 0; i < 8; i++) { 484 - data[k++] = status.hl2.qlevel_hwm[i]; 485 - data[k++] = status.hl2.qlevel[i]; 486 + data[k++] = status->hl2.qlevel_hwm[i]; 487 + data[k++] = status->hl2.qlevel[i]; 486 488 } 487 - data[k++] = status.ether.n_drops_nolearn; 488 - data[k++] = status.ether.n_drops_noroute; 489 - data[k++] = status.ether.n_drops_ill_dtag; 490 - data[k++] = status.ether.n_drops_dtag; 491 - data[k++] = status.ether.n_drops_sotag; 492 - data[k++] = status.ether.n_drops_sitag; 493 - data[k++] = status.ether.n_drops_utag; 494 - data[k++] = status.ether.n_tx_bytes_1024_2047; 495 - data[k++] = status.ether.n_tx_bytes_512_1023; 496 - data[k++] = status.ether.n_tx_bytes_256_511; 497 - data[k++] = status.ether.n_tx_bytes_128_255; 498 - data[k++] = status.ether.n_tx_bytes_65_127; 499 - data[k++] = status.ether.n_tx_bytes_64; 500 - data[k++] = status.ether.n_tx_mcast; 501 - data[k++] = status.ether.n_tx_bcast; 502 - data[k++] = status.ether.n_rx_bytes_1024_2047; 503 - data[k++] = status.ether.n_rx_bytes_512_1023; 504 - data[k++] = status.ether.n_rx_bytes_256_511; 505 - data[k++] = status.ether.n_rx_bytes_128_255; 506 - data[k++] = status.ether.n_rx_bytes_65_127; 507 - data[k++] = status.ether.n_rx_bytes_64; 508 - data[k++] = status.ether.n_rx_mcast; 509 - data[k++] = status.ether.n_rx_bcast; 489 + data[k++] = status->ether.n_drops_nolearn; 490 + data[k++] = status->ether.n_drops_noroute; 491 + data[k++] = status->ether.n_drops_ill_dtag; 492 + data[k++] = status->ether.n_drops_dtag; 493 + data[k++] = status->ether.n_drops_sotag; 494 + data[k++] = status->ether.n_drops_sitag; 495 + data[k++] = status->ether.n_drops_utag; 496 + data[k++] = status->ether.n_tx_bytes_1024_2047; 497 + data[k++] = status->ether.n_tx_bytes_512_1023; 498 + data[k++] = status->ether.n_tx_bytes_256_511; 499 + data[k++] = status->ether.n_tx_bytes_128_255; 500 + data[k++] = status->ether.n_tx_bytes_65_127; 501 + data[k++] = status->ether.n_tx_bytes_64; 502 + data[k++] = status->ether.n_tx_mcast; 503 + data[k++] = status->ether.n_tx_bcast; 504 + data[k++] = status->ether.n_rx_bytes_1024_2047; 505 + data[k++] = status->ether.n_rx_bytes_512_1023; 506 + data[k++] = status->ether.n_rx_bytes_256_511; 507 + data[k++] = status->ether.n_rx_bytes_128_255; 508 + data[k++] = status->ether.n_rx_bytes_65_127; 509 + data[k++] = status->ether.n_rx_bytes_64; 510 + data[k++] = status->ether.n_rx_mcast; 511 + data[k++] = status->ether.n_rx_bcast; 512 + out: 513 + kfree(status); 510 514 } 511 515 512 516 void sja1105_get_strings(struct dsa_switch *ds, int port,