Skip to contentSkip to conversation

fq: don't allow set options to zero

PATCH In review Yang Yingliang 3 participants 14 messages May 12, 2014 – Jun 9, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fq: don't allow set options to zero

Now options of fair queue can be zero but cannot be (~0U). Zero is useless, so don't allow set the options to zero. Also, maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)
tc/q_fq.c +12 -12
index c1f658e..c529842 100644
@@ -71,13 +71,13 @@ static unsigned int ilog2(unsigned int val)
 static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 			struct nlmsghdr *n)
 {
-	unsigned int plimit = ~0U;
-	unsigned int flow_plimit = ~0U;
-	unsigned int quantum = ~0U;
-	unsigned int initial_quantum = ~0U;
+	unsigned int plimit = 0;
+	unsigned int flow_plimit = 0;
+	unsigned int quantum = 0;
+	unsigned int initial_quantum = 0;
 	unsigned int buckets = 0;
-	unsigned int maxrate = ~0U;
-	unsigned int defrate = ~0U;
+	unsigned int maxrate = 0;
+	unsigned int defrate = 0;
 	int pacing = -1;
 	struct rtattr *tail;
 
@@ -147,24 +147,24 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 		addattr_l(n, 1024, TCA_FQ_BUCKETS_LOG,
 			  &log, sizeof(log));
 	}
-	if (plimit != ~0U)
+	if (plimit)
 		addattr_l(n, 1024, TCA_FQ_PLIMIT,
 			  &plimit, sizeof(plimit));
-	if (flow_plimit != ~0U)
+	if (flow_plimit)
 		addattr_l(n, 1024, TCA_FQ_FLOW_PLIMIT,
 			  &flow_plimit, sizeof(flow_plimit));
-	if (quantum != ~0U)
+	if (quantum)
 		addattr_l(n, 1024, TCA_FQ_QUANTUM, &quantum, sizeof(quantum));
-	if (initial_quantum != ~0U)
+	if (initial_quantum)
 		addattr_l(n, 1024, TCA_FQ_INITIAL_QUANTUM,
 			  &initial_quantum, sizeof(initial_quantum));
 	if (pacing != -1)
 		addattr_l(n, 1024, TCA_FQ_RATE_ENABLE,
 			  &pacing, sizeof(pacing));
-	if (maxrate != ~0U)
+	if (maxrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_MAX_RATE,
 			  &maxrate, sizeof(maxrate));
-	if (defrate != ~0U)
+	if (defrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_DEFAULT_RATE,
 			  &defrate, sizeof(defrate));
 	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
Signature · 1 line
1.8.0
#1 lore raw
Quoted 10 lines · Yang Yingliang

Now options of fair queue can be zero but cannot be (~0U). Zero is useless, so don't allow set the options to zero. Also, maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

No, you are changing behavior for existing scripts.

If you really want to fix these cases, you need to do it properly.

#2 lore raw
Quoted 12 lines · Eric Dumazet
Quoted 10 lines · Yang Yingliang

Now options of fair queue can be zero but cannot be (~0U). Zero is useless, so don't allow set the options to zero. Also, maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)
Quoted 4 lines

No, you are changing behavior for existing scripts.

If you really want to fix these cases, you need to do it properly.

Do you mean allow options set to zero changing the behavior ?

Regards,
Yang

#3 lore raw
Quoted 15 lines · Yang Yingliang
Quoted 14 lines · Eric Dumazet
Quoted 10 lines · Yang Yingliang

Now options of fair queue can be zero but cannot be (~0U). Zero is useless, so don't allow set the options to zero. Also, maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

No, you are changing behavior for existing scripts.

Quoted 8 lines
Quoted 2 lines

If you really want to fix these cases, you need to do it properly.

Do you mean allow options set to zero changing the behavior ?

Regards,
Yang

My bad, please ignore this mail.

Sorry for the noisy.

#4 lore raw
In reply to Eric Dumazet
Quoted 12 lines · Eric Dumazet
Quoted 10 lines · Yang Yingliang

Now options of fair queue can be zero but cannot be (~0U). Zero is useless, so don't allow set the options to zero. Also, maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)
Quoted 4 lines

No, you are changing behavior for existing scripts.

