On Thu, Jun 18, 2020 at 12:55:04AM +0800, we...@ucloud.cn wrote: > From: wenxu <we...@ucloud.cn> > > Add flow_indr_block_cb_alloc/remove function prepare for the bug fix > in the third patch. > > Signed-off-by: wenxu <we...@ucloud.cn> > --- > include/net/flow_offload.h | 13 +++++++++++++ > net/core/flow_offload.c | 43 ++++++++++++++++++++++++++++++++----------- > 2 files changed, 45 insertions(+), 11 deletions(-) > > diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h > index f2c8311..bf43430 100644 > --- a/include/net/flow_offload.h > +++ b/include/net/flow_offload.h > @@ -467,6 +467,12 @@ struct flow_block_cb { > struct flow_block_cb *flow_block_cb_alloc(flow_setup_cb_t *cb, > void *cb_ident, void *cb_priv, > void (*release)(void *cb_priv)); > +struct flow_block_cb *flow_indr_block_cb_alloc(flow_setup_cb_t *cb, > + void *cb_ident, void *cb_priv, > + void (*release)(void *cb_priv), > + struct flow_block_offload *bo, > + struct net_device *dev, void > *data, > + void (*cleanup)(struct > flow_block_cb *block_cb)); > void flow_block_cb_free(struct flow_block_cb *block_cb); > > struct flow_block_cb *flow_block_cb_lookup(struct flow_block *block, > @@ -488,6 +494,13 @@ static inline void flow_block_cb_remove(struct > flow_block_cb *block_cb, > list_move(&block_cb->list, &offload->cb_list); > } > > +static inline void flow_indr_block_cb_remove(struct flow_block_cb *block_cb, > + struct flow_block_offload *offload) > +{ > + list_del(&block_cb->indr.list); > + list_move(&block_cb->list, &offload->cb_list); > +} > + > bool flow_block_cb_is_busy(flow_setup_cb_t *cb, void *cb_ident, > struct list_head *driver_block_list); > > diff --git a/net/core/flow_offload.c b/net/core/flow_offload.c > index 0cfc35e..9fe4b58 100644 > --- a/net/core/flow_offload.c > +++ b/net/core/flow_offload.c > @@ -329,6 +329,38 @@ struct flow_indr_dev { > struct rcu_head rcu; > }; > > +static void flow_block_indr_init(struct flow_block_cb *flow_block, > + struct flow_block_offload *bo, > + struct net_device *dev, void *data, > + void (*cleanup)(struct flow_block_cb > *block_cb)) > +{ > + flow_block->indr.binder_type = bo->binder_type; > + flow_block->indr.data = data; > + flow_block->indr.dev = dev; > + flow_block->indr.cleanup = cleanup; > +} > + > +struct flow_block_cb *flow_indr_block_cb_alloc(flow_setup_cb_t *cb, > + void *cb_ident, void *cb_priv, > + void (*release)(void *cb_priv), > + 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; > + > + block_cb = flow_block_cb_alloc(cb, cb_ident, cb_priv, release); > + if (IS_ERR(block_cb)) > + goto out; > + > + flow_block_indr_init(block_cb, bo, dev, data, cleanup); > + list_add(&block_cb->indr.list, &flow_block_indr_list); > + > +out: > + return block_cb; > +} > +EXPORT_SYMBOL(flow_indr_block_cb_alloc);
You can probably place flow_indr_block_cb_alloc() right before flow_indr_dev_setup_offload(), so you don't have to move flow_block_indr_init() ?