Re: [PATCH 6/7] Make qdisc changeable.

2007-08-06 Thread Patrick McHardy
Corey Hickey wrote:
 Patrick McHardy wrote:
 
 +if ((err = sfq_q_init(tmp, opt)))
 +return err;



 This will also use defaults for all unspecified values. It would
 be more consistent with other qdiscs to only change those values
 that are actually specified, so something like tc qdisc change ...
 perturb 10 will *only* change the perturbation parameter.
 
 
 I'm fixed this for all the parameters except one--your example above.
 Since 0 is a valid value for perturb, I can't see any clever way to
 differentiate between the user specifying perturb 0 or leaving perturb
 unspecified. Either way, opt-perturb_period is 0.
 
 The only way I can see would be to add another member, say,
 opt-perturb_specified, and use that accordingly. Unfortunately, this
 would break usage of sfq with older versions of tc, so I'm hoping
 there's a better approach.
 
 Do you have any suggestions? I've looked at the other qdisc files and I
 don't see any other instances like this.


Maybe use the nested compat attribute and split the base SFQ
struct in the individual members ..
-
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


Re: [PATCH 6/7] Make qdisc changeable.

2007-08-05 Thread Corey Hickey

Patrick McHardy wrote:

+   if ((err = sfq_q_init(tmp, opt)))
+   return err;



This will also use defaults for all unspecified values. It would
be more consistent with other qdiscs to only change those values
that are actually specified, so something like tc qdisc change ...
perturb 10 will *only* change the perturbation parameter.


I'm fixed this for all the parameters except one--your example above.
Since 0 is a valid value for perturb, I can't see any clever way to
differentiate between the user specifying perturb 0 or leaving perturb
unspecified. Either way, opt-perturb_period is 0.

The only way I can see would be to add another member, say,
opt-perturb_specified, and use that accordingly. Unfortunately, this
would break usage of sfq with older versions of tc, so I'm hoping
there's a better approach.

Do you have any suggestions? I've looked at the other qdisc files and I 
don't see any other instances like this.


Thanks,
Corey
-
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


Re: [PATCH 6/7] Make qdisc changeable.

2007-07-31 Thread Corey Hickey

Patrick McHardy wrote:

Corey Hickey wrote:

Re-implement sfq_change() and enable Qdisc_opts.change so tc qdisc
change will work.

Signed-off-by: Corey Hickey [EMAIL PROTECTED]
---
 net/sched/sch_sfq.c |   51 ++-
 1 files changed, 50 insertions(+), 1 deletions(-)

diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index e6a6a21..e042cd0 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -485,6 +485,55 @@ static int sfq_init(struct Qdisc *sch, struct rtattr *opt)
return 0;
 }
 
+static int sfq_change(struct Qdisc *sch, struct rtattr *opt)

