lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue,  4 Nov 2014 09:56:25 -0800
From:	Cong Wang <xiyou.wangcong@...il.com>
To:	netdev@...r.kernel.org
Cc:	Cong Wang <xiyou.wangcong@...il.com>
Subject: [PATCH 02/13] net_sched: introduce qdisc_peek() helper function

Signed-off-by: Cong Wang <xiyou.wangcong@...il.com>
---
 include/net/pkt_sched.h   |  1 -
 include/net/sch_generic.h | 19 +++++++++++++++++++
 net/sched/sch_api.c       | 10 ----------
 net/sched/sch_atm.c       |  4 ++--
 net/sched/sch_drr.c       |  6 ++----
 net/sched/sch_dsmark.c    |  2 +-
 net/sched/sch_hfsc.c      |  8 +++-----
 net/sched/sch_htb.c       |  2 +-
 net/sched/sch_multiq.c    |  2 +-
 net/sched/sch_prio.c      |  2 +-
 net/sched/sch_qfq.c       | 10 ++++------
 net/sched/sch_red.c       |  2 +-
 net/sched/sch_sfb.c       |  2 +-
 net/sched/sch_tbf.c       |  2 +-
 14 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
index 27a3383..f224b7c 100644
--- a/include/net/pkt_sched.h
+++ b/include/net/pkt_sched.h
@@ -96,7 +96,6 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
 					struct nlattr *tab);
 void qdisc_put_rtab(struct qdisc_rate_table *tab);
 void qdisc_put_stab(struct qdisc_size_table *tab);
-void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc);
 int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
 		    struct net_device *dev, struct netdev_queue *txq,
 		    spinlock_t *root_lock, bool validate);
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 3d9fac9..a690e6f 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -518,6 +518,25 @@ static inline bool qdisc_is_percpu_stats(const struct Qdisc *q)
 	return q->flags & TCQ_F_CPUSTATS;
 }
 
