]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net: sched: cls_flower: propagate chain teplate creation and destruction to drivers
authorJiri Pirko <jiri@mellanox.com>
Mon, 23 Jul 2018 07:23:11 +0000 (09:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 24 Jul 2018 03:44:12 +0000 (20:44 -0700)
Introduce a couple of flower offload commands in order to propagate
template creation/destruction events down to device drivers.
Drivers may use this information to prepare HW in an optimal way
for future filter insertions.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/pkt_cls.h
net/sched/cls_flower.c

index 4f405ca8346fd4f96f7aec161657fc8c63ea082b..a3101582f642c1a903f93e30fd090cfb940f7fc2 100644 (file)
@@ -721,6 +721,8 @@ enum tc_fl_command {
        TC_CLSFLOWER_REPLACE,
        TC_CLSFLOWER_DESTROY,
        TC_CLSFLOWER_STATS,
+       TC_CLSFLOWER_TMPLT_CREATE,
+       TC_CLSFLOWER_TMPLT_DESTROY,
 };
 
 struct tc_cls_flower_offload {
index f0c80758a594056bc1087b7166dd40484c867dc5..6ccf603642974d94ecef0b08b6baba536ec94d9c 100644 (file)
@@ -1194,6 +1194,42 @@ static int fl_reoffload(struct tcf_proto *tp, bool add, tc_setup_cb_t *cb,
        return 0;
 }
 
+static void fl_hw_create_tmplt(struct tcf_chain *chain,
+                              struct fl_flow_tmplt *tmplt)
+{
+       struct tc_cls_flower_offload cls_flower = {};
+       struct tcf_block *block = chain->block;
+       struct tcf_exts dummy_exts = { 0, };
+
+       cls_flower.common.chain_index = chain->index;
+       cls_flower.command = TC_CLSFLOWER_TMPLT_CREATE;
+       cls_flower.cookie = (unsigned long) tmplt;
+       cls_flower.dissector = &tmplt->dissector;
+       cls_flower.mask = &tmplt->mask;
+       cls_flower.key = &tmplt->dummy_key;
+       cls_flower.exts = &dummy_exts;
+
+       /* We don't care if driver (any of them) fails to handle this
+        * call. It serves just as a hint for it.
+        */
+       tc_setup_cb_call(block, NULL, TC_SETUP_CLSFLOWER,
+                        &cls_flower, false);
+}
+
+static void fl_hw_destroy_tmplt(struct tcf_chain *chain,
+                               struct fl_flow_tmplt *tmplt)
+{
+       struct tc_cls_flower_offload cls_flower = {};
+       struct tcf_block *block = chain->block;
+
+       cls_flower.common.chain_index = chain->index;
+       cls_flower.command = TC_CLSFLOWER_TMPLT_DESTROY;
+       cls_flower.cookie = (unsigned long) tmplt;
+
+       tc_setup_cb_call(block, NULL, TC_SETUP_CLSFLOWER,
+                        &cls_flower, false);
+}
+
 static void *fl_tmplt_create(struct net *net, struct tcf_chain *chain,
                             struct nlattr **tca,
                             struct netlink_ext_ack *extack)
@@ -1224,6 +1260,8 @@ static void *fl_tmplt_create(struct net *net, struct tcf_chain *chain,
 
        fl_init_dissector(&tmplt->dissector, &tmplt->mask);
 
+       fl_hw_create_tmplt(chain, tmplt);
+
        return tmplt;
 
 errout_tmplt:
@@ -1237,6 +1275,7 @@ static void fl_tmplt_destroy(void *tmplt_priv)
 {
        struct fl_flow_tmplt *tmplt = tmplt_priv;
 
+       fl_hw_destroy_tmplt(tmplt->chain, tmplt);
        kfree(tmplt);
 }