If you really want to fix these cases, you need to do it properly.

Do you mean options cannot be zero changing the behavior ?

Regards,
Yang

#5 lore raw
Quoted 13 lines · Yang Yingliang
Quoted 12 lines · Eric Dumazet
Quoted 10 lines · Yang Yingliang

Now options of fair queue can be zero but cannot be (~0U). Zero is useless, so don't allow set the options to zero. Also, maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)
Quoted 5 lines
Quoted 4 lines

No, you are changing behavior for existing scripts.

If you really want to fix these cases, you need to do it properly.

Do you mean options cannot be zero changing the behavior ?

I mean that you need to do something like the following.

tc/q_fq.c +4 -2
index c1f658e..26ecac3 100644
@@ -76,7 +76,8 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 	unsigned int quantum = ~0U;
 	unsigned int initial_quantum = ~0U;
 	unsigned int buckets = 0;
-	unsigned int maxrate = ~0U;
+	unsigned int maxrate;
+	int set_maxrate = 0;
 	unsigned int defrate = ~0U;
 	int pacing = -1;
 	struct rtattr *tail;
@@ -106,6 +107,7 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"maxrate\"\n");
 				return -1;
 			}
+			set_maxrate = 1;
 		} else if (strcmp(*argv, "defrate") == 0) {
 			NEXT_ARG();
 			if (get_rate(&defrate, *argv)) {
@@ -161,7 +163,7 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 	if (pacing != -1)
 		addattr_l(n, 1024, TCA_FQ_RATE_ENABLE,
 			  &pacing, sizeof(pacing));
-	if (maxrate != ~0U)
+	if (set_maxrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_MAX_RATE,
 			  &maxrate, sizeof(maxrate));
 	if (defrate != ~0U)
#6 lore raw

PATCH v2 1/1 fq: allow options of fair queue set to ~0U

From: Yang Yingliang <[email protected]>

Some options of fair queue cannot be (~0U). It leads to maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)
tc/q_fq.c +24 -12
index c1f658e..6a493a5 100644
@@ -71,13 +71,19 @@ static unsigned int ilog2(unsigned int val)
 static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 			struct nlmsghdr *n)
 {
-	unsigned int plimit = ~0U;
-	unsigned int flow_plimit = ~0U;
-	unsigned int quantum = ~0U;
-	unsigned int initial_quantum = ~0U;
+	unsigned int plimit;
+	unsigned int flow_plimit;
+	unsigned int quantum;
+	unsigned int initial_quantum;
 	unsigned int buckets = 0;
-	unsigned int maxrate = ~0U;
-	unsigned int defrate = ~0U;
+	unsigned int maxrate;
+	unsigned int defrate;
+	int set_plimit = 0;
+	int set_flow_plimit = 0;
+	int set_quantum = 0;
+	int set_initial_quantum = 0;
+	int set_maxrate = 0;
+	int set_defrate = 0;
 	int pacing = -1;
 	struct rtattr *tail;
 
@@ -88,12 +94,14 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"limit\"\n");
 				return -1;
 			}
+			set_plimit = 1;
 		} else if (strcmp(*argv, "flow_limit") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&flow_plimit, *argv, 0)) {
 				fprintf(stderr, "Illegal \"flow_limit\"\n");
 				return -1;
 			}
+			set_flow_plimit = 0;
 		} else if (strcmp(*argv, "buckets") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&buckets, *argv, 0)) {
@@ -106,24 +114,28 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"maxrate\"\n");
 				return -1;
 			}
+			set_maxrate = 1;
 		} else if (strcmp(*argv, "defrate") == 0) {
 			NEXT_ARG();
 			if (get_rate(&defrate, *argv)) {
 				fprintf(stderr, "Illegal \"defrate\"\n");
 				return -1;
 			}
+			set_defrate = 1;
 		} else if (strcmp(*argv, "quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"quantum\"\n");
 				return -1;
 			}
+			set_quantum = 1;
 		} else if (strcmp(*argv, "initial_quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&initial_quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"initial_quantum\"\n");
 				return -1;
 			}