+static inline void qdisc_warn_nonwc(void *func, struct Qdisc *qdisc)
+{
+	if (!(qdisc->flags & TCQ_F_WARN_NONWC)) {
+		pr_warn("%pf: %s qdisc %X: is non-work-conserving?\n",
+			func, qdisc->ops->id, qdisc->handle >> 16);
+		qdisc->flags |= TCQ_F_WARN_NONWC;
+	}
+}
+
+static inline struct sk_buff *qdisc_peek(struct Qdisc *sch, bool warn)
+{
+	struct sk_buff *skb;
+
+	skb = sch->ops->peek(sch);
+	if (!skb && warn)
+		qdisc_warn_nonwc(__builtin_return_address(0), sch);
+	return skb;
+}
+
 static inline void bstats_update(struct gnet_stats_basic_packed *bstats,
 				 const struct sk_buff *skb)
 {
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 76f402e..2276b15 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -563,16 +563,6 @@ void __qdisc_calculate_pkt_len(struct sk_buff *skb, const struct qdisc_size_tabl
 }
 EXPORT_SYMBOL(__qdisc_calculate_pkt_len);
 
-void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc)
-{
-	if (!(qdisc->flags & TCQ_F_WARN_NONWC)) {
-		pr_warn("%s: %s qdisc %X: is non-work-conserving?\n",
-			txt, qdisc->ops->id, qdisc->handle >> 16);
-		qdisc->flags |= TCQ_F_WARN_NONWC;
-	}
-}
-EXPORT_SYMBOL(qdisc_warn_nonwc);
-
 static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer)
 {
 	struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog,
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c
index e3e2cc5..1d3fb22 100644
--- a/net/sched/sch_atm.c
+++ b/net/sched/sch_atm.c
@@ -462,7 +462,7 @@ static void sch_atm_dequeue(unsigned long data)
 		 * If traffic is properly shaped, this won't generate nasty
 		 * little bursts. Otherwise, it may ... (but that's okay)
 		 */
-		while ((skb = flow->q->ops->peek(flow->q))) {
+		while ((skb = qdisc_peek(flow->q, false))) {
 			if (!atm_may_send(flow->vcc, skb->truesize))
 				break;
 
@@ -516,7 +516,7 @@ static struct sk_buff *atm_tc_peek(struct Qdisc *sch)
 
 	pr_debug("atm_tc_peek(sch %p,[qdisc %p])\n", sch, p);
 
-	return p->link.q->ops->peek(p->link.q);
+	return qdisc_peek(p->link.q ,false);
 }
 
 static unsigned int atm_tc_drop(struct Qdisc *sch)
diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c
index 3387060..a367fea 100644
--- a/net/sched/sch_drr.c
+++ b/net/sched/sch_drr.c
@@ -393,11 +393,9 @@ static struct sk_buff *drr_dequeue(struct Qdisc *sch)
 		goto out;
 	while (1) {
 		cl = list_first_entry(&q->active, struct drr_class, alist);
-		skb = cl->qdisc->ops->peek(cl->qdisc);
-		if (skb == NULL) {
-			qdisc_warn_nonwc(__func__, cl->qdisc);
+		skb = qdisc_peek(cl->qdisc, true);
+		if (skb == NULL)
 			goto out;
-		}
 
 		len = qdisc_pkt_len(skb);
 		if (len <= cl->deficit) {
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c
index 227114f..7bdf7e0 100644
--- a/net/sched/sch_dsmark.c
+++ b/net/sched/sch_dsmark.c
@@ -319,7 +319,7 @@ static struct sk_buff *dsmark_peek(struct Qdisc *sch)
 
 	pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p);
 
-	return p->q->ops->peek(p->q);
+	return qdisc_peek(p->q, false);
 }
 
 static unsigned int dsmark_drop(struct Qdisc *sch)
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index e6c7416..7086ead 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -881,11 +881,9 @@ qdisc_peek_len(struct Qdisc *sch)
 	struct sk_buff *skb;
 	unsigned int len;
 
-	skb = sch->ops->peek(sch);
-	if (skb == NULL) {
-		qdisc_warn_nonwc("qdisc_peek_len", sch);
+	skb = qdisc_peek(sch, true);
+	if (skb == NULL)
 		return 0;
-	}
 	len = qdisc_pkt_len(skb);
 
 	return len;
@@ -1650,7 +1648,7 @@ hfsc_dequeue(struct Qdisc *sch)
 
 	skb = qdisc_dequeue_peeked(cl->qdisc);
 	if (skb == NULL) {
-		qdisc_warn_nonwc("HFSC", cl->qdisc);
+		qdisc_warn_nonwc(__builtin_return_address(0), cl->qdisc);
 		return NULL;
 	}
 
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
index f1acb0f..28b6929 100644
--- a/net/sched/sch_htb.c
+++ b/net/sched/sch_htb.c
@@ -850,7 +850,7 @@ static struct sk_buff *htb_dequeue_tree(struct htb_sched *q, const int prio,
 		if (likely(skb != NULL))
 			break;
 
-		qdisc_warn_nonwc("htb", cl->un.leaf.q);
+		qdisc_warn_nonwc(__builtin_return_address(0), cl->un.leaf.q);
 		htb_next_rb_node(level ? &cl->parent->un.inner.clprio[prio].ptr:
 					 &q->hlevel[0].hprio[prio].ptr);
 		cl = htb_lookup_leaf(hprio, prio);
diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c
index 42dd218..1458aa3 100644
--- a/net/sched/sch_multiq.c
+++ b/net/sched/sch_multiq.c
@@ -142,7 +142,7 @@ static struct sk_buff *multiq_peek(struct Qdisc *sch)
 		if (!netif_xmit_stopped(
 		    netdev_get_tx_queue(qdisc_dev(sch), curband))) {
 			qdisc = q->queues[curband];
-			skb = qdisc->ops->peek(qdisc);
+			skb = qdisc_peek(qdisc, false);
 			if (skb)
 				return skb;
 		}
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
index 8e5cd34..0e06d14 100644
--- a/net/sched/sch_prio.c
+++ b/net/sched/sch_prio.c
@@ -100,7 +100,7 @@ static struct sk_buff *prio_peek(struct Qdisc *sch)
 
 	for (prio = 0; prio < q->bands; prio++) {
 		struct Qdisc *qdisc = q->queues[prio];
-		struct sk_buff *skb = qdisc->ops->peek(qdisc);
+		struct sk_buff *skb = qdisc_peek(qdisc, false);
 		if (skb)
 			return skb;
 	}
diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c
index 3ec7e88..9c9a5f3 100644
--- a/net/sched/sch_qfq.c
+++ b/net/sched/sch_qfq.c
@@ -1006,7 +1006,7 @@ static void agg_dequeue(struct qfq_aggregate *agg,
 
 	if (cl->qdisc->q.qlen == 0) /* no more packets, remove from list */
 		list_del(&cl->alist);
-	else if (cl->deficit < qdisc_pkt_len(cl->qdisc->ops->peek(cl->qdisc))) {
+	else if (cl->deficit < qdisc_pkt_len(qdisc_peek(cl->qdisc, false))) {
 		cl->deficit += agg->lmax;
 		list_move_tail(&cl->alist, &agg->active);
 	}
@@ -1019,10 +1019,8 @@ static inline struct sk_buff *qfq_peek_skb(struct qfq_aggregate *agg,
 	struct sk_buff *skb;
 
 	*cl = list_first_entry(&agg->active, struct qfq_class, alist);
-	skb = (*cl)->qdisc->ops->peek((*cl)->qdisc);
-	if (skb == NULL)
-		WARN_ONCE(1, "qfq_dequeue: non-workconserving leaf\n");
-	else
+	skb = qdisc_peek((*cl)->qdisc, true);
+	if (skb != NULL)
 		*len = qdisc_pkt_len(skb);
 
 	return skb;
@@ -1260,7 +1258,7 @@ static int qfq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
 	agg = cl->agg;
 	/* if the queue was not empty, then done here */
 	if (cl->qdisc->q.qlen != 1) {
-		if (unlikely(skb == cl->qdisc->ops->peek(cl->qdisc)) &&
+		if (unlikely(skb == qdisc_peek(cl->qdisc, false)) &&
 		    list_first_entry(&agg->active, struct qfq_class, alist)
 		    == cl && cl->deficit < qdisc_pkt_len(skb))
 			list_move_tail(&cl->alist, &agg->active);
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c
index 6c0534c..8fd96ae 100644
--- a/net/sched/sch_red.c
+++ b/net/sched/sch_red.c
@@ -131,7 +131,7 @@ static struct sk_buff *red_peek(struct Qdisc *sch)
 	struct red_sched_data *q = qdisc_priv(sch);
 	struct Qdisc *child = q->qdisc;
 
-	return child->ops->peek(child);
+	return qdisc_peek(child, false);
 }
 
 static unsigned int red_drop(struct Qdisc *sch)
diff --git a/net/sched/sch_sfb.c b/net/sched/sch_sfb.c
index 5819dd8..08c318e 100644
--- a/net/sched/sch_sfb.c
+++ b/net/sched/sch_sfb.c
@@ -447,7 +447,7 @@ static struct sk_buff *sfb_peek(struct Qdisc *sch)
 	struct sfb_sched_data *q = qdisc_priv(sch);
 	struct Qdisc *child = q->qdisc;
 
-	return child->ops->peek(child);
+	return qdisc_peek(child, false);
 }
 
 /* No sfb_drop -- impossible since the child doesn't return the dropped skb. */
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
index a4afde1..1f63a71 100644
--- a/net/sched/sch_tbf.c
+++ b/net/sched/sch_tbf.c
@@ -231,7 +231,7 @@ static struct sk_buff *tbf_dequeue(struct Qdisc *sch)
 	struct tbf_sched_data *q = qdisc_priv(sch);
 	struct sk_buff *skb;
 
-	skb = q->qdisc->ops->peek(q->qdisc);
+	skb = qdisc_peek(q->qdisc, false);
 
 	if (skb) {
 		s64 now;
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