The transmit queue selected for a packet is saved in the associated sock for the packet and is subsequently used to avoid recalculating the queue on subsequent sends. The problem is that the corresponding device is not also recorded so that when the queue mapping is referenced it may correspond to a different device than the sending one, resulting in an incorrect queue being used for transmit. A similar problem exists in recording the receive queue in the sock without the corresponding receive device.
This patch set fixes the issue by recording both the device (via ifindex) and the queue in the sock mapping. The pair is set and retrieved atomically. The caller getting the mapping pair checks that both the recorded queue and in the device are valid in the context (for instance, in transmit the returned ifindex is checked against that of the transmitting device to ensure they refer to same device before apply the recorded queue). This patch set contains: - Definition of dev_and_queue structure to hold the ifindex and queue number - Generic functions to get, set, and clear dev_and_queue structure - Change sk_tx_queue_{get,set,clear} to sk_tx_dev_and_queue_{get,set,clear} - Modify callers of above to use new interface - Change sk_rx_queue_{get,set,clear} to sk_rx_dev_and_queue_{get,set,clear} - Modify callers of above to use new interface Tom Herbert (3): sock: Definition and general functions for dev_and_queue structure sock: Use dev_and_queue structure for TX queue mapping in sock sock: Use dev_and_queue structure for RX queue mapping in sock .../mellanox/mlx5/core/en_accel/ktls_rx.c | 10 +- drivers/net/hyperv/netvsc_drv.c | 9 +- include/net/busy_poll.h | 2 +- include/net/request_sock.h | 2 +- include/net/sock.h | 126 +++++++++++++----- net/core/dev.c | 15 ++- net/core/filter.c | 7 +- net/core/sock.c | 10 +- net/ipv4/tcp_input.c | 2 +- 9 files changed, 124 insertions(+), 59 deletions(-) -- 2.25.1