+{
+   struct sfq_sched_data *q = qdisc_priv(sch);
+   struct sfq_sched_data tmp;
+   struct sk_buff *skb;
+   int err;
+   
+   /* set up tmp queue */
+   memset(tmp, 0, sizeof(struct sfq_sched_data));
+   tmp.quantum = psched_mtu(sch-dev); /* default */



If no value is given it should use the old value instead of
reinitializing to the default.


+   if ((err = sfq_q_init(tmp, opt)))
+   return err;



This will also use defaults for all unspecified values. It would
be more consistent with other qdiscs to only change those values
that are actually specified, so something like tc qdisc change ...
perturb 10 will *only* change the perturbation parameter.


I somehow had it in my head that a qdisc change was supposed to work 
that way. I'll change my patch.



I'm not sure reusing the initialization function and copying the
parameters is the best way to do this.


I'm not sure either, but I do like that it's conceptually simple and it 
keeps the parameter handling in one place. I've thought and stared for a 
while, and I don't see a better way, but that could of course be due to 
my limited understanding and general newbiehood in that regard.


Thanks again for the review. I'll try to get a new batch of patches sent 
off tomorrow.


-Corey
-
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


Re: [PATCH 6/7] Make qdisc changeable.

2007-07-30 Thread Patrick McHardy
Corey Hickey wrote:
 Re-implement sfq_change() and enable Qdisc_opts.change so tc qdisc
 change will work.
 
 Signed-off-by: Corey Hickey [EMAIL PROTECTED]
 ---
  net/sched/sch_sfq.c |   51 
 ++-
  1 files changed, 50 insertions(+), 1 deletions(-)
 
 diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
 index e6a6a21..e042cd0 100644
 --- a/net/sched/sch_sfq.c
 +++ b/net/sched/sch_sfq.c
 @@ -485,6 +485,55 @@ static int sfq_init(struct Qdisc *sch, struct rtattr 
 *opt)
   return 0;
  }
  
 +static int sfq_change(struct Qdisc *sch, struct rtattr *opt)
 +{
 + struct sfq_sched_data *q = qdisc_priv(sch);
 + struct sfq_sched_data tmp;
 + struct sk_buff *skb;
 + int err;
 + 
 + /* set up tmp queue */
 + memset(tmp, 0, sizeof(struct sfq_sched_data));
 + tmp.quantum = psched_mtu(sch-dev); /* default */


If no value is given it should use the old value instead of
reinitializing to the default.

 + if ((err = sfq_q_init(tmp, opt)))
 + return err;


This will also use defaults for all unspecified values. It would
be more consistent with other qdiscs to only change those values
that are actually specified, so something like tc qdisc change ...
perturb 10 will *only* change the perturbation parameter.
I'm not sure reusing the initialization function and copying the
parameters is the best way to do this.

 +
 + /* copy packets from the old queue to the tmp queue */
 + sch_tree_lock(sch);
 + while (sch-q.qlen = tmp.limit - 1)
 + sfq_drop(sch);
 + while ((skb = sfq_q_dequeue(q)) != NULL)
 + sfq_q_enqueue(skb, tmp, SFQ_TAIL);
 + 
 + /* clean up the old queue */
 + sfq_q_destroy(q);
 +
 + /* copy elements of the tmp queue into the old queue */
 + q-perturb_period = tmp.perturb_period;
 + q-quantum= tmp.quantum;
 + q-limit  = tmp.limit;
 + q-depth  = tmp.depth;
 + q-hash_divisor   = tmp.hash_divisor;
 + q-tail   = tmp.tail;
 + q-max_depth  = tmp.max_depth;
 + q-ht= tmp.ht;
 + q-dep   = tmp.dep;
 + q-next  = tmp.next;
 + q-allot = tmp.allot;
 + q-hash  = tmp.hash;
 + q-qs= tmp.qs;
 +
 + /* finish up */
 + if (q-perturb_period) {
 + q-perturb_timer.expires = jiffies + q-perturb_period;
 + add_timer(q-perturb_timer);
 + } else {
 + q-perturbation = 0;
 + }
 + sch_tree_unlock(sch);
 + return 0;
 +}
 +
-
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


[PATCH 6/7] Make qdisc changeable.

2007-07-29 Thread Corey Hickey
Re-implement sfq_change() and enable Qdisc_opts.change so tc qdisc
change will work.

Signed-off-by: Corey Hickey [EMAIL PROTECTED]
---
 net/sched/sch_sfq.c |   51 ++-
 1 files changed, 50 insertions(+), 1 deletions(-)

diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index 3e67a68..4cd523f 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -490,6 +490,55 @@ static int sfq_init(struct Qdisc *sch, struct rtattr *opt)
return 0;
 }
 
+static int sfq_change(struct Qdisc *sch, struct rtattr *opt)
+{
+   struct sfq_sched_data *q = qdisc_priv(sch);
+   struct sfq_sched_data tmp;
+   struct sk_buff *skb;
+   int err;
+   
+   /* set up tmp queue */
+   memset(tmp, 0, sizeof(struct sfq_sched_data));
+   tmp.quantum = psched_mtu(sch-dev); /* default */
+   if ((err = sfq_q_init(tmp, opt)))
+   return err;
+
+   /* copy packets from the old queue to the tmp queue */
+   sch_tree_lock(sch);
+   while (sch-q.qlen = tmp.limit - 1)
+   sfq_drop(sch);
+   while ((skb = sfq_q_dequeue(q)) != NULL)
+   sfq_q_enqueue(skb, tmp, SFQ_TAIL);
+   
+   /* clean up the old queue */
+   sfq_q_destroy(q);
+
+   /* copy elements of the tmp queue into the old queue */
+   q-perturb_period = tmp.perturb_period;
+   q-quantum= tmp.quantum;
+   q-limit  = tmp.limit;
+   q-depth  = tmp.depth;
+   q-hash_divisor   = tmp.hash_divisor;
+   q-tail   = tmp.tail;
+   q-max_depth  = tmp.max_depth;
+   q-ht= tmp.ht;
+   q-dep   = tmp.dep;
+   q-next  = tmp.next;
+   q-allot = tmp.allot;
+   q-hash  = tmp.hash;
+   q-qs= tmp.qs;
+
+   /* finish up */
+   if (q-perturb_period) {
+   q-perturb_timer.expires = jiffies + q-perturb_period;
+   add_timer(q-perturb_timer);
+   } else {
+   q-perturbation = 0;
+   }
+   sch_tree_unlock(sch);
+   return 0;
+}
+
 static int sfq_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