+			set_initial_quantum = 1;
 		} else if (strcmp(*argv, "pacing") == 0) {
 			pacing = 1;
 		} else if (strcmp(*argv, "nopacing") == 0) {
@@ -147,24 +159,24 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 		addattr_l(n, 1024, TCA_FQ_BUCKETS_LOG,
 			  &log, sizeof(log));
 	}
-	if (plimit != ~0U)
+	if (set_plimit)
 		addattr_l(n, 1024, TCA_FQ_PLIMIT,
 			  &plimit, sizeof(plimit));
-	if (flow_plimit != ~0U)
+	if (set_flow_plimit)
 		addattr_l(n, 1024, TCA_FQ_FLOW_PLIMIT,
 			  &flow_plimit, sizeof(flow_plimit));
-	if (quantum != ~0U)
+	if (set_quantum)
 		addattr_l(n, 1024, TCA_FQ_QUANTUM, &quantum, sizeof(quantum));
-	if (initial_quantum != ~0U)
+	if (set_initial_quantum)
 		addattr_l(n, 1024, TCA_FQ_INITIAL_QUANTUM,
 			  &initial_quantum, sizeof(initial_quantum));
 	if (pacing != -1)
 		addattr_l(n, 1024, TCA_FQ_RATE_ENABLE,
 			  &pacing, sizeof(pacing));
-	if (maxrate != ~0U)
+	if (set_maxrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_MAX_RATE,
 			  &maxrate, sizeof(maxrate));
-	if (defrate != ~0U)
+	if (set_defrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_DEFAULT_RATE,
 			  &defrate, sizeof(defrate));
 	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
#7 lore raw

Re: [PATCH iproute2 v2] fq: allow options of fair queue set to ~0U

Quoted 43 lines · Yang Yingliang

From: Yang Yingliang <[email protected]>

Some options of fair queue cannot be (~0U). It leads to maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)
tc/q_fq.c +12 -6
index c1f658e..6a493a5 100644
@@ -71,13 +71,19 @@ static unsigned int ilog2(unsigned int val)
 static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 			struct nlmsghdr *n)
 {
-	unsigned int plimit = ~0U;
-	unsigned int flow_plimit = ~0U;
-	unsigned int quantum = ~0U;
-	unsigned int initial_quantum = ~0U;
+	unsigned int plimit;
+	unsigned int flow_plimit;
+	unsigned int quantum;
+	unsigned int initial_quantum;
 	unsigned int buckets = 0;
-	unsigned int maxrate = ~0U;
-	unsigned int defrate = ~0U;
+	unsigned int maxrate;
+	unsigned int defrate;
+	int set_plimit = 0;
+	int set_flow_plimit = 0;
+	int set_quantum = 0;
+	int set_initial_quantum = 0;
+	int set_maxrate = 0;
+	int set_defrate = 0;
 	int pacing = -1;
 	struct rtattr *tail;
 
@@ -88,12 +94,14 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"limit\"\n");

tc/q_fq.c static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv, · line 104

Quoted 10 lines
tc/q_fq.c +2 -0
 				return -1;
 			}
+			set_plimit = 1;
 		} else if (strcmp(*argv, "flow_limit") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&flow_plimit, *argv, 0)) {
 				fprintf(stderr, "Illegal \"flow_limit\"\n");
 				return -1;
 			}
+			set_flow_plimit = 0;

= 1; ?

Quoted 68 lines
tc/q_fq.c +10 -7
 		} else if (strcmp(*argv, "buckets") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&buckets, *argv, 0)) {
@@ -106,24 +114,28 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"maxrate\"\n");
 				return -1;
 			}
+			set_maxrate = 1;
 		} else if (strcmp(*argv, "defrate") == 0) {
 			NEXT_ARG();
 			if (get_rate(&defrate, *argv)) {
 				fprintf(stderr, "Illegal \"defrate\"\n");
 				return -1;
 			}
+			set_defrate = 1;
 		} else if (strcmp(*argv, "quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"quantum\"\n");
 				return -1;
 			}
+			set_quantum = 1;
 		} else if (strcmp(*argv, "initial_quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&initial_quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"initial_quantum\"\n");
 				return -1;
 			}
+			set_initial_quantum = 1;
 		} else if (strcmp(*argv, "pacing") == 0) {
 			pacing = 1;
 		} else if (strcmp(*argv, "nopacing") == 0) {
@@ -147,24 +159,24 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 		addattr_l(n, 1024, TCA_FQ_BUCKETS_LOG,
 			  &log, sizeof(log));
 	}
-	if (plimit != ~0U)
+	if (set_plimit)
 		addattr_l(n, 1024, TCA_FQ_PLIMIT,
 			  &plimit, sizeof(plimit));
-	if (flow_plimit != ~0U)
+	if (set_flow_plimit)
 		addattr_l(n, 1024, TCA_FQ_FLOW_PLIMIT,
 			  &flow_plimit, sizeof(flow_plimit));
-	if (quantum != ~0U)
+	if (set_quantum)
 		addattr_l(n, 1024, TCA_FQ_QUANTUM, &quantum, sizeof(quantum));
-	if (initial_quantum != ~0U)
+	if (set_initial_quantum)
 		addattr_l(n, 1024, TCA_FQ_INITIAL_QUANTUM,
 			  &initial_quantum, sizeof(initial_quantum));
 	if (pacing != -1)
 		addattr_l(n, 1024, TCA_FQ_RATE_ENABLE,
 			  &pacing, sizeof(pacing));
-	if (maxrate != ~0U)
+	if (set_maxrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_MAX_RATE,
 			  &maxrate, sizeof(maxrate));
-	if (defrate != ~0U)
+	if (set_defrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_DEFAULT_RATE,
 			  &defrate, sizeof(defrate));
 	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
 
--

To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#8 lore raw

Re: [PATCH iproute2 v2] fq: allow options of fair queue set to ~0U

Quoted 42 lines · Eric Dumazet
Quoted 41 lines · Yang Yingliang

From: Yang Yingliang <[email protected]>

Some options of fair queue cannot be (~0U). It leads to maxrate cannot be reset to unlimited because it cannot be (~0U).

---
 tc/q_fq.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)
tc/q_fq.c +12 -6
index c1f658e..6a493a5 100644
@@ -71,13 +71,19 @@ static unsigned int ilog2(unsigned int val)
 static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 			struct nlmsghdr *n)
 {
-	unsigned int plimit = ~0U;
-	unsigned int flow_plimit = ~0U;
-	unsigned int quantum = ~0U;
-	unsigned int initial_quantum = ~0U;
+	unsigned int plimit;
+	unsigned int flow_plimit;
+	unsigned int quantum;
+	unsigned int initial_quantum;
 	unsigned int buckets = 0;
-	unsigned int maxrate = ~0U;
-	unsigned int defrate = ~0U;
+	unsigned int maxrate;
+	unsigned int defrate;
+	int set_plimit = 0;
+	int set_flow_plimit = 0;
+	int set_quantum = 0;
+	int set_initial_quantum = 0;
+	int set_maxrate = 0;
+	int set_defrate = 0;
 	int pacing = -1;
 	struct rtattr *tail;
 
Quoted 16 lines

tc/q_fq.c static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv, · line 104

Quoted 12 lines
tc/q_fq.c +2 -0
@@ -88,12 +94,14 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"limit\"\n");
 				return -1;
 			}
+			set_plimit = 1;
 		} else if (strcmp(*argv, "flow_limit") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&flow_plimit, *argv, 0)) {
 				fprintf(stderr, "Illegal \"flow_limit\"\n");
 				return -1;
 			}
+			set_flow_plimit = 0;

= 1; ?

Yes, thanks!

#9 lore raw

PATCH v3 1/1 fq: allow options of fair queue set to ~0U

In reply to Yang Yingliang

From: Yang Yingliang <[email protected]>

Some options of fair queue cannot be (~0U). It leads to maxrate cannot be reset to unlimited because it cannot be (~0U).

Tested by the following command:

 # tc qdisc replace dev eth4 root handle 1: fq limit 2000 maxrate 100mbit quantum 2000 initial_quantum 1600
 # tc -s -d qdisc show
qdisc fq 1: dev eth4 root refcnt 2 limit 100p flow_limit 2000p buckets 1024 quantum 2000 initial_quantum 1600 maxrate 100Mbit 
 Sent 12596 bytes 82 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
  2 flows (1 inactive, 0 throttled)
  0 gc, 0 highprio, 0 throttled
 # tc qdisc replace dev eth4 root handle 1: fq limit 100 maxrate 34359738360 quantum 2000 initial_quantum 1600
 # tc -s -d qdisc show
