diff mbox series

[net] udp_tunnel: Fix udp_tunnel_nic work-queue type

Message ID 1631519629-12338-1-git-send-email-ayal@nvidia.com (mailing list archive)
State Accepted
Commit e50e711351bdc656a8e6ca1022b4293cae8dcd59
Delegated to: Netdev Maintainers
Headers show
Series [net] udp_tunnel: Fix udp_tunnel_nic work-queue type | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present success Link
netdev/patch_count success Link
netdev/tree_selection success Clearly marked for net
netdev/subject_prefix success Link
netdev/cc_maintainers success CCed 5 of 5 maintainers
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Link
netdev/module_param success Was 0 now: 0
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes success Link
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 8 lines checked
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/header_inline success Link

Commit Message

Aya Levin Sept. 13, 2021, 7:53 a.m. UTC
Turn udp_tunnel_nic work-queue to an ordered work-queue. This queue
holds the UDP-tunnel configuration commands of the different netdevs.
When the netdevs are functions of the same NIC the order of
execution may be crucial.

Problem example:
NIC with 2 PFs, both PFs declare offload quota of up to 3 UDP-ports.
 $ifconfig eth2 1.1.1.1/16 up

 $ip link add eth2_19503 type vxlan id 5049 remote 1.1.1.2 dev eth2 dstport 19053
 $ip link set dev eth2_19503 up

 $ip link add eth2_19504 type vxlan id 5049 remote 1.1.1.3 dev eth2 dstport 19054
 $ip link set dev eth2_19504 up

 $ip link add eth2_19505 type vxlan id 5049 remote 1.1.1.4 dev eth2 dstport 19055
 $ip link set dev eth2_19505 up

 $ip link add eth2_19506 type vxlan id 5049 remote 1.1.1.5 dev eth2 dstport 19056
 $ip link set dev eth2_19506 up

NIC RX port offload infrastructure offloads the first 3 UDP-ports (on
all devices which sets NETIF_F_RX_UDP_TUNNEL_PORT feature) and not
UDP-port 19056. So both PFs gets this offload configuration.

 $ip link set dev eth2_19504 down

This triggers udp-tunnel-core to remove the UDP-port 19504 from
offload-ports-list and offload UDP-port 19056 instead.

In this scenario it is important that the UDP-port of 19504 will be
removed from both PFs before trying to add UDP-port 19056. The NIC can
stop offloading a UDP-port only when all references are removed.
Otherwise the NIC may report exceeding of the offload quota.

Fixes: cc4e3835eff4 ("udp_tunnel: add central NIC RX port offload infrastructure")
Signed-off-by: Aya Levin <ayal@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>

---
 net/ipv4/udp_tunnel_nic.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Hi,
Please queue for -stable >= v5.9.
Thanks.

Comments

patchwork-bot+netdevbpf@kernel.org Sept. 13, 2021, 11:40 a.m. UTC | #1
Hello:

This patch was applied to netdev/net.git (refs/heads/master):

On Mon, 13 Sep 2021 10:53:49 +0300 you wrote:
> Turn udp_tunnel_nic work-queue to an ordered work-queue. This queue
> holds the UDP-tunnel configuration commands of the different netdevs.
> When the netdevs are functions of the same NIC the order of
> execution may be crucial.
> 
> Problem example:
> NIC with 2 PFs, both PFs declare offload quota of up to 3 UDP-ports.
>  $ifconfig eth2 1.1.1.1/16 up
> 
> [...]

Here is the summary with links:
  - [net] udp_tunnel: Fix udp_tunnel_nic work-queue type
    https://git.kernel.org/netdev/net/c/e50e711351bd

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
Jakub Kicinski Sept. 13, 2021, 4:29 p.m. UTC | #2
On Mon, 13 Sep 2021 10:53:49 +0300 Aya Levin wrote:
> Turn udp_tunnel_nic work-queue to an ordered work-queue. This queue
> holds the UDP-tunnel configuration commands of the different netdevs.
> When the netdevs are functions of the same NIC the order of
> execution may be crucial.
> 
> Problem example:
> NIC with 2 PFs, both PFs declare offload quota of up to 3 UDP-ports.
>  $ifconfig eth2 1.1.1.1/16 up
> 
>  $ip link add eth2_19503 type vxlan id 5049 remote 1.1.1.2 dev eth2 dstport 19053
>  $ip link set dev eth2_19503 up
> 
>  $ip link add eth2_19504 type vxlan id 5049 remote 1.1.1.3 dev eth2 dstport 19054
>  $ip link set dev eth2_19504 up
> 
>  $ip link add eth2_19505 type vxlan id 5049 remote 1.1.1.4 dev eth2 dstport 19055
>  $ip link set dev eth2_19505 up
> 
>  $ip link add eth2_19506 type vxlan id 5049 remote 1.1.1.5 dev eth2 dstport 19056
>  $ip link set dev eth2_19506 up
> 
> NIC RX port offload infrastructure offloads the first 3 UDP-ports (on
> all devices which sets NETIF_F_RX_UDP_TUNNEL_PORT feature) and not
> UDP-port 19056. So both PFs gets this offload configuration.
> 
>  $ip link set dev eth2_19504 down
> 
> This triggers udp-tunnel-core to remove the UDP-port 19504 from
> offload-ports-list and offload UDP-port 19056 instead.
> 
> In this scenario it is important that the UDP-port of 19504 will be
> removed from both PFs before trying to add UDP-port 19056. The NIC can
> stop offloading a UDP-port only when all references are removed.
> Otherwise the NIC may report exceeding of the offload quota.
> 
> Fixes: cc4e3835eff4 ("udp_tunnel: add central NIC RX port offload infrastructure")
> Signed-off-by: Aya Levin <ayal@nvidia.com>
> Reviewed-by: Tariq Toukan <tariqt@nvidia.com>

Obviously not. If you hardware uses a single port table regardless of
the number of PFs you should use the shared table version of the API,
like Intel does.
diff mbox series

Patch

diff --git a/net/ipv4/udp_tunnel_nic.c b/net/ipv4/udp_tunnel_nic.c
index 0d122edc368d..b91003538d87 100644
--- a/net/ipv4/udp_tunnel_nic.c
+++ b/net/ipv4/udp_tunnel_nic.c
@@ -935,7 +935,7 @@  static int __init udp_tunnel_nic_init_module(void)
 {
 	int err;
 
-	udp_tunnel_nic_workqueue = alloc_workqueue("udp_tunnel_nic", 0, 0);
+	udp_tunnel_nic_workqueue = alloc_ordered_workqueue("udp_tunnel_nic", 0);
 	if (!udp_tunnel_nic_workqueue)
 		return -ENOMEM;