Commit bf9009bf authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg
Browse files

net/fq_impl: drop get_default_func, move default flow to fq_tin



Simplifies the code and prepares for a rework of scanning for flows on
overmemory drop.

Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
Link: https://lore.kernel.org/r/20201218184718.93650-2-nbd@nbd.name


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 07be2fed
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ struct fq_flow {
struct fq_tin {
	struct list_head new_flows;
	struct list_head old_flows;
	struct fq_flow default_flow;
	u32 backlog_bytes;
	u32 backlog_packets;
	u32 overlimit;
+5 −6
Original line number Diff line number Diff line
@@ -151,8 +151,7 @@ static u32 fq_flow_idx(struct fq *fq, struct sk_buff *skb)

static struct fq_flow *fq_flow_classify(struct fq *fq,
					struct fq_tin *tin, u32 idx,
					struct sk_buff *skb,
					fq_flow_get_default_t get_default_func)
					struct sk_buff *skb)
{
	struct fq_flow *flow;

@@ -160,7 +159,7 @@ static struct fq_flow *fq_flow_classify(struct fq *fq,

	flow = &fq->flows[idx];
	if (flow->tin && flow->tin != tin) {
		flow = get_default_func(fq, tin, idx, skb);
		flow = &tin->default_flow;
		tin->collisions++;
		fq->collisions++;
	}
@@ -192,15 +191,14 @@ static void fq_recalc_backlog(struct fq *fq,
static void fq_tin_enqueue(struct fq *fq,
			   struct fq_tin *tin, u32 idx,
			   struct sk_buff *skb,
			   fq_skb_free_t free_func,
			   fq_flow_get_default_t get_default_func)
			   fq_skb_free_t free_func)
{
	struct fq_flow *flow;
	bool oom;

	lockdep_assert_held(&fq->lock);

	flow = fq_flow_classify(fq, tin, idx, skb, get_default_func);
	flow = fq_flow_classify(fq, tin, idx, skb);

	flow->tin = tin;
	flow->backlog += skb->len;
@@ -331,6 +329,7 @@ static void fq_tin_init(struct fq_tin *tin)
{
	INIT_LIST_HEAD(&tin->new_flows);
	INIT_LIST_HEAD(&tin->old_flows);
	fq_flow_init(&tin->default_flow);
}

static int fq_init(struct fq *fq, int flows_cnt)
+0 −1
Original line number Diff line number Diff line
@@ -848,7 +848,6 @@ enum txq_info_flags {
 */
struct txq_info {
	struct fq_tin tin;
	struct fq_flow def_flow;
	struct codel_vars def_cvars;
	struct codel_stats cstats;
	struct sk_buff_head frags;
+4 −18
Original line number Diff line number Diff line
@@ -1309,7 +1309,7 @@ static struct sk_buff *codel_dequeue_func(struct codel_vars *cvars,
	fq = &local->fq;

	if (cvars == &txqi->def_cvars)
		flow = &txqi->def_flow;
		flow = &txqi->tin.default_flow;
	else
		flow = &fq->flows[cvars - local->cvars];

@@ -1352,7 +1352,7 @@ static struct sk_buff *fq_tin_dequeue_func(struct fq *fq,
		cparams = &local->cparams;
	}

	if (flow == &txqi->def_flow)
	if (flow == &tin->default_flow)
		cvars = &txqi->def_cvars;
	else
		cvars = &local->cvars[flow - fq->flows];
@@ -1379,17 +1379,6 @@ static void fq_skb_free_func(struct fq *fq,
	ieee80211_free_txskb(&local->hw, skb);
}

static struct fq_flow *fq_flow_get_default_func(struct fq *fq,
						struct fq_tin *tin,
						int idx,
						struct sk_buff *skb)
{
	struct txq_info *txqi;

	txqi = container_of(tin, struct txq_info, tin);
	return &txqi->def_flow;
}

static void ieee80211_txq_enqueue(struct ieee80211_local *local,
				  struct txq_info *txqi,
				  struct sk_buff *skb)
@@ -1402,8 +1391,7 @@ static void ieee80211_txq_enqueue(struct ieee80211_local *local,

	spin_lock_bh(&fq->lock);
	fq_tin_enqueue(fq, tin, flow_idx, skb,
		       fq_skb_free_func,
		       fq_flow_get_default_func);
		       fq_skb_free_func);
	spin_unlock_bh(&fq->lock);
}

@@ -1446,7 +1434,6 @@ void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata,
			struct txq_info *txqi, int tid)
{
	fq_tin_init(&txqi->tin);
	fq_flow_init(&txqi->def_flow);
	codel_vars_init(&txqi->def_cvars);
	codel_stats_init(&txqi->cstats);
	__skb_queue_head_init(&txqi->frags);
@@ -3283,8 +3270,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
	 */

	tin = &txqi->tin;
	flow = fq_flow_classify(fq, tin, flow_idx, skb,
				fq_flow_get_default_func);
	flow = fq_flow_classify(fq, tin, flow_idx, skb);
	head = skb_peek_tail(&flow->queue);
	if (!head || skb_is_gso(head))
		goto out;