struct sfq_sched_data *q = qdisc_priv(sch);
@@ -524,7 +573,7 @@ static struct Qdisc_ops sfq_qdisc_ops = {
.init   =   sfq_init,
.reset  =   sfq_reset,
.destroy=   sfq_destroy,
-   .change =   NULL,
+   .change =   sfq_change,
.dump   =   sfq_dump,
.owner  =   THIS_MODULE,
 };
-- 
1.5.2.4

-
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


[PATCH 6/7] Make qdisc changeable.

2007-07-29 Thread Corey Hickey
Re-implement sfq_change() and enable Qdisc_opts.change so tc qdisc
change will work.

Signed-off-by: Corey Hickey [EMAIL PROTECTED]
---
 net/sched/sch_sfq.c |   51 ++-
 1 files changed, 50 insertions(+), 1 deletions(-)

diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index e6a6a21..e042cd0 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -485,6 +485,55 @@ static int sfq_init(struct Qdisc *sch, struct rtattr *opt)
return 0;
 }
 
+static int sfq_change(struct Qdisc *sch, struct rtattr *opt)
+{
+   struct sfq_sched_data *q = qdisc_priv(sch);
+   struct sfq_sched_data tmp;
+   struct sk_buff *skb;
+   int err;
+   
+   /* set up tmp queue */
+   memset(tmp, 0, sizeof(struct sfq_sched_data));
+   tmp.quantum = psched_mtu(sch-dev); /* default */
+   if ((err = sfq_q_init(tmp, opt)))
+   return err;
+
+   /* copy packets from the old queue to the tmp queue */
+   sch_tree_lock(sch);
+   while (sch-q.qlen = tmp.limit - 1)
+   sfq_drop(sch);
+   while ((skb = sfq_q_dequeue(q)) != NULL)
+   sfq_q_enqueue(skb, tmp, SFQ_TAIL);
+   
+   /* clean up the old queue */
+   sfq_q_destroy(q);
+
+   /* copy elements of the tmp queue into the old queue */
+   q-perturb_period = tmp.perturb_period;
+   q-quantum= tmp.quantum;
+   q-limit  = tmp.limit;
+   q-depth  = tmp.depth;
+   q-hash_divisor   = tmp.hash_divisor;
+   q-tail   = tmp.tail;
+   q-max_depth  = tmp.max_depth;
+   q-ht= tmp.ht;
+   q-dep   = tmp.dep;
+   q-next  = tmp.next;
+   q-allot = tmp.allot;
+   q-hash  = tmp.hash;
+   q-qs= tmp.qs;
+
+   /* finish up */
+   if (q-perturb_period) {
+   q-perturb_timer.expires = jiffies + q-perturb_period;
+   add_timer(q-perturb_timer);
+   } else {
+   q-perturbation = 0;
+   }
+   sch_tree_unlock(sch);
+   return 0;
+}
+
 static int sfq_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
struct sfq_sched_data *q = qdisc_priv(sch);
@@ -519,7 +568,7 @@ static struct Qdisc_ops sfq_qdisc_ops = {
.init   =   sfq_init,
.reset  =   sfq_reset,
.destroy=   sfq_destroy,
-   .change =   NULL,
+   .change =   sfq_change,
.dump   =   sfq_dump,
.owner  =   THIS_MODULE,
 };
-- 
1.5.2.4

-
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