Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9bef55d authored by Jesper Dangaard Brouer's avatar Jesper Dangaard Brouer Committed by David S. Miller
Browse files

[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: default avatarJesper Dangaard Brouer <hawk@comx.dk>
Acked-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b6fa1a4d
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -302,4 +302,16 @@ static inline int qdisc_reshape_fail(struct sk_buff *skb, struct Qdisc *sch)
	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
+2 −2
Original line number Diff line number Diff line
@@ -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];
+1 −1
Original line number Diff line number Diff line
@@ -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)
+2 −4
Original line number Diff line number Diff line
@@ -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 {
+2 −2
Original line number Diff line number Diff line
@@ -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)
{