[PATCH 5/7] Add divisor.

2007-07-29 Thread Corey Hickey
Make hash divisor user-configurable.

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

diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index 2ff6a27..3e67a68 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -75,7 +75,7 @@
It is easy to increase these values, but not in flight.  */
 
 #define SFQ_DEPTH_DEFAULT  128
-#define SFQ_HASH_DIVISOR   1024
+#define SFQ_DIVISOR_DEFAULT1024
 
 #define SFQ_HEAD 0
 #define SFQ_TAIL 1
@@ -96,6 +96,7 @@ struct sfq_sched_data
unsignedquantum;/* Allotment per round: MUST BE = MTU 
*/
int limit;
unsigneddepth;
+   unsignedhash_divisor;
 
 /* Variables */
struct timer_list perturb_timer;
@@ -103,7 +104,7 @@ struct sfq_sched_data
sfq_index   tail;   /* Index of current slot in round */
sfq_index   max_depth;  /* Maximal depth */
 
-   sfq_index   ht[SFQ_HASH_DIVISOR];   /* Hash table */
+   sfq_index   *ht;/* Hash table */
sfq_index   *next;  /* Active slots link */
short   *allot; /* Current allotment per slot */
unsigned short  *hash;  /* Hash value indexed by slots 
*/
@@ -118,7 +119,7 @@ static __inline__ unsigned sfq_fold_hash(struct 
sfq_sched_data *q, u32 h, u32 h1
/* Have we any rotation primitives? If not, WHY? */
h ^= (h1pert) ^ (h1(0x1F - pert));
h ^= h10;
-   return h  0x3FF;
+   return h  (q-hash_divisor-1);
 }
 
 static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb)
@@ -384,6 +385,8 @@ static void sfq_perturbation(unsigned long arg)
 static void sfq_q_destroy(struct sfq_sched_data *q)
 {
del_timer(q-perturb_timer);
+   if(q-ht)
+   kfree(q-ht);
if(q-dep)
kfree(q-dep);
if(q-next)
@@ -415,12 +418,14 @@ static int sfq_q_init(struct sfq_sched_data *q, struct 
rtattr *opt)
q-max_depth = 0;
if (opt == NULL) {
q-perturb_period = 0;
+   q-hash_divisor = SFQ_DIVISOR_DEFAULT;
q-tail = q-limit = q-depth = SFQ_DEPTH_DEFAULT;
} else {
struct tc_sfq_qopt *ctl = RTA_DATA(opt);
if (ctl-quantum)
q-quantum = ctl-quantum;
q-perturb_period = ctl-perturb_period*HZ;
+   q-hash_divisor = ctl-divisor ? : SFQ_DIVISOR_DEFAULT;
q-tail = q-limit = q-depth = ctl-flows ? : 
SFQ_DEPTH_DEFAULT;
 
if (q-depth  p - 1)
@@ -430,6 +435,9 @@ static int sfq_q_init(struct sfq_sched_data *q, struct 
rtattr *opt)
q-limit = min_t(u32, ctl-limit, q-depth);
}
 
+   q-ht = kmalloc(q-hash_divisor*sizeof(sfq_index), GFP_KERNEL);
+   if (!q-ht)
+   goto err_case;
q-dep = kmalloc((1+q-depth*2)*sizeof(struct sfq_head), GFP_KERNEL);
if (!q-dep)
goto err_case;
@@ -446,7 +454,7 @@ static int sfq_q_init(struct sfq_sched_data *q, struct 
rtattr *opt)
if (!q-qs)
goto err_case;
 
-   for (i=0; iSFQ_HASH_DIVISOR; i++)
+   for (i=0; iq-hash_divisor; i++)
q-ht[i] = q-depth;
for (i=0; iq-depth; i++) {
skb_queue_head_init(q-qs[i]);
@@ -492,7 +500,7 @@ static int sfq_dump(struct Qdisc *sch, struct sk_buff *skb)
opt.perturb_period = q-perturb_period/HZ;
 
opt.limit = q-limit;
-   opt.divisor = SFQ_HASH_DIVISOR;
+   opt.divisor = q-hash_divisor;
opt.flows = q-depth;
 
RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), opt);
-- 
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 5/7] Add divisor.