qdisc fq 1: dev eth4 root refcnt 2 limit 100p flow_limit 100p buckets 1024 quantum 2000 initial_quantum 1600 
 Sent 15758 bytes 99 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
  2 flows (1 inactive, 0 throttled)
  0 gc, 0 highprio, 0 throttled
---
 tc/q_fq.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)
tc/q_fq.c +24 -12
index c1f658e..6a493a5 100644
@@ -71,13 +71,19 @@ static unsigned int ilog2(unsigned int val)
 static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 			struct nlmsghdr *n)
 {
-	unsigned int plimit = ~0U;
-	unsigned int flow_plimit = ~0U;
-	unsigned int quantum = ~0U;
-	unsigned int initial_quantum = ~0U;
+	unsigned int plimit;
+	unsigned int flow_plimit;
+	unsigned int quantum;
+	unsigned int initial_quantum;
 	unsigned int buckets = 0;
-	unsigned int maxrate = ~0U;
-	unsigned int defrate = ~0U;
+	unsigned int maxrate;
+	unsigned int defrate;
+	int set_plimit = 0;
+	int set_flow_plimit = 0;
+	int set_quantum = 0;
+	int set_initial_quantum = 0;
+	int set_maxrate = 0;
+	int set_defrate = 0;
 	int pacing = -1;
 	struct rtattr *tail;
 
@@ -88,12 +94,14 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"limit\"\n");
 				return -1;
 			}
+			set_plimit = 1;
 		} else if (strcmp(*argv, "flow_limit") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&flow_plimit, *argv, 0)) {
 				fprintf(stderr, "Illegal \"flow_limit\"\n");
 				return -1;
 			}
+			set_flow_plimit = 1;
 		} else if (strcmp(*argv, "buckets") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&buckets, *argv, 0)) {
@@ -106,24 +114,28 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"maxrate\"\n");
 				return -1;
 			}
+			set_maxrate = 1;
 		} else if (strcmp(*argv, "defrate") == 0) {
 			NEXT_ARG();
 			if (get_rate(&defrate, *argv)) {
 				fprintf(stderr, "Illegal \"defrate\"\n");
 				return -1;
 			}
+			set_defrate = 1;
 		} else if (strcmp(*argv, "quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"quantum\"\n");
 				return -1;
 			}
+			set_quantum = 1;
 		} else if (strcmp(*argv, "initial_quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&initial_quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"initial_quantum\"\n");
 				return -1;
 			}
+			set_initial_quantum = 1;
 		} else if (strcmp(*argv, "pacing") == 0) {
 			pacing = 1;
 		} else if (strcmp(*argv, "nopacing") == 0) {
@@ -147,24 +159,24 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 		addattr_l(n, 1024, TCA_FQ_BUCKETS_LOG,
 			  &log, sizeof(log));
 	}
-	if (plimit != ~0U)
+	if (set_plimit)
 		addattr_l(n, 1024, TCA_FQ_PLIMIT,
 			  &plimit, sizeof(plimit));
-	if (flow_plimit != ~0U)
+	if (set_flow_plimit)
 		addattr_l(n, 1024, TCA_FQ_FLOW_PLIMIT,
 			  &flow_plimit, sizeof(flow_plimit));
-	if (quantum != ~0U)
+	if (set_quantum)
 		addattr_l(n, 1024, TCA_FQ_QUANTUM, &quantum, sizeof(quantum));
-	if (initial_quantum != ~0U)
+	if (set_initial_quantum)
 		addattr_l(n, 1024, TCA_FQ_INITIAL_QUANTUM,
 			  &initial_quantum, sizeof(initial_quantum));
 	if (pacing != -1)
 		addattr_l(n, 1024, TCA_FQ_RATE_ENABLE,
 			  &pacing, sizeof(pacing));
-	if (maxrate != ~0U)
+	if (set_maxrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_MAX_RATE,
 			  &maxrate, sizeof(maxrate));
-	if (defrate != ~0U)
+	if (set_defrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_DEFAULT_RATE,
 			  &defrate, sizeof(defrate));
 	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
#10 lore raw

