[PATCH 5/7] Add divisor.
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.
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