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);
        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)))