Skip to content

Commit c646d10

Browse files
vladimirolteandavem330
authored andcommitted
net: enetc: don't overwrite the RSS indirection table when initializing
After the blamed patch, all RX traffic gets hashed to CPU 0 because the hashing indirection table set up in: enetc_pf_probe -> enetc_alloc_si_resources -> enetc_configure_si -> enetc_setup_default_rss_table is overwritten later in: enetc_pf_probe -> enetc_init_port_rss_memory which zero-initializes the entire port RSS table in order to avoid ECC errors. The trouble really is that enetc_init_port_rss_memory really neads enetc_alloc_si_resources to be called, because it depends upon enetc_alloc_cbdr and enetc_setup_cbdr. But that whole enetc_configure_si thing could have been better thought out, it has nothing to do in a function called "alloc_si_resources", especially since its counterpart, "free_si_resources", does nothing to unwind the configuration of the SI. The point is, we need to pull out enetc_configure_si out of enetc_alloc_resources, and move it after enetc_init_port_rss_memory. This allows us to set up the default RSS indirection table after initializing the memory. Fixes: 07bf34a ("net: enetc: initialize the RFS and RSS memories") Cc: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 8bd2a05 commit c646d10

File tree

4 files changed

+18
-8
lines changed

4 files changed

+18
-8
lines changed

drivers/net/ethernet/freescale/enetc/enetc.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,13 +1058,12 @@ static int enetc_setup_default_rss_table(struct enetc_si *si, int num_groups)
10581058
return 0;
10591059
}
10601060

1061-
static int enetc_configure_si(struct enetc_ndev_priv *priv)
1061+
int enetc_configure_si(struct enetc_ndev_priv *priv)
10621062
{
10631063
struct enetc_si *si = priv->si;
10641064
struct enetc_hw *hw = &si->hw;
10651065
int err;
10661066

1067-
enetc_setup_cbdr(hw, &si->cbd_ring);
10681067
/* set SI cache attributes */
10691068
enetc_wr(hw, ENETC_SICAR0,
10701069
ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT);
@@ -1112,21 +1111,17 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv)
11121111
if (err)
11131112
return err;
11141113

1114+
enetc_setup_cbdr(&si->hw, &si->cbd_ring);
1115+
11151116
priv->cls_rules = kcalloc(si->num_fs_entries, sizeof(*priv->cls_rules),
11161117
GFP_KERNEL);
11171118
if (!priv->cls_rules) {
11181119
err = -ENOMEM;
11191120
goto err_alloc_cls;
11201121
}
11211122

1122-
err = enetc_configure_si(priv);
1123-
if (err)
1124-
goto err_config_si;
1125-
11261123
return 0;
11271124

1128-
err_config_si:
1129-
kfree(priv->cls_rules);
11301125
err_alloc_cls:
11311126
enetc_clear_cbdr(&si->hw);
11321127
enetc_free_cbdr(priv->dev, &si->cbd_ring);

drivers/net/ethernet/freescale/enetc/enetc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ void enetc_get_si_caps(struct enetc_si *si);
292292
void enetc_init_si_rings_params(struct enetc_ndev_priv *priv);
293293
int enetc_alloc_si_resources(struct enetc_ndev_priv *priv);
294294
void enetc_free_si_resources(struct enetc_ndev_priv *priv);
295+
int enetc_configure_si(struct enetc_ndev_priv *priv);
295296

296297
int enetc_open(struct net_device *ndev);
297298
int enetc_close(struct net_device *ndev);

drivers/net/ethernet/freescale/enetc/enetc_pf.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,12 @@ static int enetc_pf_probe(struct pci_dev *pdev,
11081108
goto err_init_port_rss;
11091109
}
11101110

1111+
err = enetc_configure_si(priv);
1112+
if (err) {
1113+
dev_err(&pdev->dev, "Failed to configure SI\n");
1114+
goto err_config_si;
1115+
}
1116+
11111117
err = enetc_alloc_msix(priv);
11121118
if (err) {
11131119
dev_err(&pdev->dev, "MSIX alloc failed\n");
@@ -1136,6 +1142,7 @@ static int enetc_pf_probe(struct pci_dev *pdev,
11361142
enetc_mdiobus_destroy(pf);
11371143
err_mdiobus_create:
11381144
enetc_free_msix(priv);
1145+
err_config_si:
11391146
err_init_port_rss:
11401147
err_init_port_rfs:
11411148
err_alloc_msix:

drivers/net/ethernet/freescale/enetc/enetc_vf.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,12 @@ static int enetc_vf_probe(struct pci_dev *pdev,
171171
goto err_alloc_si_res;
172172
}
173173

174+
err = enetc_configure_si(priv);
175+
if (err) {
176+
dev_err(&pdev->dev, "Failed to configure SI\n");
177+
goto err_config_si;
178+
}
179+
174180
err = enetc_alloc_msix(priv);
175181
if (err) {
176182
dev_err(&pdev->dev, "MSIX alloc failed\n");
@@ -187,6 +193,7 @@ static int enetc_vf_probe(struct pci_dev *pdev,
187193

188194
err_reg_netdev:
189195
enetc_free_msix(priv);
196+
err_config_si:
190197
err_alloc_msix:
191198
enetc_free_si_resources(priv);
192199
err_alloc_si_res:

0 commit comments

Comments
 (0)