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: Felix Fietkau <nbd@nbd.name> Link: https://lore.kernel.org/r/20201218184718.93650-2-nbd@nbd.name Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
committed by
Johannes Berg
parent
07be2fed5e
commit
bf9009bf21
@@ -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)
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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 {
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user