diff options
Diffstat (limited to 'net/sched/cls_api.c')
-rw-r--r-- | net/sched/cls_api.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index d144233423c5..efd3cfb80a2a 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
@@ -691,6 +691,8 @@ static void tc_indr_block_ing_cmd(struct tc_indr_block_dev *indr_dev, | |||
691 | if (!indr_dev->block) | 691 | if (!indr_dev->block) |
692 | return; | 692 | return; |
693 | 693 | ||
694 | bo.block = &indr_dev->block->flow_block; | ||
695 | |||
694 | indr_block_cb->cb(indr_dev->dev, indr_block_cb->cb_priv, TC_SETUP_BLOCK, | 696 | indr_block_cb->cb(indr_dev->dev, indr_block_cb->cb_priv, TC_SETUP_BLOCK, |
695 | &bo); | 697 | &bo); |
696 | tcf_block_setup(indr_dev->block, &bo); | 698 | tcf_block_setup(indr_dev->block, &bo); |
@@ -775,6 +777,7 @@ static void tc_indr_block_call(struct tcf_block *block, struct net_device *dev, | |||
775 | .command = command, | 777 | .command = command, |
776 | .binder_type = ei->binder_type, | 778 | .binder_type = ei->binder_type, |
777 | .net = dev_net(dev), | 779 | .net = dev_net(dev), |
780 | .block = &block->flow_block, | ||
778 | .block_shared = tcf_block_shared(block), | 781 | .block_shared = tcf_block_shared(block), |
779 | .extack = extack, | 782 | .extack = extack, |
780 | }; | 783 | }; |
@@ -810,6 +813,7 @@ static int tcf_block_offload_cmd(struct tcf_block *block, | |||
810 | bo.net = dev_net(dev); | 813 | bo.net = dev_net(dev); |
811 | bo.command = command; | 814 | bo.command = command; |
812 | bo.binder_type = ei->binder_type; | 815 | bo.binder_type = ei->binder_type; |
816 | bo.block = &block->flow_block; | ||
813 | bo.block_shared = tcf_block_shared(block); | 817 | bo.block_shared = tcf_block_shared(block); |
814 | bo.extack = extack; | 818 | bo.extack = extack; |
815 | INIT_LIST_HEAD(&bo.cb_list); | 819 | INIT_LIST_HEAD(&bo.cb_list); |
@@ -987,8 +991,8 @@ static struct tcf_block *tcf_block_create(struct net *net, struct Qdisc *q, | |||
987 | return ERR_PTR(-ENOMEM); | 991 | return ERR_PTR(-ENOMEM); |
988 | } | 992 | } |
989 | mutex_init(&block->lock); | 993 | mutex_init(&block->lock); |
994 | flow_block_init(&block->flow_block); | ||
990 | INIT_LIST_HEAD(&block->chain_list); | 995 | INIT_LIST_HEAD(&block->chain_list); |
991 | INIT_LIST_HEAD(&block->cb_list); | ||
992 | INIT_LIST_HEAD(&block->owner_list); | 996 | INIT_LIST_HEAD(&block->owner_list); |
993 | INIT_LIST_HEAD(&block->chain0.filter_chain_list); | 997 | INIT_LIST_HEAD(&block->chain0.filter_chain_list); |
994 | 998 | ||
@@ -1514,7 +1518,7 @@ void tcf_block_put(struct tcf_block *block) | |||
1514 | EXPORT_SYMBOL(tcf_block_put); | 1518 | EXPORT_SYMBOL(tcf_block_put); |
1515 | 1519 | ||
1516 | static int | 1520 | static int |
1517 | tcf_block_playback_offloads(struct tcf_block *block, tc_setup_cb_t *cb, | 1521 | tcf_block_playback_offloads(struct tcf_block *block, flow_setup_cb_t *cb, |
1518 | void *cb_priv, bool add, bool offload_in_use, | 1522 | void *cb_priv, bool add, bool offload_in_use, |
1519 | struct netlink_ext_ack *extack) | 1523 | struct netlink_ext_ack *extack) |
1520 | { | 1524 | { |
@@ -1570,7 +1574,7 @@ static int tcf_block_bind(struct tcf_block *block, | |||
1570 | 1574 | ||
1571 | i++; | 1575 | i++; |
1572 | } | 1576 | } |
1573 | list_splice(&bo->cb_list, &block->cb_list); | 1577 | list_splice(&bo->cb_list, &block->flow_block.cb_list); |
1574 | 1578 | ||
1575 | return 0; | 1579 | return 0; |
1576 | 1580 | ||
@@ -2152,7 +2156,9 @@ replay: | |||
2152 | tfilter_notify(net, skb, n, tp, block, q, parent, fh, | 2156 | tfilter_notify(net, skb, n, tp, block, q, parent, fh, |
2153 | RTM_NEWTFILTER, false, rtnl_held); | 2157 | RTM_NEWTFILTER, false, rtnl_held); |
2154 | tfilter_put(tp, fh); | 2158 | tfilter_put(tp, fh); |
2155 | q->flags &= ~TCQ_F_CAN_BYPASS; | 2159 | /* q pointer is NULL for shared blocks */ |
2160 | if (q) | ||
2161 | q->flags &= ~TCQ_F_CAN_BYPASS; | ||
2156 | } | 2162 | } |
2157 | 2163 | ||
2158 | errout: | 2164 | errout: |
@@ -3156,7 +3162,7 @@ int tc_setup_cb_call(struct tcf_block *block, enum tc_setup_type type, | |||
3156 | if (block->nooffloaddevcnt && err_stop) | 3162 | if (block->nooffloaddevcnt && err_stop) |
3157 | return -EOPNOTSUPP; | 3163 | return -EOPNOTSUPP; |
3158 | 3164 | ||
3159 | list_for_each_entry(block_cb, &block->cb_list, list) { | 3165 | list_for_each_entry(block_cb, &block->flow_block.cb_list, list) { |
3160 | err = block_cb->cb(type, type_data, block_cb->cb_priv); | 3166 | err = block_cb->cb(type, type_data, block_cb->cb_priv); |
3161 | if (err) { | 3167 | if (err) { |
3162 | if (err_stop) | 3168 | if (err_stop) |