Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> --- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 4 ++-- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 8 ++++---- drivers/net/ethernet/mscc/ocelot_flower.c | 4 ++-- drivers/net/ethernet/mscc/ocelot_tc.c | 4 ++-- drivers/net/ethernet/netronome/nfp/flower/offload.c | 8 ++++---- net/core/flow_offload.c | 12 +++++++++--- net/dsa/slave.c | 4 ++-- 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 1e36f16cba00..b9a10a2a5ff5 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -741,10 +741,10 @@ mlx5e_rep_indr_setup_tc_block(struct net_device *netdev, mlx5e_rep_indr_setup_block_cb, indr_priv, indr_priv, mlx5e_rep_indr_tc_block_unbind); - if (!block_cb) { + if (IS_ERR(block_cb)) { list_del(&indr_priv->list); kfree(indr_priv); - return -ENOMEM; + return PTR_ERR(block_cb); } flow_block_cb_add(block_cb, f); diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 0340717aab93..197c123acadf 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -1582,9 +1582,9 @@ mlxsw_sp_setup_tc_block_flower_bind(struct mlxsw_sp_port *mlxsw_sp_port, mlxsw_sp_setup_tc_block_cb_flower, mlxsw_sp, acl_block, mlxsw_sp_tc_block_flower_release); - if (!block_cb) { + if (IS_ERR(block_cb)) { mlxsw_sp_acl_block_destroy(acl_block); - err = -ENOMEM; + err = PTR_ERR(block_cb); goto err_cb_register; } register_block = true; @@ -1664,8 +1664,8 @@ static int mlxsw_sp_setup_tc_block(struct mlxsw_sp_port *mlxsw_sp_port, case TC_BLOCK_BIND: block_cb = flow_block_cb_alloc(f->net, cb, mlxsw_sp_port, mlxsw_sp_port, NULL); - if (!block_cb) - return -ENOMEM; + if (IS_ERR(block_cb)) + return PTR_ERR(block_cb); err = mlxsw_sp_setup_tc_block_flower_bind(mlxsw_sp_port, f, ingress); if (err) { diff --git a/drivers/net/ethernet/mscc/ocelot_flower.c b/drivers/net/ethernet/mscc/ocelot_flower.c index fa5a3bf22ede..3b9e4219ac7a 100644 --- a/drivers/net/ethernet/mscc/ocelot_flower.c +++ b/drivers/net/ethernet/mscc/ocelot_flower.c @@ -327,8 +327,8 @@ int ocelot_setup_tc_block_flower_bind(struct ocelot_port *port, ocelot_setup_tc_block_cb_flower, port, port_block, ocelot_tc_block_unbind); - if (!block_cb) { - ret = -ENOMEM; + if (IS_ERR(block_cb)) { + ret = PTR_ERR(block_cb); goto err_cb_register; } flow_block_cb_add(block_cb, f); diff --git a/drivers/net/ethernet/mscc/ocelot_tc.c b/drivers/net/ethernet/mscc/ocelot_tc.c index 2c6eccab6547..14a9e178c3b8 100644 --- a/drivers/net/ethernet/mscc/ocelot_tc.c +++ b/drivers/net/ethernet/mscc/ocelot_tc.c @@ -150,8 +150,8 @@ static int ocelot_setup_tc_block(struct ocelot_port *port, switch (f->command) { case TC_BLOCK_BIND: block_cb = flow_block_cb_alloc(f->net, cb, port, port, NULL); - if (!block_cb) - return -ENOMEM; + if (IS_ERR(block_cb)) + return PTR_ERR(block_cb); err = ocelot_setup_tc_block_flower_bind(port, f); if (err < 0) { diff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c b/drivers/net/ethernet/netronome/nfp/flower/offload.c index 89ea95a0d554..0f4442006075 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/offload.c +++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c @@ -1277,8 +1277,8 @@ static int nfp_flower_setup_tc_block(struct net_device *netdev, block_cb = flow_block_cb_alloc(f->net, nfp_flower_setup_tc_block_cb, repr, repr, NULL); - if (!block_cb) - return -ENOMEM; + if (IS_ERR(block_cb)) + return PTR_ERR(block_cb); flow_block_cb_add(block_cb, f); return 0; @@ -1384,10 +1384,10 @@ nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app, nfp_flower_setup_indr_block_cb, cb_priv, cb_priv, nfp_flower_setup_indr_tc_release); - if (!block_cb) { + if (IS_ERR(block_cb)) { list_del(&cb_priv->list); kfree(cb_priv); - return -ENOMEM; + return PTR_ERR(block_cb); } flow_block_cb_add(block_cb, f); diff --git a/net/core/flow_offload.c b/net/core/flow_offload.c index 1a585676ca79..6615a2196085 100644 --- a/net/core/flow_offload.c +++ b/net/core/flow_offload.c @@ -206,9 +206,15 @@ struct flow_block_cb *flow_block_cb_alloc(struct net *net, tc_setup_cb_t *cb, { struct flow_block_cb *block_cb; + list_for_each_entry(block_cb, &flow_block_cb_list, global_list) { + if (block_cb->cb == cb && + block_cb->cb_ident == cb_ident) + return ERR_PTR(-EBUSY); + } + block_cb = kzalloc(sizeof(*block_cb), GFP_KERNEL); if (!block_cb) - return NULL; + return ERR_PTR(-ENOMEM); block_cb->net = net; block_cb->cb = cb; @@ -262,8 +268,8 @@ int flow_block_setup_offload(struct flow_block_offload *f, tc_setup_cb_t *cb, case TC_BLOCK_BIND: block_cb = flow_block_cb_alloc(f->net, cb, cb_ident, cb_priv, NULL); - if (!block_cb) - return -ENOMEM; + if (IS_ERR(block_cb)) + return PTR_ERR(block_cb); flow_block_cb_add(block_cb, f); return 0; diff --git a/net/dsa/slave.c b/net/dsa/slave.c index a7e80d4e10ef..0323091b5cef 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -958,8 +958,8 @@ static int dsa_slave_setup_tc_block(struct net_device *dev, switch (f->command) { case TC_BLOCK_BIND: block_cb = flow_block_cb_alloc(f->net, cb, dev, dev, NULL); - if (!block_cb) - return -ENOMEM; + if (IS_ERR(block_cb)) + return PTR_ERR(block_cb); flow_block_cb_add(block_cb, f); return 0; -- 2.11.0