Cake - FQ_codel the next generation
 help / color / mirror / Atom feed
* [Cake] [PATCH net] sch_cake: Interpret fwmark parameter as a bitmask
@ 2019-03-14 22:08 Toke Høiland-Jørgensen
  2019-03-15 18:57 ` David Miller
  0 siblings, 1 reply; 3+ messages in thread
From: Toke Høiland-Jørgensen @ 2019-03-14 22:08 UTC (permalink / raw)
  To: netdev; +Cc: cake, Toke Høiland-Jørgensen, Felix Resch

We initially interpreted the fwmark parameter as a flag that simply turned
on the feature, using the whole skb->mark field as the index into the CAKE
tin_order array. However, it is quite common for different applications to
use different parts of the mask field for their own purposes, each using a
different mask.

Support this use of subsets of the mark by interpreting the TCA_CAKE_FWMARK
parameter as a bitmask to apply to the fwmark field when reading it. The
result will be right-shifted by the number of unset lower bits of the mask
before looking up the tin.

In the original commit message we also failed to credit Felix Resch with
originally suggesting the fwmark feature back in 2017; so the Suggested-By
in this commit covers the whole fwmark feature.

Fixes: 0b5c7efdfc6e ("sch_cake: Permit use of connmarks as tin classifiers")
Suggested-by: Felix Resch <fuller@beif.de>
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
---
 net/sched/sch_cake.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c
index 1d2a12132abc..acc9b9da985f 100644
--- a/net/sched/sch_cake.c
+++ b/net/sched/sch_cake.c
@@ -211,6 +211,9 @@ struct cake_sched_data {
 	u8		ack_filter;
 	u8		atm_mode;
 
+	u32		fwmark_mask;
+	u16		fwmark_shft;
+
 	/* time_next = time_this + ((len * rate_ns) >> rate_shft) */
 	u16		rate_shft;
 	ktime_t		time_next_packet;
@@ -258,8 +261,7 @@ enum {
 	CAKE_FLAG_AUTORATE_INGRESS = BIT(1),
 	CAKE_FLAG_INGRESS	   = BIT(2),
 	CAKE_FLAG_WASH		   = BIT(3),
-	CAKE_FLAG_SPLIT_GSO	   = BIT(4),
-	CAKE_FLAG_FWMARK	   = BIT(5)
+	CAKE_FLAG_SPLIT_GSO	   = BIT(4)
 };
 
 /* COBALT operates the Codel and BLUE algorithms in parallel, in order to
@@ -1543,7 +1545,7 @@ static struct cake_tin_data *cake_select_tin(struct Qdisc *sch,
 					     struct sk_buff *skb)
 {
 	struct cake_sched_data *q = qdisc_priv(sch);
-	u32 tin;
+	u32 tin, mark;
 	u8 dscp;
 
 	/* Tin selection: Default to diffserv-based selection, allow overriding
@@ -1551,14 +1553,13 @@ static struct cake_tin_data *cake_select_tin(struct Qdisc *sch,
 	 */
 	dscp = cake_handle_diffserv(skb,
 				    q->rate_flags & CAKE_FLAG_WASH);
+	mark = (skb->mark & q->fwmark_mask) >> q->fwmark_shft;
 
 	if (q->tin_mode == CAKE_DIFFSERV_BESTEFFORT)
 		tin = 0;
 
-	else if (q->rate_flags & CAKE_FLAG_FWMARK && /* use fw mark */
-		 skb->mark &&
-		 skb->mark <= q->tin_cnt)
-		tin = q->tin_order[skb->mark - 1];
+	else if (mark && mark <= q->tin_cnt)
+		tin = q->tin_order[mark - 1];
 
 	else if (TC_H_MAJ(skb->priority) == sch->handle &&
 		 TC_H_MIN(skb->priority) > 0 &&
@@ -2172,6 +2173,7 @@ static const struct nla_policy cake_policy[TCA_CAKE_MAX + 1] = {
 	[TCA_CAKE_MPU]		 = { .type = NLA_U32 },
 	[TCA_CAKE_INGRESS]	 = { .type = NLA_U32 },
 	[TCA_CAKE_ACK_FILTER]	 = { .type = NLA_U32 },
+	[TCA_CAKE_FWMARK]	 = { .type = NLA_U32 },
 };
 
 static void cake_set_rate(struct cake_tin_data *b, u64 rate, u32 mtu,
@@ -2619,10 +2621,8 @@ static int cake_change(struct Qdisc *sch, struct nlattr *opt,
 	}
 
 	if (tb[TCA_CAKE_FWMARK]) {
-		if (!!nla_get_u32(tb[TCA_CAKE_FWMARK]))
-			q->rate_flags |= CAKE_FLAG_FWMARK;
-		else
-			q->rate_flags &= ~CAKE_FLAG_FWMARK;
+		q->fwmark_mask = nla_get_u32(tb[TCA_CAKE_FWMARK]);
+		q->fwmark_shft = q->fwmark_mask ? __ffs(q->fwmark_mask) : 0;
 	}
 
 	if (q->tins) {
@@ -2784,8 +2784,7 @@ static int cake_dump(struct Qdisc *sch, struct sk_buff *skb)
 			!!(q->rate_flags & CAKE_FLAG_SPLIT_GSO)))
 		goto nla_put_failure;
 
-	if (nla_put_u32(skb, TCA_CAKE_FWMARK,
-			!!(q->rate_flags & CAKE_FLAG_FWMARK)))
+	if (nla_put_u32(skb, TCA_CAKE_FWMARK, q->fwmark_mask))
 		goto nla_put_failure;
 
 	return nla_nest_end(skb, opts);
-- 
2.21.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Cake] [PATCH net] sch_cake: Interpret fwmark parameter as a bitmask
  2019-03-14 22:08 [Cake] [PATCH net] sch_cake: Interpret fwmark parameter as a bitmask Toke Høiland-Jørgensen
@ 2019-03-15 18:57 ` David Miller
  2019-03-15 21:29   ` Toke Høiland-Jørgensen
  0 siblings, 1 reply; 3+ messages in thread
From: David Miller @ 2019-03-15 18:57 UTC (permalink / raw)
  To: toke; +Cc: netdev, cake, fuller

From: Toke Høiland-Jørgensen <toke@redhat.com>
Date: Thu, 14 Mar 2019 23:08:22 +0100

> We initially interpreted the fwmark parameter as a flag that simply turned
> on the feature, using the whole skb->mark field as the index into the CAKE
> tin_order array. However, it is quite common for different applications to
> use different parts of the mask field for their own purposes, each using a
> different mask.
> 
> Support this use of subsets of the mark by interpreting the TCA_CAKE_FWMARK
> parameter as a bitmask to apply to the fwmark field when reading it. The
> result will be right-shifted by the number of unset lower bits of the mask
> before looking up the tin.
> 
> In the original commit message we also failed to credit Felix Resch with
> originally suggesting the fwmark feature back in 2017; so the Suggested-By
> in this commit covers the whole fwmark feature.
> 
> Fixes: 0b5c7efdfc6e ("sch_cake: Permit use of connmarks as tin classifiers")
> Suggested-by: Felix Resch <fuller@beif.de>
> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>

You are lucky you decided to do this before a released kernel had this UAPI
available.

Applied.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Cake] [PATCH net] sch_cake: Interpret fwmark parameter as a bitmask
  2019-03-15 18:57 ` David Miller
