Signed-off-by: Pablo Neira Ayuso <pa...@netfilter.org>
---
 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

Reply via email to