]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mlxsw: spectrum_router: Allocate FID prior to RIF configuration
authorIdo Schimmel <idosch@mellanox.com>
Fri, 26 May 2017 06:37:32 +0000 (08:37 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 May 2017 19:18:47 +0000 (15:18 -0400)
The following patches are going to re-arrange the FID and RIF code, so
that when the RIF is configured to the device based on the information
present in the RIF struct (which points to a FID).

For this reason, move the FID allocation to just before the RIF
configuration.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 7f1054f4511b3d8bf208c2dcc42513c0e60f9475..c8d136c514448fbcc461988a57d1a7be25397253 100644 (file)
@@ -3018,26 +3018,26 @@ mlxsw_sp_port_vlan_rif_sp_create(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
        if (rif_index == MLXSW_SP_INVALID_INDEX_RIF)
                return ERR_PTR(-ERANGE);
 
+       fid = mlxsw_sp_rif_sp_to_fid(rif_index);
+       f = mlxsw_sp_rfid_alloc(fid, l3_dev);
+       if (!f)
+               return ERR_PTR(-ENOMEM);
+
        vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id ? : RT_TABLE_MAIN);
-       if (IS_ERR(vr))
-               return ERR_CAST(vr);
+       if (IS_ERR(vr)) {
+               err = PTR_ERR(vr);
+               goto err_vr_get;
+       }
 
        err = mlxsw_sp_port_vlan_rif_sp_op(mlxsw_sp_port_vlan, vr->id, l3_dev,
                                           rif_index, true);
        if (err)
                goto err_port_vlan_rif_sp_op;
 
-       fid = mlxsw_sp_rif_sp_to_fid(rif_index);
        err = mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, fid, true);
        if (err)
                goto err_rif_fdb_op;
 
-       f = mlxsw_sp_rfid_alloc(fid, l3_dev);
-       if (!f) {
-               err = -ENOMEM;
-               goto err_rfid_alloc;
-       }
-
        rif = mlxsw_sp_rif_alloc(rif_index, vr->id, l3_dev, f);
        if (!rif) {
                err = -ENOMEM;
@@ -3060,14 +3060,14 @@ mlxsw_sp_port_vlan_rif_sp_create(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
        return rif;
 
 err_rif_alloc:
-       kfree(f);
-err_rfid_alloc:
        mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, fid, false);
 err_rif_fdb_op:
        mlxsw_sp_port_vlan_rif_sp_op(mlxsw_sp_port_vlan, vr->id, l3_dev,
                                     rif_index, false);
 err_port_vlan_rif_sp_op:
        mlxsw_sp_vr_put(vr);
+err_vr_get:
+       kfree(f);
        return ERR_PTR(err);
 }
 
@@ -3094,14 +3094,13 @@ mlxsw_sp_port_vlan_rif_sp_destroy(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
 
        kfree(rif);
 
-       kfree(f);
-
        mlxsw_sp_rif_fdb_op(mlxsw_sp, l3_dev->dev_addr, fid, false);
 
        mlxsw_sp_port_vlan_rif_sp_op(mlxsw_sp_port_vlan, vr->id, l3_dev,
                                     rif_index, false);
 
        mlxsw_sp_vr_put(vr);
+       kfree(f);
 }
 
 static int