]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/sched: hhf: clear heavy-hitter state on reset
authorSamuel Moelius <sam.moelius@trailofbits.com>
Mon, 29 Jun 2026 16:44:59 +0000 (16:44 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 Jul 2026 08:09:38 +0000 (09:09 +0100)
HHF reset does not clear the classifier state used to identify heavy
hitters.  Packets after reset can therefore be scheduled using flow
history from before the reset.

The reset operation should return the qdisc to an empty state.

Clear the heavy-hitter classifier tables when HHF is reset.

Fixes: 10239edf86f1 ("net-qdisc-hhf: Heavy-Hitter Filter (HHF) qdisc")
Assisted-by: Codex:gpt-5.5-cyber-preview
Signed-off-by: Samuel Moelius <sam.moelius@trailofbits.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_hhf.c

index 1e25b75daae2e5de31bd212dfa1f6d7aea927174..d85cb0263b675adec28cac32394425866068d1c0 100644 (file)
@@ -462,12 +462,39 @@ begin:
        return skb;
 }
 
+static void hhf_reset_classifier(struct hhf_sched_data *q)
+{
+       int i;
+
+       if (!q->hh_flows)
+               return;
+
+       for (i = 0; i < HH_FLOWS_CNT; i++) {
+               struct hh_flow_state *flow, *next;
+               struct list_head *head = &q->hh_flows[i];
+
+               list_for_each_entry_safe(flow, next, head, flowchain) {
+                       list_del(&flow->flowchain);
+                       kfree(flow);
+               }
+       }
+       WRITE_ONCE(q->hh_flows_current_cnt, 0);
+
+       for (i = 0; i < HHF_ARRAYS_CNT; i++) {
+               if (q->hhf_valid_bits[i])
+                       bitmap_zero(q->hhf_valid_bits[i], HHF_ARRAYS_LEN);
+       }
+       q->hhf_arrays_reset_timestamp = hhf_time_stamp();
+}
+
 static void hhf_reset(struct Qdisc *sch)
 {
+       struct hhf_sched_data *q = qdisc_priv(sch);
        struct sk_buff *skb;
 
        while ((skb = hhf_dequeue(sch)) != NULL)
                rtnl_kfree_skbs(skb, skb);
+       hhf_reset_classifier(q);
 }
 
 static void hhf_destroy(struct Qdisc *sch)