Re: [PATCH iproute2 v3] fq: allow options of fair queue set to ~0U

tc/q_fq.c static unsigned int ilog2(unsigned int val) · line 86

Quoted 6 lines · On Tue, 13 May 2014 12:20:52 +0800 Yang Yingliang <[email protected]>…
tc/q_fq.c +6 -0
+	int set_plimit = 0;
+	int set_flow_plimit = 0;
+	int set_quantum = 0;
+	int set_initial_quantum = 0;
+	int set_maxrate = 0;
+	int set_defrate = 0;

Please use bool for these since they are boolean flags.

#11 lore raw

Re: [PATCH iproute2 v3] fq: allow options of fair queue set to ~0U

Quoted 13 lines · Stephen Hemminger

tc/q_fq.c static unsigned int ilog2(unsigned int val) · line 86

Quoted 6 lines · On Tue, 13 May 2014 12:20:52 +0800 Yang Yingliang <[email protected]>…
tc/q_fq.c +6 -0
+	int set_plimit = 0;
+	int set_flow_plimit = 0;
+	int set_quantum = 0;
+	int set_initial_quantum = 0;
+	int set_maxrate = 0;
+	int set_defrate = 0;

Please use bool for these since they are boolean flags.

OK, I'll send a v3 later.

#12 lore raw

PATCH v4 1/1 fq: allow options of fair queue set to ~0U

In reply to Stephen Hemminger

From: Yang Yingliang <[email protected]>

Some options of fair queue cannot be (~0U). It leads to maxrate cannot be reset to unlimited because it cannot be (~0U). Allow the options being ~0U.

Tested by the following command:

 # tc qdisc add dev eth4 root handle 1: fq limit 2000 flow_limit 200 maxrate 100mbit quantum 2000 initial_quantum 1600
 # tc -s -d qdisc show
qdisc fq 1: dev eth4 root refcnt 2 limit 2000p flow_limit 200p buckets 1024 quantum 2000 initial_quantum 1600 maxrate 100Mbit 
 Sent 1492 bytes 10 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
  1 flows (0 inactive, 0 throttled)
  0 gc, 0 highprio, 0 throttled
 # tc qdisc change dev eth4 root handle 1: fq limit 4294967295 flow_limit 4294967295 maxrate 34359738360 quantum 4294967295 initial_quantum 4294967295
 # tc -s -d qdisc show
qdisc fq 1: dev eth4 root refcnt 2 limit 4294967295p flow_limit 4294967295p buckets 1024 quantum 4294967295 initial_quantum 4294967295 
 Sent 38372 bytes 216 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
  2 flows (1 inactive, 0 throttled)
  0 gc, 2 highprio, 7 throttled

---
Change note:

v3 -> v4: Change boolean flags from 'int' to 'bool'.

---
 tc/q_fq.c | 37 +++++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)
tc/q_fq.c +25 -12
index c1f658e..e7288c2 100644
@@ -44,6 +44,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <string.h>
+#include <stdbool.h>
 
 #include "utils.h"
 #include "tc_util.h"
@@ -71,13 +72,19 @@ static unsigned int ilog2(unsigned int val)
 static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 			struct nlmsghdr *n)
 {
-	unsigned int plimit = ~0U;
-	unsigned int flow_plimit = ~0U;
-	unsigned int quantum = ~0U;
-	unsigned int initial_quantum = ~0U;
+	unsigned int plimit;
+	unsigned int flow_plimit;
+	unsigned int quantum;
+	unsigned int initial_quantum;
 	unsigned int buckets = 0;
-	unsigned int maxrate = ~0U;
-	unsigned int defrate = ~0U;
+	unsigned int maxrate;
+	unsigned int defrate;
+	bool set_plimit = false;
+	bool set_flow_plimit = false;
+	bool set_quantum = false;
+	bool set_initial_quantum = false;
+	bool set_maxrate = false;
+	bool set_defrate = false;
 	int pacing = -1;
 	struct rtattr *tail;
 
@@ -88,12 +95,14 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"limit\"\n");
 				return -1;
 			}
+			set_plimit = true;
 		} else if (strcmp(*argv, "flow_limit") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&flow_plimit, *argv, 0)) {
 				fprintf(stderr, "Illegal \"flow_limit\"\n");
 				return -1;
 			}
