[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 <hawk@comx.dk> Acked-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
b6fa1a4d74
Коммит
e9bef55d3d
|
@ -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
|
||||
|
|
|
@ -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 15
|
||||
static struct tcf_common *tcf_police_ht[POL_TAB_MASK + 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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -115,8 +115,8 @@ struct tbf_sched_data
|
|||
struct 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)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче