net/fq_impl: drop get_default_func, move default flow to fq_tin
authorFelix Fietkau <nbd@nbd.name>
Fri, 18 Dec 2020 18:47:14 +0000 (19:47 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 21 Jan 2021 12:33:31 +0000 (13:33 +0100)
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>
include/net/fq.h
include/net/fq_impl.h
net/mac80211/ieee80211_i.h
net/mac80211/tx.c

index e39f3f8..5df100b 100644 (file)
@@ -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;
index 06d2a79..dd374c7 100644 (file)
@@ -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)
index 8bf9c0e..c0f6168 100644 (file)
@@ -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;
index ebb3228..935a9ce 100644 (file)
@@ -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;