Skip to content

Commit 3b734ff

Browse files
jpirkodavem330
authored andcommitted
nfp: flower: fix error path during representor creation
Don't store repr pointer to reprs array until the representor is successfully created. This avoids message about "representor destruction" even when it was never created. Also it cleans-up the flow. Also, check return value after port alloc. Signed-off-by: Jiri Pirko <[email protected]> Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 6d9f868 commit 3b734ff

File tree

3 files changed

+19
-4
lines changed

3 files changed

+19
-4
lines changed

drivers/net/ethernet/netronome/nfp/flower/main.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,16 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app,
247247
err = -ENOMEM;
248248
goto err_reprs_clean;
249249
}
250-
RCU_INIT_POINTER(reprs->reprs[i], repr);
251250

252251
/* For now we only support 1 PF */
253252
WARN_ON(repr_type == NFP_REPR_TYPE_PF && i);
254253

255254
port = nfp_port_alloc(app, port_type, repr);
255+
if (IS_ERR(port)) {
256+
err = PTR_ERR(port);
257+
nfp_repr_free(repr);
258+
goto err_reprs_clean;
259+
}
256260
if (repr_type == NFP_REPR_TYPE_PF) {
257261
port->pf_id = i;
258262
port->vnic = priv->nn->dp.ctrl_bar;
@@ -271,9 +275,11 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app,
271275
port_id, port, priv->nn->dp.netdev);
272276
if (err) {
273277
nfp_port_free(port);
278+
nfp_repr_free(repr);
274279
goto err_reprs_clean;
275280
}
276281

282+
RCU_INIT_POINTER(reprs->reprs[i], repr);
277283
nfp_info(app->cpp, "%s%d Representor(%s) created\n",
278284
repr_type == NFP_REPR_TYPE_PF ? "PF" : "VF", i,
279285
repr->name);
@@ -344,16 +350,17 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv)
344350
err = -ENOMEM;
345351
goto err_reprs_clean;
346352
}
347-
RCU_INIT_POINTER(reprs->reprs[phys_port], repr);
348353

349354
port = nfp_port_alloc(app, NFP_PORT_PHYS_PORT, repr);
350355
if (IS_ERR(port)) {
351356
err = PTR_ERR(port);
357+
nfp_repr_free(repr);
352358
goto err_reprs_clean;
353359
}
354360
err = nfp_port_init_phy_port(app->pf, app, port, i);
355361
if (err) {
356362
nfp_port_free(port);
363+
nfp_repr_free(repr);
357364
goto err_reprs_clean;
358365
}
359366

@@ -365,6 +372,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv)
365372
cmsg_port_id, port, priv->nn->dp.netdev);
366373
if (err) {
367374
nfp_port_free(port);
375+
nfp_repr_free(repr);
368376
goto err_reprs_clean;
369377
}
370378

@@ -373,6 +381,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv)
373381
eth_tbl->ports[i].base,
374382
phys_port);
375383

384+
RCU_INIT_POINTER(reprs->reprs[phys_port], repr);
376385
nfp_info(app->cpp, "Phys Port %d Representor(%s) created\n",
377386
phys_port, repr->name);
378387
}

drivers/net/ethernet/netronome/nfp/nfp_net_repr.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,12 +348,17 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
348348
return err;
349349
}
350350

351-
static void nfp_repr_free(struct nfp_repr *repr)
351+
static void __nfp_repr_free(struct nfp_repr *repr)
352352
{
353353
free_percpu(repr->stats);
354354
free_netdev(repr->netdev);
355355
}
356356

357+
void nfp_repr_free(struct net_device *netdev)
358+
{
359+
__nfp_repr_free(netdev_priv(netdev));
360+
}
361+
357362
struct net_device *nfp_repr_alloc(struct nfp_app *app)
358363
{
359364
struct net_device *netdev;
@@ -385,7 +390,7 @@ static void nfp_repr_clean_and_free(struct nfp_repr *repr)
385390
nfp_info(repr->app->cpp, "Destroying Representor(%s)\n",
386391
repr->netdev->name);
387392
nfp_repr_clean(repr);
388-
nfp_repr_free(repr);
393+
__nfp_repr_free(repr);
389394
}
390395

391396
void nfp_reprs_clean_and_free(struct nfp_app *app, struct nfp_reprs *reprs)

drivers/net/ethernet/netronome/nfp/nfp_net_repr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ void nfp_repr_inc_rx_stats(struct net_device *netdev, unsigned int len);
123123
int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
124124
u32 cmsg_port_id, struct nfp_port *port,
125125
struct net_device *pf_netdev);
126+
void nfp_repr_free(struct net_device *netdev);
126127
struct net_device *nfp_repr_alloc(struct nfp_app *app);
127128
void nfp_reprs_clean_and_free(struct nfp_app *app, struct nfp_reprs *reprs);
128129
void nfp_reprs_clean_and_free_by_type(struct nfp_app *app,

0 commit comments

Comments
 (0)