: Cleanup L2T macros and handle oversized packets
Subsystems (3)
PATCH 1/6 : Cleanup L2T macros and handle oversized packets
commit a28343c933f6cfc3df1be86e0ebe8d99fa8d5f77
Author: Jesper Dangaard Brouer <[email protected]> Date: Wed Sep 12 10:01:00 2007 +0200
[NET_SCHED]: Cleanup L2T macros and handle oversized packets
Change L2T (length to time) macros, in all rate based schedulers, to call a common function qdisc_l2t() that does the rate table lookup. This function handles if the packet size lookup is larger than the rate table, which often occurs with TSO enabled.
Signed-off-by Jesper Dangaard Brouer <[email protected]>
include/net/sch_generic.h +12 -0
@@ -302,4 +302,16 @@ drop: return NET_XMIT_DROP; } +/* Length to Time (L2T) lookup in a qdisc_rate_table, to determine how +long it will take to send a packet given its size. +*/ +static inline u32 qdisc_l2t (struct qdisc_rate_table * rtab,unsigned int pktlen) +{ +int slot = pktlen; + slot >>= rtab->rate.cell_log; +if (slot >255 ) +return (rtab->data[255 ]*(slot >>8 ) + rtab->data[slot &0xFF ]); +return rtab->data[slot]; +} +#endif
net/sched/act_police.c +2 -2
@@ -21,8 +21,8 @@#include <net/act_api.h> #include <net/netlink.h> -#define L2T (p,L ) ((p)->tcfp_R_tab->data[(L)>>(p)->tcfp_R_tab->rate.cell_log]) -#define L2T_P (p,L ) ((p)->tcfp_P_tab->data[(L)>>(p)->tcfp_P_tab->rate.cell_log]) +#define L2T (p,L ) qdisc_l2t((p)->tcfp_R_tab, L) +#define L2T_P (p,L ) qdisc_l2t((p)->tcfp_P_tab, L)#define POL_TAB_MASK 15static struct tcf_common *tcf_police_ht[POL_TAB_MASK +1 ];
net/sched/sch_cbq.c +1 -1
@@ -175,7 +175,7 @@ struct cbq_sched_data }; -#define L2T (cl,len) ((cl)->R_tab->data[(len)>>(cl)->R_tab->rate.cell_log]) +#define L2T (cl,len) qdisc_l2t((cl)->R_tab,len)static __inline__unsigned cbq_hash (u32 h)
net/sched/sch_htb.c +2 -4
@@ -132,10 +132,8 @@ struct htb_class {static inline long L2T (struct htb_class *cl,struct qdisc_rate_table *rate,int size) { -int slot = size >> rate->rate.cell_log; -if (slot >255 ) -return (rate->data[255 ]*(slot >>8 ) + rate->data[slot &0xFF ]); -return rate->data[slot]; +long result =qdisc_l2t (rate, size); +return result; }struct htb_sched {
net/sched/sch_tbf.c +2 -2
@@ -115,8 +115,8 @@ struct tbf_sched_datastruct qdisc_watchdog watchdog;/* Watchdog timer */ }; -#define L2T (q,L ) ((q)->R_tab->data[(L)>>(q)->R_tab->rate.cell_log]) -#define L2T_P (q,L ) ((q)->P_tab->data[(L)>>(q)->P_tab->rate.cell_log]) +#define L2T (q,L ) qdisc_l2t((q)->R_tab,L) +#define L2T_P (q,L ) qdisc_l2t((q)->P_tab,L)static int tbf_enqueue (struct sk_buff *skb,struct Qdisc * sch) {