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

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.nameSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 07be2fed
...@@ -47,6 +47,7 @@ struct fq_flow { ...@@ -47,6 +47,7 @@ struct fq_flow {
struct fq_tin { struct fq_tin {
struct list_head new_flows; struct list_head new_flows;
struct list_head old_flows; struct list_head old_flows;
struct fq_flow default_flow;
u32 backlog_bytes; u32 backlog_bytes;
u32 backlog_packets; u32 backlog_packets;
u32 overlimit; u32 overlimit;
......
...@@ -151,8 +151,7 @@ static u32 fq_flow_idx(struct fq *fq, struct sk_buff *skb) ...@@ -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, static struct fq_flow *fq_flow_classify(struct fq *fq,
struct fq_tin *tin, u32 idx, struct fq_tin *tin, u32 idx,
struct sk_buff *skb, struct sk_buff *skb)
fq_flow_get_default_t get_default_func)
{ {
struct fq_flow *flow; struct fq_flow *flow;
...@@ -160,7 +159,7 @@ static struct fq_flow *fq_flow_classify(struct fq *fq, ...@@ -160,7 +159,7 @@ static struct fq_flow *fq_flow_classify(struct fq *fq,
flow = &fq->flows[idx]; flow = &fq->flows[idx];
if (flow->tin && flow->tin != tin) { if (flow->tin && flow->tin != tin) {
flow = get_default_func(fq, tin, idx, skb); flow = &tin->default_flow;
tin->collisions++; tin->collisions++;
fq->collisions++; fq->collisions++;
} }
...@@ -192,15 +191,14 @@ static void fq_recalc_backlog(struct fq *fq, ...@@ -192,15 +191,14 @@ static void fq_recalc_backlog(struct fq *fq,
static void fq_tin_enqueue(struct fq *fq, static void fq_tin_enqueue(struct fq *fq,
struct fq_tin *tin, u32 idx, struct fq_tin *tin, u32 idx,
struct sk_buff *skb, struct sk_buff *skb,
fq_skb_free_t free_func, fq_skb_free_t free_func)
fq_flow_get_default_t get_default_func)
{ {
struct fq_flow *flow; struct fq_flow *flow;
bool oom; bool oom;
lockdep_assert_held(&fq->lock); 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->tin = tin;
flow->backlog += skb->len; flow->backlog += skb->len;
...@@ -331,6 +329,7 @@ static void fq_tin_init(struct fq_tin *tin) ...@@ -331,6 +329,7 @@ static void fq_tin_init(struct fq_tin *tin)
{ {
INIT_LIST_HEAD(&tin->new_flows); INIT_LIST_HEAD(&tin->new_flows);
INIT_LIST_HEAD(&tin->old_flows); INIT_LIST_HEAD(&tin->old_flows);
fq_flow_init(&tin->default_flow);
} }
static int fq_init(struct fq *fq, int flows_cnt) static int fq_init(struct fq *fq, int flows_cnt)
......
...@@ -848,7 +848,6 @@ enum txq_info_flags { ...@@ -848,7 +848,6 @@ enum txq_info_flags {
*/ */
struct txq_info { struct txq_info {
struct fq_tin tin; struct fq_tin tin;
struct fq_flow def_flow;
struct codel_vars def_cvars; struct codel_vars def_cvars;
struct codel_stats cstats; struct codel_stats cstats;
struct sk_buff_head frags; struct sk_buff_head frags;
......
...@@ -1309,7 +1309,7 @@ static struct sk_buff *codel_dequeue_func(struct codel_vars *cvars, ...@@ -1309,7 +1309,7 @@ static struct sk_buff *codel_dequeue_func(struct codel_vars *cvars,
fq = &local->fq; fq = &local->fq;
if (cvars == &txqi->def_cvars) if (cvars == &txqi->def_cvars)
flow = &txqi->def_flow; flow = &txqi->tin.default_flow;
else else
flow = &fq->flows[cvars - local->cvars]; flow = &fq->flows[cvars - local->cvars];
...@@ -1352,7 +1352,7 @@ static struct sk_buff *fq_tin_dequeue_func(struct fq *fq, ...@@ -1352,7 +1352,7 @@ static struct sk_buff *fq_tin_dequeue_func(struct fq *fq,
cparams = &local->cparams; cparams = &local->cparams;
} }
if (flow == &txqi->def_flow) if (flow == &tin->default_flow)
cvars = &txqi->def_cvars; cvars = &txqi->def_cvars;
else else
cvars = &local->cvars[flow - fq->flows]; cvars = &local->cvars[flow - fq->flows];
...@@ -1379,17 +1379,6 @@ static void fq_skb_free_func(struct fq *fq, ...@@ -1379,17 +1379,6 @@ static void fq_skb_free_func(struct fq *fq,
ieee80211_free_txskb(&local->hw, skb); 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, static void ieee80211_txq_enqueue(struct ieee80211_local *local,
struct txq_info *txqi, struct txq_info *txqi,
struct sk_buff *skb) struct sk_buff *skb)
...@@ -1402,8 +1391,7 @@ static void ieee80211_txq_enqueue(struct ieee80211_local *local, ...@@ -1402,8 +1391,7 @@ static void ieee80211_txq_enqueue(struct ieee80211_local *local,
spin_lock_bh(&fq->lock); spin_lock_bh(&fq->lock);
fq_tin_enqueue(fq, tin, flow_idx, skb, fq_tin_enqueue(fq, tin, flow_idx, skb,
fq_skb_free_func, fq_skb_free_func);
fq_flow_get_default_func);
spin_unlock_bh(&fq->lock); spin_unlock_bh(&fq->lock);
} }
...@@ -1446,7 +1434,6 @@ void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata, ...@@ -1446,7 +1434,6 @@ void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata,
struct txq_info *txqi, int tid) struct txq_info *txqi, int tid)
{ {
fq_tin_init(&txqi->tin); fq_tin_init(&txqi->tin);
fq_flow_init(&txqi->def_flow);
codel_vars_init(&txqi->def_cvars); codel_vars_init(&txqi->def_cvars);
codel_stats_init(&txqi->cstats); codel_stats_init(&txqi->cstats);
__skb_queue_head_init(&txqi->frags); __skb_queue_head_init(&txqi->frags);
...@@ -3283,8 +3270,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata, ...@@ -3283,8 +3270,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
*/ */
tin = &txqi->tin; tin = &txqi->tin;
flow = fq_flow_classify(fq, tin, flow_idx, skb, flow = fq_flow_classify(fq, tin, flow_idx, skb);
fq_flow_get_default_func);
head = skb_peek_tail(&flow->queue); head = skb_peek_tail(&flow->queue);
if (!head || skb_is_gso(head)) if (!head || skb_is_gso(head))
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment