aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/cls_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched/cls_api.c')
-rw-r--r--net/sched/cls_api.c16
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)
1514EXPORT_SYMBOL(tcf_block_put); 1518EXPORT_SYMBOL(tcf_block_put);
1515 1519
1516static int 1520static int
1517tcf_block_playback_offloads(struct tcf_block *block, tc_setup_cb_t *cb, 1521tcf_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
2158errout: 2164errout:
@@ -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)