+			set_flow_plimit = true;
 		} else if (strcmp(*argv, "buckets") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&buckets, *argv, 0)) {
@@ -106,24 +115,28 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				fprintf(stderr, "Illegal \"maxrate\"\n");
 				return -1;
 			}
+			set_maxrate = true;
 		} else if (strcmp(*argv, "defrate") == 0) {
 			NEXT_ARG();
 			if (get_rate(&defrate, *argv)) {
 				fprintf(stderr, "Illegal \"defrate\"\n");
 				return -1;
 			}
+			set_defrate = true;
 		} else if (strcmp(*argv, "quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"quantum\"\n");
 				return -1;
 			}
+			set_quantum = true;
 		} else if (strcmp(*argv, "initial_quantum") == 0) {
 			NEXT_ARG();
 			if (get_unsigned(&initial_quantum, *argv, 0)) {
 				fprintf(stderr, "Illegal \"initial_quantum\"\n");
 				return -1;
 			}
+			set_initial_quantum = true;
 		} else if (strcmp(*argv, "pacing") == 0) {
 			pacing = 1;
 		} else if (strcmp(*argv, "nopacing") == 0) {
@@ -147,24 +160,24 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 		addattr_l(n, 1024, TCA_FQ_BUCKETS_LOG,
 			  &log, sizeof(log));
 	}
-	if (plimit != ~0U)
+	if (set_plimit)
 		addattr_l(n, 1024, TCA_FQ_PLIMIT,
 			  &plimit, sizeof(plimit));
-	if (flow_plimit != ~0U)
+	if (set_flow_plimit)
 		addattr_l(n, 1024, TCA_FQ_FLOW_PLIMIT,
 			  &flow_plimit, sizeof(flow_plimit));
-	if (quantum != ~0U)
+	if (set_quantum)
 		addattr_l(n, 1024, TCA_FQ_QUANTUM, &quantum, sizeof(quantum));
-	if (initial_quantum != ~0U)
+	if (set_initial_quantum)
 		addattr_l(n, 1024, TCA_FQ_INITIAL_QUANTUM,
 			  &initial_quantum, sizeof(initial_quantum));
 	if (pacing != -1)
 		addattr_l(n, 1024, TCA_FQ_RATE_ENABLE,
 			  &pacing, sizeof(pacing));
-	if (maxrate != ~0U)
+	if (set_maxrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_MAX_RATE,
 			  &maxrate, sizeof(maxrate));
-	if (defrate != ~0U)
+	if (set_defrate)
 		addattr_l(n, 1024, TCA_FQ_FLOW_DEFAULT_RATE,
 			  &defrate, sizeof(defrate));
 	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
#13 lore raw

Re: [PATCH iproute2 v4] fq: allow options of fair queue set to ~0U

Quoted 23 lines · On Thu, 29 May 2014 12:04:34 +0800 Yang Yingliang <[email protected]>…

From: Yang Yingliang <[email protected]>

Some options of fair queue cannot be (~0U). It leads to maxrate cannot be reset to unlimited because it cannot be (~0U). Allow the options being ~0U.

Tested by the following command:

 # tc qdisc add dev eth4 root handle 1: fq limit 2000 flow_limit 200 maxrate 100mbit quantum 2000 initial_quantum 1600
 # tc -s -d qdisc show
qdisc fq 1: dev eth4 root refcnt 2 limit 2000p flow_limit 200p buckets 1024 quantum 2000 initial_quantum 1600 maxrate 100Mbit 
 Sent 1492 bytes 10 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
  1 flows (0 inactive, 0 throttled)
  0 gc, 0 highprio, 0 throttled
 # tc qdisc change dev eth4 root handle 1: fq limit 4294967295 flow_limit 4294967295 maxrate 34359738360 quantum 4294967295 initial_quantum 4294967295
 # tc -s -d qdisc show
qdisc fq 1: dev eth4 root refcnt 2 limit 4294967295p flow_limit 4294967295p buckets 1024 quantum 4294967295 initial_quantum 4294967295 
 Sent 38372 bytes 216 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
  2 flows (1 inactive, 0 throttled)
  0 gc, 2 highprio, 7 throttled
Quoted 3 lines

Applied