@ 2019-03-15 21:29   ` Toke Høiland-Jørgensen
  0 siblings, 0 replies; 3+ messages in thread
From: Toke Høiland-Jørgensen @ 2019-03-15 21:29 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, cake, fuller

David Miller <davem@davemloft.net> writes:

> From: Toke Høiland-Jørgensen <toke@redhat.com>
> Date: Thu, 14 Mar 2019 23:08:22 +0100
>
>> We initially interpreted the fwmark parameter as a flag that simply turned
>> on the feature, using the whole skb->mark field as the index into the CAKE
>> tin_order array. However, it is quite common for different applications to
>> use different parts of the mask field for their own purposes, each using a
>> different mask.
>> 
>> Support this use of subsets of the mark by interpreting the TCA_CAKE_FWMARK
>> parameter as a bitmask to apply to the fwmark field when reading it. The
>> result will be right-shifted by the number of unset lower bits of the mask
>> before looking up the tin.
>> 
>> In the original commit message we also failed to credit Felix Resch with
>> originally suggesting the fwmark feature back in 2017; so the Suggested-By
>> in this commit covers the whole fwmark feature.
>> 
>> Fixes: 0b5c7efdfc6e ("sch_cake: Permit use of connmarks as tin classifiers")
>> Suggested-by: Felix Resch <fuller@beif.de>
>> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
>
> You are lucky you decided to do this before a released kernel had this UAPI
> available.

Yeah; did realise we needed to make this change before a release, so
it's not entirely a coincidence that I sent this now :)

> Applied.

Thanks!

-Toke

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-03-15 21:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-14 22:08 [Cake] [PATCH net] sch_cake: Interpret fwmark parameter as a bitmask Toke Høiland-Jørgensen
2019-03-15 18:57 ` David Miller
2019-03-15 21:29   ` Toke Høiland-Jørgensen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox