Commit 09994d1b authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller

RPS: Ensure that an expired hardware filter can be re-added later

Amir Vadai wrote:
> When a stream is paused, and its rule is expired while it is paused,
> no new rule will be configured to the HW when traffic resume.
[...]
> - When stream was resumed, traffic was steered again by RSS, and
> because current-cpu was equal to desired-cpu,  ndo_rx_flow_steer
> wasn't called and no rule was configured to the HW.

Fix this by setting the flow's current CPU only in the table for the
newly selected RX queue.
Reported-and-tested-by: default avatarAmir Vadai <amirv@dev.mellanox.co.il>
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 76231e02
...@@ -2670,10 +2670,7 @@ static struct rps_dev_flow * ...@@ -2670,10 +2670,7 @@ static struct rps_dev_flow *
set_rps_cpu(struct net_device *dev, struct sk_buff *skb, set_rps_cpu(struct net_device *dev, struct sk_buff *skb,
struct rps_dev_flow *rflow, u16 next_cpu) struct rps_dev_flow *rflow, u16 next_cpu)
{ {
u16 tcpu; if (next_cpu != RPS_NO_CPU) {
tcpu = rflow->cpu = next_cpu;
if (tcpu != RPS_NO_CPU) {
#ifdef CONFIG_RFS_ACCEL #ifdef CONFIG_RFS_ACCEL
struct netdev_rx_queue *rxqueue; struct netdev_rx_queue *rxqueue;
struct rps_dev_flow_table *flow_table; struct rps_dev_flow_table *flow_table;
...@@ -2701,16 +2698,16 @@ set_rps_cpu(struct net_device *dev, struct sk_buff *skb, ...@@ -2701,16 +2698,16 @@ set_rps_cpu(struct net_device *dev, struct sk_buff *skb,
goto out; goto out;
old_rflow = rflow; old_rflow = rflow;
rflow = &flow_table->flows[flow_id]; rflow = &flow_table->flows[flow_id];
rflow->cpu = next_cpu;
rflow->filter = rc; rflow->filter = rc;
if (old_rflow->filter == rflow->filter) if (old_rflow->filter == rflow->filter)
old_rflow->filter = RPS_NO_FILTER; old_rflow->filter = RPS_NO_FILTER;
out: out:
#endif #endif
rflow->last_qtail = rflow->last_qtail =
per_cpu(softnet_data, tcpu).input_queue_head; per_cpu(softnet_data, next_cpu).input_queue_head;
} }
rflow->cpu = next_cpu;
return rflow; return rflow;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment