]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net: rps: protect filter locklessly
authorJason Xing <kernelxing@tencent.com>
Thu, 18 Apr 2024 07:36:02 +0000 (15:36 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Apr 2024 10:38:03 +0000 (11:38 +0100)
As we can see, rflow->filter can be written/read concurrently, so
lockless access is needed.

Signed-off-by: Jason Xing <kernelxing@tencent.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index 6f027f676243d1236bbf824a043a4ec416414734..182fce2537d4af817efe70e4e4c6f07f708a2dfa 100644 (file)
@@ -4530,9 +4530,9 @@ set_rps_cpu(struct net_device *dev, struct sk_buff *skb,
                        goto out;
                old_rflow = rflow;
                rflow = &flow_table->flows[flow_id];
-               rflow->filter = rc;
-               if (old_rflow->filter == rflow->filter)
-                       old_rflow->filter = RPS_NO_FILTER;
+               WRITE_ONCE(rflow->filter, rc);
+               if (old_rflow->filter == rc)
+                       WRITE_ONCE(old_rflow->filter, RPS_NO_FILTER);
        out:
 #endif
                head = READ_ONCE(per_cpu(softnet_data, next_cpu).input_queue_head);
@@ -4672,7 +4672,7 @@ bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index,
        if (flow_table && flow_id <= flow_table->mask) {
                rflow = &flow_table->flows[flow_id];
                cpu = READ_ONCE(rflow->cpu);
-               if (rflow->filter == filter_id && cpu < nr_cpu_ids &&
+               if (READ_ONCE(rflow->filter) == filter_id && cpu < nr_cpu_ids &&
                    ((int)(READ_ONCE(per_cpu(softnet_data, cpu).input_queue_head) -
                           READ_ONCE(rflow->last_qtail)) <
                     (int)(10 * flow_table->mask)))