Commit 66f1939a authored by wenxu's avatar wenxu Committed by David S. Miller

flow_offload: use flow_indr_block_cb_alloc/remove function

Prepare fix the bug in the next patch. use flow_indr_block_cb_alloc/remove
function and remove the __flow_block_indr_binding.
Signed-off-by: default avatarwenxu <wenxu@ucloud.cn>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 26f2eb27
...@@ -1889,7 +1889,8 @@ static void bnxt_tc_setup_indr_rel(void *cb_priv) ...@@ -1889,7 +1889,8 @@ static void bnxt_tc_setup_indr_rel(void *cb_priv)
} }
static int bnxt_tc_setup_indr_block(struct net_device *netdev, struct bnxt *bp, static int bnxt_tc_setup_indr_block(struct net_device *netdev, struct bnxt *bp,
struct flow_block_offload *f) struct flow_block_offload *f, void *data,
void (*cleanup)(struct flow_block_cb *block_cb))
{ {
struct bnxt_flower_indr_block_cb_priv *cb_priv; struct bnxt_flower_indr_block_cb_priv *cb_priv;
struct flow_block_cb *block_cb; struct flow_block_cb *block_cb;
...@@ -1907,9 +1908,10 @@ static int bnxt_tc_setup_indr_block(struct net_device *netdev, struct bnxt *bp, ...@@ -1907,9 +1908,10 @@ static int bnxt_tc_setup_indr_block(struct net_device *netdev, struct bnxt *bp,
cb_priv->bp = bp; cb_priv->bp = bp;
list_add(&cb_priv->list, &bp->tc_indr_block_list); list_add(&cb_priv->list, &bp->tc_indr_block_list);
block_cb = flow_block_cb_alloc(bnxt_tc_setup_indr_block_cb, block_cb = flow_indr_block_cb_alloc(bnxt_tc_setup_indr_block_cb,
cb_priv, cb_priv, cb_priv, cb_priv,
bnxt_tc_setup_indr_rel); bnxt_tc_setup_indr_rel, f,
netdev, data, cleanup);
if (IS_ERR(block_cb)) { if (IS_ERR(block_cb)) {
list_del(&cb_priv->list); list_del(&cb_priv->list);
kfree(cb_priv); kfree(cb_priv);
...@@ -1930,7 +1932,7 @@ static int bnxt_tc_setup_indr_block(struct net_device *netdev, struct bnxt *bp, ...@@ -1930,7 +1932,7 @@ static int bnxt_tc_setup_indr_block(struct net_device *netdev, struct bnxt *bp,
if (!block_cb) if (!block_cb)
return -ENOENT; return -ENOENT;
flow_block_cb_remove(block_cb, f); flow_indr_block_cb_remove(block_cb, f);
list_del(&block_cb->driver_list); list_del(&block_cb->driver_list);
break; break;
default: default:
...@@ -1945,14 +1947,17 @@ static bool bnxt_is_netdev_indr_offload(struct net_device *netdev) ...@@ -1945,14 +1947,17 @@ static bool bnxt_is_netdev_indr_offload(struct net_device *netdev)
} }
static int bnxt_tc_setup_indr_cb(struct net_device *netdev, void *cb_priv, static int bnxt_tc_setup_indr_cb(struct net_device *netdev, void *cb_priv,
enum tc_setup_type type, void *type_data) enum tc_setup_type type, void *type_data,
void *data,
void (*cleanup)(struct flow_block_cb *block_cb))
{ {
if (!bnxt_is_netdev_indr_offload(netdev)) if (!bnxt_is_netdev_indr_offload(netdev))
return -EOPNOTSUPP; return -EOPNOTSUPP;
switch (type) { switch (type) {
case TC_SETUP_BLOCK: case TC_SETUP_BLOCK:
return bnxt_tc_setup_indr_block(netdev, cb_priv, type_data); return bnxt_tc_setup_indr_block(netdev, cb_priv, type_data, data,
cleanup);
default: default:
break; break;
} }
......
...@@ -407,7 +407,9 @@ static int ...@@ -407,7 +407,9 @@ static int
mlx5e_rep_indr_setup_block(struct net_device *netdev, mlx5e_rep_indr_setup_block(struct net_device *netdev,
struct mlx5e_rep_priv *rpriv, struct mlx5e_rep_priv *rpriv,
struct flow_block_offload *f, struct flow_block_offload *f,
flow_setup_cb_t *setup_cb) flow_setup_cb_t *setup_cb,
void *data,
void (*cleanup)(struct flow_block_cb *block_cb))
{ {
struct mlx5e_priv *priv = netdev_priv(rpriv->netdev); struct mlx5e_priv *priv = netdev_priv(rpriv->netdev);
struct mlx5e_rep_indr_block_priv *indr_priv; struct mlx5e_rep_indr_block_priv *indr_priv;
...@@ -438,8 +440,9 @@ mlx5e_rep_indr_setup_block(struct net_device *netdev, ...@@ -438,8 +440,9 @@ mlx5e_rep_indr_setup_block(struct net_device *netdev,
list_add(&indr_priv->list, list_add(&indr_priv->list,
&rpriv->uplink_priv.tc_indr_block_priv_list); &rpriv->uplink_priv.tc_indr_block_priv_list);
block_cb = flow_block_cb_alloc(setup_cb, indr_priv, indr_priv, block_cb = flow_indr_block_cb_alloc(setup_cb, indr_priv, indr_priv,
mlx5e_rep_indr_block_unbind); mlx5e_rep_indr_block_unbind,
f, netdev, data, cleanup);
if (IS_ERR(block_cb)) { if (IS_ERR(block_cb)) {
list_del(&indr_priv->list); list_del(&indr_priv->list);
kfree(indr_priv); kfree(indr_priv);
...@@ -458,7 +461,7 @@ mlx5e_rep_indr_setup_block(struct net_device *netdev, ...@@ -458,7 +461,7 @@ mlx5e_rep_indr_setup_block(struct net_device *netdev,
if (!block_cb) if (!block_cb)
return -ENOENT; return -ENOENT;
flow_block_cb_remove(block_cb, f); flow_indr_block_cb_remove(block_cb, f);
list_del(&block_cb->driver_list); list_del(&block_cb->driver_list);
return 0; return 0;
default: default:
...@@ -469,15 +472,19 @@ mlx5e_rep_indr_setup_block(struct net_device *netdev, ...@@ -469,15 +472,19 @@ mlx5e_rep_indr_setup_block(struct net_device *netdev,
static static
int mlx5e_rep_indr_setup_cb(struct net_device *netdev, void *cb_priv, int mlx5e_rep_indr_setup_cb(struct net_device *netdev, void *cb_priv,
enum tc_setup_type type, void *type_data) enum tc_setup_type type, void *type_data,
void *data,
void (*cleanup)(struct flow_block_cb *block_cb))
{ {
switch (type) { switch (type) {
case TC_SETUP_BLOCK: case TC_SETUP_BLOCK:
return mlx5e_rep_indr_setup_block(netdev, cb_priv, type_data, return mlx5e_rep_indr_setup_block(netdev, cb_priv, type_data,
mlx5e_rep_indr_setup_tc_cb); mlx5e_rep_indr_setup_tc_cb,
data, cleanup);
case TC_SETUP_FT: case TC_SETUP_FT:
return mlx5e_rep_indr_setup_block(netdev, cb_priv, type_data, return mlx5e_rep_indr_setup_block(netdev, cb_priv, type_data,
mlx5e_rep_indr_setup_ft_cb); mlx5e_rep_indr_setup_ft_cb,
data, cleanup);
default: default:
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
...@@ -459,7 +459,9 @@ int nfp_flower_setup_qos_offload(struct nfp_app *app, struct net_device *netdev, ...@@ -459,7 +459,9 @@ int nfp_flower_setup_qos_offload(struct nfp_app *app, struct net_device *netdev,
struct tc_cls_matchall_offload *flow); struct tc_cls_matchall_offload *flow);
void nfp_flower_stats_rlim_reply(struct nfp_app *app, struct sk_buff *skb); void nfp_flower_stats_rlim_reply(struct nfp_app *app, struct sk_buff *skb);
int nfp_flower_indr_setup_tc_cb(struct net_device *netdev, void *cb_priv, int nfp_flower_indr_setup_tc_cb(struct net_device *netdev, void *cb_priv,
enum tc_setup_type type, void *type_data); enum tc_setup_type type, void *type_data,
void *data,
void (*cleanup)(struct flow_block_cb *block_cb));
int nfp_flower_setup_indr_block_cb(enum tc_setup_type type, void *type_data, int nfp_flower_setup_indr_block_cb(enum tc_setup_type type, void *type_data,
void *cb_priv); void *cb_priv);
......
...@@ -1647,7 +1647,8 @@ static void nfp_flower_setup_indr_tc_release(void *cb_priv) ...@@ -1647,7 +1647,8 @@ static void nfp_flower_setup_indr_tc_release(void *cb_priv)
static int static int
nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app, nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app,
struct flow_block_offload *f) struct flow_block_offload *f, void *data,
void (*cleanup)(struct flow_block_cb *block_cb))
{ {
struct nfp_flower_indr_block_cb_priv *cb_priv; struct nfp_flower_indr_block_cb_priv *cb_priv;
struct nfp_flower_priv *priv = app->priv; struct nfp_flower_priv *priv = app->priv;
...@@ -1676,9 +1677,10 @@ nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app, ...@@ -1676,9 +1677,10 @@ nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app,
cb_priv->app = app; cb_priv->app = app;
list_add(&cb_priv->list, &priv->indr_block_cb_priv); list_add(&cb_priv->list, &priv->indr_block_cb_priv);
block_cb = flow_block_cb_alloc(nfp_flower_setup_indr_block_cb, block_cb = flow_indr_block_cb_alloc(nfp_flower_setup_indr_block_cb,
cb_priv, cb_priv, cb_priv, cb_priv,
nfp_flower_setup_indr_tc_release); nfp_flower_setup_indr_tc_release,
f, netdev, data, cleanup);
if (IS_ERR(block_cb)) { if (IS_ERR(block_cb)) {
list_del(&cb_priv->list); list_del(&cb_priv->list);
kfree(cb_priv); kfree(cb_priv);
...@@ -1699,7 +1701,7 @@ nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app, ...@@ -1699,7 +1701,7 @@ nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app,
if (!block_cb) if (!block_cb)
return -ENOENT; return -ENOENT;
flow_block_cb_remove(block_cb, f); flow_indr_block_cb_remove(block_cb, f);
list_del(&block_cb->driver_list); list_del(&block_cb->driver_list);
return 0; return 0;
default: default:
...@@ -1710,7 +1712,9 @@ nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app, ...@@ -1710,7 +1712,9 @@ nfp_flower_setup_indr_tc_block(struct net_device *netdev, struct nfp_app *app,
int int
nfp_flower_indr_setup_tc_cb(struct net_device *netdev, void *cb_priv, nfp_flower_indr_setup_tc_cb(struct net_device *netdev, void *cb_priv,
enum tc_setup_type type, void *type_data) enum tc_setup_type type, void *type_data,
void *data,
void (*cleanup)(struct flow_block_cb *block_cb))
{ {
if (!nfp_fl_is_netdev_to_offload(netdev)) if (!nfp_fl_is_netdev_to_offload(netdev))
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -1718,7 +1722,7 @@ nfp_flower_indr_setup_tc_cb(struct net_device *netdev, void *cb_priv, ...@@ -1718,7 +1722,7 @@ nfp_flower_indr_setup_tc_cb(struct net_device *netdev, void *cb_priv,
switch (type) { switch (type) {
case TC_SETUP_BLOCK: case TC_SETUP_BLOCK:
return nfp_flower_setup_indr_tc_block(netdev, cb_priv, return nfp_flower_setup_indr_tc_block(netdev, cb_priv,
type_data); type_data, data, cleanup);
default: default:
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
...@@ -545,7 +545,9 @@ static inline void flow_block_init(struct flow_block *flow_block) ...@@ -545,7 +545,9 @@ static inline void flow_block_init(struct flow_block *flow_block)
} }
typedef int flow_indr_block_bind_cb_t(struct net_device *dev, void *cb_priv, typedef int flow_indr_block_bind_cb_t(struct net_device *dev, void *cb_priv,
enum tc_setup_type type, void *type_data); enum tc_setup_type type, void *type_data,
void *data,
void (*cleanup)(struct flow_block_cb *block_cb));
int flow_indr_dev_register(flow_indr_block_bind_cb_t *cb, void *cb_priv); int flow_indr_dev_register(flow_indr_block_bind_cb_t *cb, void *cb_priv);
void flow_indr_dev_unregister(flow_indr_block_bind_cb_t *cb, void *cb_priv, void flow_indr_dev_unregister(flow_indr_block_bind_cb_t *cb, void *cb_priv,
......
...@@ -458,25 +458,6 @@ struct flow_block_cb *flow_indr_block_cb_alloc(flow_setup_cb_t *cb, ...@@ -458,25 +458,6 @@ struct flow_block_cb *flow_indr_block_cb_alloc(flow_setup_cb_t *cb,
} }
EXPORT_SYMBOL(flow_indr_block_cb_alloc); EXPORT_SYMBOL(flow_indr_block_cb_alloc);
static void __flow_block_indr_binding(struct flow_block_offload *bo,
struct net_device *dev, void *data,
void (*cleanup)(struct flow_block_cb *block_cb))
{
struct flow_block_cb *block_cb;
list_for_each_entry(block_cb, &bo->cb_list, list) {
switch (bo->command) {
case FLOW_BLOCK_BIND:
flow_block_indr_init(block_cb, bo, dev, data, cleanup);
list_add(&block_cb->indr.list, &flow_block_indr_list);
break;
case FLOW_BLOCK_UNBIND:
list_del(&block_cb->indr.list);
break;
}
}
}
int flow_indr_dev_setup_offload(struct net_device *dev, int flow_indr_dev_setup_offload(struct net_device *dev,
enum tc_setup_type type, void *data, enum tc_setup_type type, void *data,
struct flow_block_offload *bo, struct flow_block_offload *bo,
...@@ -486,9 +467,8 @@ int flow_indr_dev_setup_offload(struct net_device *dev, ...@@ -486,9 +467,8 @@ int flow_indr_dev_setup_offload(struct net_device *dev,
mutex_lock(&flow_indr_block_lock); mutex_lock(&flow_indr_block_lock);
list_for_each_entry(this, &flow_block_indr_dev_list, list) list_for_each_entry(this, &flow_block_indr_dev_list, list)
this->cb(dev, this->cb_priv, type, bo); this->cb(dev, this->cb_priv, type, bo, data, cleanup);
__flow_block_indr_binding(bo, dev, data, cleanup);
mutex_unlock(&flow_indr_block_lock); mutex_unlock(&flow_indr_block_lock);
return list_empty(&bo->cb_list) ? -EOPNOTSUPP : 0; return list_empty(&bo->cb_list) ? -EOPNOTSUPP : 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment