FAILED: patch "[PATCH] net/smc: fix smc clc failed issue when netdevice not in" failed to apply to 6.1-stable tree
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x c68681ae46eaaa1640b52fe366d21a93b2185df5
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023102058-bullish-chess-e399@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c68681ae46eaaa1640b52fe366d21a93b2185df5 Mon Sep 17 00:00:00 2001
From: Albert Huang <[email protected]>
Date: Wed, 11 Oct 2023 15:48:51 +0800
Subject: [PATCH] net/smc: fix smc clc failed issue when netdevice not in
init_net
If the netdevice is within a container and communicates externally through network technologies such as VxLAN, we won't be able to find routing information in the init_net namespace. To address this issue, we need to add a struct net parameter to the smc_ib_find_route function. This allow us to locate the routing information within the corresponding net namespace, ensuring the correct completion of the SMC CLC interaction.
net/smc/af_smc.c +2 -1
@@ -1201,6 +1201,7 @@ static int smc_connect_rdma_v2_prepare(struct smc_sock *smc, (struct smc_clc_msg_accept_confirm_v2 *)aclc;struct smc_clc_first_contact_ext *fce =smc_get_clc_first_contact_ext (clc_v2, false); +struct net *net =sock_net (&smc->sk);int rc;if (!ini->first_contact_peer || aclc->hdr.version ==SMC_V1 )
@@ -1210,7 +1211,7 @@ static int smc_connect_rdma_v2_prepare(struct smc_sock *smc,memcpy (ini->smcrv2.nexthop_mac, &aclc->r0.lcl.mac,ETH_ALEN ); ini->smcrv2.uses_gateway = false; }else { -if (smc_ib_find_route (smc->clcsock->sk->sk_rcv_saddr, +if (smc_ib_find_route (net, smc->clcsock->sk->sk_rcv_saddr,smc_ib_gid_to_ipv4 (aclc->r0.lcl.gid), ini->smcrv2.nexthop_mac, &ini->smcrv2.uses_gateway))
net/smc/smc_ib.c +4 -3
@@ -193,7 +193,7 @@ bool smc_ib_port_active(struct smc_ib_device *smcibdev, u8 ibport)return smcibdev->pattr[ibport -1 ].state ==IB_PORT_ACTIVE ; } -int smc_ib_find_route (__be32 saddr,__be32 daddr, +int smc_ib_find_route (struct net *net,__be32 saddr,__be32 daddr,u8 nexthop_mac[],u8 *uses_gateway) {struct neighbour *neigh =NULL ;
@@ -205,7 +205,7 @@ int smc_ib_find_route(__be32 saddr, __be32 daddr,if (daddr ==cpu_to_be32 (INADDR_NONE )) goto out; - rt =ip_route_output_flow (&init_net, &fl4,NULL ); + rt =ip_route_output_flow (net, &fl4,NULL );if (IS_ERR (rt)) goto out;if (rt->rt_uses_gateway && rt->rt_gw_family !=AF_INET )
@@ -235,6 +235,7 @@ static int smc_ib_determine_gid_rcu(const struct net_device *ndev,if (smcrv2 && attr->gid_type ==IB_GID_TYPE_ROCE_UDP_ENCAP &&smc_ib_gid_to_ipv4 ((u8 *)&attr->gid) !=cpu_to_be32 (INADDR_NONE )) {struct in_device *in_dev =__in_dev_get_rcu (ndev); +struct net *net =dev_net (ndev);const struct in_ifaddr *ifa;bool subnet_match = false;
@@ -248,7 +249,7 @@ static int smc_ib_determine_gid_rcu(const struct net_device *ndev, }if (!subnet_match) goto out; -if (smcrv2->daddr &&smc_ib_find_route (smcrv2->saddr, +if (smcrv2->daddr &&smc_ib_find_route (net, smcrv2->saddr, smcrv2->daddr, smcrv2->nexthop_mac, &smcrv2->uses_gateway))
net/smc/smc_ib.h +1 -1
@@ -112,7 +112,7 @@ void smc_ib_sync_sg_for_device(struct smc_link *lnk,int smc_ib_determine_gid (struct smc_ib_device *smcibdev,u8 ibport,unsigned short vlan_id,u8 gid[],u8 *sgid_index,struct smc_init_info_smcrv2 *smcrv2); -int smc_ib_find_route (__be32 saddr,__be32 daddr, +int smc_ib_find_route (struct net *net,__be32 saddr,__be32 daddr,u8 nexthop_mac[],u8 *uses_gateway);bool smc_ib_is_valid_local_systemid (void );int smcr_nl_get_device (struct sk_buff *skb,struct netlink_callback *cb);