2007-07-29 Thread Corey Hickey
Make hash divisor user-configurable.

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

diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index 70124ac..e6a6a21 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -75,7 +75,7 @@
It is easy to increase these values, but not in flight.  */
 
 #define SFQ_DEPTH_DEFAULT  128
-#define SFQ_HASH_DIVISOR   1024
+#define SFQ_DIVISOR_DEFAULT1024
 
 #define SFQ_HEAD 0
 #define SFQ_TAIL 1
@@ -98,6 +98,7 @@ struct sfq_sched_data
unsignedquantum;/* Allotment per round: MUST BE = MTU 
*/
int limit;
unsigneddepth;
+   unsignedhash_divisor;
 
 /* Variables */
struct timer_list perturb_timer;
@@ -105,7 +106,7 @@ struct sfq_sched_data
sfq_index   tail;   /* Index of current slot in round */
sfq_index   max_depth;  /* Maximal depth */
 
-   sfq_index   ht[SFQ_HASH_DIVISOR];   /* Hash table */
+   sfq_index   *ht;/* Hash table */
sfq_index   *next;  /* Active slots link */
short   *allot; /* Current allotment per slot */
unsigned short  *hash;  /* Hash value indexed by slots 
*/
@@ -120,7 +121,7 @@ static __inline__ unsigned sfq_fold_hash(struct 
sfq_sched_data *q, u32 h, u32 h1
/* Have we any rotation primitives? If not, WHY? */
h ^= (h1pert) ^ (h1(0x1F - pert));
h ^= h10;
-   return h  0x3FF;
+   return h  (q-hash_divisor-1);
 }
 
 static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb)
@@ -386,6 +387,7 @@ static void sfq_perturbation(unsigned long arg)
 static void sfq_q_destroy(struct sfq_sched_data *q)
 {
del_timer(q-perturb_timer);
+   kfree(q-ht);
kfree(q-dep);
kfree(q-next);
kfree(q-allot);
@@ -411,12 +413,14 @@ static int sfq_q_init(struct sfq_sched_data *q, struct 
rtattr *opt)
q-max_depth = 0;
if (opt == NULL) {
q-perturb_period = 0;
+   q-hash_divisor = SFQ_DIVISOR_DEFAULT;
q-tail = q-limit = q-depth = SFQ_DEPTH_DEFAULT;
} else {
struct tc_sfq_qopt *ctl = RTA_DATA(opt);
if (ctl-quantum)
q-quantum = ctl-quantum;
q-perturb_period = ctl-perturb_period*HZ;
+   q-hash_divisor = ctl-divisor ? : SFQ_DIVISOR_DEFAULT;
q-tail = q-limit = q-depth = ctl-flows ? : 
SFQ_DEPTH_DEFAULT;
 
if (q-depth  SFQ_MAX_DEPTH)
@@ -426,6 +430,9 @@ static int sfq_q_init(struct sfq_sched_data *q, struct 
rtattr *opt)
q-limit = min_t(u32, ctl-limit, q-depth);
}
 
+   q-ht = kcalloc(q-hash_divisor, sizeof(sfq_index), GFP_KERNEL);
+   if (!q-ht)
+   goto err_case;
q-dep = kcalloc(1 + q-depth*2, sizeof(struct sfq_head), GFP_KERNEL);
if (!q-dep)
goto err_case;
@@ -442,7 +449,7 @@ static int sfq_q_init(struct sfq_sched_data *q, struct 
rtattr *opt)
if (!q-qs)
goto err_case;
 
-   for (i=0; iSFQ_HASH_DIVISOR; i++)
+   for (i=0; iq-hash_divisor; i++)
q-ht[i] = q-depth;
for (i=0; i  q-depth; i++) {
skb_queue_head_init(q-qs[i]);
@@ -488,7 +495,7 @@ static int sfq_dump(struct Qdisc *sch, struct sk_buff *skb)
opt.perturb_period = q-perturb_period/HZ;
 
opt.limit = q-limit;
-   opt.divisor = SFQ_HASH_DIVISOR;
+   opt.divisor = q-hash_divisor;
opt.flows = q-depth;
 
RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), opt);
-- 
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