Skip to content

Commit 208c6b9

Browse files
wingmankwokdavem330
authored andcommitted
net: netcp: Fixes error in oversized memory allocation for statistics storage
The CPSW driver keeps internally some, but not all, of the statistics available in the hw statistics modules. Furthermore, some of the locations in the hw statistics modules are reserved and contain no useful information. Prior to this patch, the driver allocates memory of the size of the the whole hw statistics modules, instead of the size of statistics-entries-interested-in (i.e. et_stats), for internal storage. This patch fixes that. Signed-off-by: WingMan Kwok <w-kwok2@ti.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a94bcd0 commit 208c6b9

File tree

1 file changed

+21
-25
lines changed

1 file changed

+21
-25
lines changed

drivers/net/ethernet/ti/netcp_ethss.c

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,6 @@ struct xgbe_hw_stats {
295295
u32 rx_dma_overruns;
296296
};
297297

298-
#define XGBE10_NUM_STAT_ENTRIES (sizeof(struct xgbe_hw_stats)/sizeof(u32))
299-
300298
struct gbenu_ss_regs {
301299
u32 id_ver;
302300
u32 synce_count; /* NU */
@@ -480,7 +478,6 @@ struct gbenu_hw_stats {
480478
u32 tx_pri7_drop_bcnt;
481479
};
482480

483-
#define GBENU_NUM_HW_STAT_ENTRIES (sizeof(struct gbenu_hw_stats) / sizeof(u32))
484481
#define GBENU_HW_STATS_REG_MAP_SZ 0x200
485482

486483
struct gbe_ss_regs {
@@ -615,7 +612,6 @@ struct gbe_hw_stats {
615612
u32 rx_dma_overruns;
616613
};
617614

618-
#define GBE13_NUM_HW_STAT_ENTRIES (sizeof(struct gbe_hw_stats)/sizeof(u32))
619615
#define GBE_MAX_HW_STAT_MODS 9
620616
#define GBE_HW_STATS_REG_MAP_SZ 0x100
621617

@@ -2555,10 +2551,12 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
25552551
}
25562552
gbe_dev->xgbe_serdes_regs = regs;
25572553

2554+
gbe_dev->et_stats = xgbe10_et_stats;
2555+
gbe_dev->num_et_stats = ARRAY_SIZE(xgbe10_et_stats);
2556+
25582557
gbe_dev->hw_stats = devm_kzalloc(gbe_dev->dev,
2559-
XGBE10_NUM_STAT_ENTRIES *
2560-
(gbe_dev->max_num_ports) * sizeof(u64),
2561-
GFP_KERNEL);
2558+
gbe_dev->num_et_stats * sizeof(u64),
2559+
GFP_KERNEL);
25622560
if (!gbe_dev->hw_stats) {
25632561
dev_err(gbe_dev->dev, "hw_stats memory allocation failed\n");
25642562
return -ENOMEM;
@@ -2577,8 +2575,6 @@ static int set_xgbe_ethss10_priv(struct gbe_priv *gbe_dev,
25772575
gbe_dev->ale_ports = gbe_dev->max_num_ports;
25782576
gbe_dev->host_port = XGBE10_HOST_PORT_NUM;
25792577
gbe_dev->ale_entries = XGBE10_NUM_ALE_ENTRIES;
2580-
gbe_dev->et_stats = xgbe10_et_stats;
2581-
gbe_dev->num_et_stats = ARRAY_SIZE(xgbe10_et_stats);
25822578
gbe_dev->stats_en_mask = (1 << (gbe_dev->max_num_ports)) - 1;
25832579

25842580
/* Subsystem registers */
@@ -2663,10 +2659,12 @@ static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev,
26632659
}
26642660
gbe_dev->switch_regs = regs;
26652661

2662+
gbe_dev->et_stats = gbe13_et_stats;
2663+
gbe_dev->num_et_stats = ARRAY_SIZE(gbe13_et_stats);
2664+
26662665
gbe_dev->hw_stats = devm_kzalloc(gbe_dev->dev,
2667-
GBE13_NUM_HW_STAT_ENTRIES *
2668-
gbe_dev->max_num_slaves * sizeof(u64),
2669-
GFP_KERNEL);
2666+
gbe_dev->num_et_stats * sizeof(u64),
2667+
GFP_KERNEL);
26702668
if (!gbe_dev->hw_stats) {
26712669
dev_err(gbe_dev->dev, "hw_stats memory allocation failed\n");
26722670
return -ENOMEM;
@@ -2689,8 +2687,6 @@ static int set_gbe_ethss14_priv(struct gbe_priv *gbe_dev,
26892687
gbe_dev->ale_ports = gbe_dev->max_num_ports;
26902688
gbe_dev->host_port = GBE13_HOST_PORT_NUM;
26912689
gbe_dev->ale_entries = GBE13_NUM_ALE_ENTRIES;
2692-
gbe_dev->et_stats = gbe13_et_stats;
2693-
gbe_dev->num_et_stats = ARRAY_SIZE(gbe13_et_stats);
26942690
gbe_dev->stats_en_mask = GBE13_REG_VAL_STAT_ENABLE_ALL;
26952691

26962692
/* Subsystem registers */
@@ -2717,10 +2713,18 @@ static int set_gbenu_ethss_priv(struct gbe_priv *gbe_dev,
27172713
void __iomem *regs;
27182714
int i, ret;
27192715

2716+
gbe_dev->et_stats = gbenu_et_stats;
2717+
2718+
if (IS_SS_ID_NU(gbe_dev))
2719+
gbe_dev->num_et_stats = GBENU_ET_STATS_HOST_SIZE +
2720+
(gbe_dev->max_num_slaves * GBENU_ET_STATS_PORT_SIZE);
2721+
else
2722+
gbe_dev->num_et_stats = GBENU_ET_STATS_HOST_SIZE +
2723+
GBENU_ET_STATS_PORT_SIZE;
2724+
27202725
gbe_dev->hw_stats = devm_kzalloc(gbe_dev->dev,
2721-
GBENU_NUM_HW_STAT_ENTRIES *
2722-
(gbe_dev->max_num_ports) * sizeof(u64),
2723-
GFP_KERNEL);
2726+
gbe_dev->num_et_stats * sizeof(u64),
2727+
GFP_KERNEL);
27242728
if (!gbe_dev->hw_stats) {
27252729
dev_err(gbe_dev->dev, "hw_stats memory allocation failed\n");
27262730
return -ENOMEM;
@@ -2753,16 +2757,8 @@ static int set_gbenu_ethss_priv(struct gbe_priv *gbe_dev,
27532757
gbe_dev->ale_ports = gbe_dev->max_num_ports;
27542758
gbe_dev->host_port = GBENU_HOST_PORT_NUM;
27552759
gbe_dev->ale_entries = GBE13_NUM_ALE_ENTRIES;
2756-
gbe_dev->et_stats = gbenu_et_stats;
27572760
gbe_dev->stats_en_mask = (1 << (gbe_dev->max_num_ports)) - 1;
27582761

2759-
if (IS_SS_ID_NU(gbe_dev))
2760-
gbe_dev->num_et_stats = GBENU_ET_STATS_HOST_SIZE +
2761-
(gbe_dev->max_num_slaves * GBENU_ET_STATS_PORT_SIZE);
2762-
else
2763-
gbe_dev->num_et_stats = GBENU_ET_STATS_HOST_SIZE +
2764-
GBENU_ET_STATS_PORT_SIZE;
2765-
27662762
/* Subsystem registers */
27672763
GBENU_SET_REG_OFS(gbe_dev, ss_regs, id_ver);
27682764

0 commit comments

Comments
 (0)