Skip to content

Commit

Permalink
net: sched: use extended variants of block_get/put in ingress and cls…
Browse files Browse the repository at this point in the history
…act qdiscs

Use previously introduced extended variants of block get and put
functions. This allows to specify a binder types specific to clsact
ingress/egress which is useful for drivers to distinguish who actually
got the block.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jiri Pirko authored and David S. Miller committed Oct 21, 2017
1 parent 8c4083b commit 6e40cf2
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 7 deletions.
2 changes: 2 additions & 0 deletions include/net/pkt_cls.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ int unregister_tcf_proto_ops(struct tcf_proto_ops *ops);

enum tcf_block_binder_type {
TCF_BLOCK_BINDER_TYPE_UNSPEC,
TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS,
TCF_BLOCK_BINDER_TYPE_CLSACT_EGRESS,
};

struct tcf_block_ext_info {
Expand Down
36 changes: 29 additions & 7 deletions net/sched/sch_ingress.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

struct ingress_sched_data {
struct tcf_block *block;
struct tcf_block_ext_info block_info;
};

static struct Qdisc *ingress_leaf(struct Qdisc *sch, unsigned long arg)
Expand Down Expand Up @@ -59,7 +60,10 @@ static int ingress_init(struct Qdisc *sch, struct nlattr *opt)
struct net_device *dev = qdisc_dev(sch);
int err;

err = tcf_block_get(&q->block, &dev->ingress_cl_list, sch);
q->block_info.binder_type = TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS;

err = tcf_block_get_ext(&q->block, &dev->ingress_cl_list,
sch, &q->block_info);
if (err)
return err;

Expand All @@ -72,8 +76,10 @@ static int ingress_init(struct Qdisc *sch, struct nlattr *opt)
static void ingress_destroy(struct Qdisc *sch)
{
struct ingress_sched_data *q = qdisc_priv(sch);
struct net_device *dev = qdisc_dev(sch);

tcf_block_put(q->block);
tcf_block_put_ext(q->block, &dev->ingress_cl_list,
sch, &q->block_info);
net_dec_ingress_queue();
}

Expand Down Expand Up @@ -114,6 +120,8 @@ static struct Qdisc_ops ingress_qdisc_ops __read_mostly = {
struct clsact_sched_data {
struct tcf_block *ingress_block;
struct tcf_block *egress_block;
struct tcf_block_ext_info ingress_block_info;
struct tcf_block_ext_info egress_block_info;
};

static unsigned long clsact_find(struct Qdisc *sch, u32 classid)
Expand Down Expand Up @@ -153,28 +161,42 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt)
struct net_device *dev = qdisc_dev(sch);
int err;

err = tcf_block_get(&q->ingress_block, &dev->ingress_cl_list, sch);
q->ingress_block_info.binder_type = TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS;

err = tcf_block_get_ext(&q->ingress_block, &dev->ingress_cl_list,
sch, &q->ingress_block_info);
if (err)
return err;

err = tcf_block_get(&q->egress_block, &dev->egress_cl_list, sch);
q->egress_block_info.binder_type = TCF_BLOCK_BINDER_TYPE_CLSACT_EGRESS;

err = tcf_block_get_ext(&q->egress_block, &dev->egress_cl_list,
sch, &q->egress_block_info);
if (err)
return err;
goto err_egress_block_get;

net_inc_ingress_queue();
net_inc_egress_queue();

sch->flags |= TCQ_F_CPUSTATS;

return 0;

err_egress_block_get:
tcf_block_put_ext(q->ingress_block, &dev->ingress_cl_list,
sch, &q->ingress_block_info);
return err;
}

static void clsact_destroy(struct Qdisc *sch)
{
struct clsact_sched_data *q = qdisc_priv(sch);
struct net_device *dev = qdisc_dev(sch);

tcf_block_put(q->egress_block);
tcf_block_put(q->ingress_block);
tcf_block_put_ext(q->egress_block, &dev->egress_cl_list,
sch, &q->egress_block_info);
tcf_block_put_ext(q->ingress_block, &dev->ingress_cl_list,
sch, &q->ingress_block_info);

net_dec_ingress_queue();
net_dec_egress_queue();
Expand Down

0 comments on commit 6e40cf2

Please sign in to comment.