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: wenxu <wenxu@ucloud.cn> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
26f2eb27d0
commit
66f1939a1b
|
@ -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,
|
||||||
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,
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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 @@ out:
|
||||||
}
|
}
|
||||||
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,
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue