From: yanjun.zhu@linux.dev
To: jgg@ziepe.ca, leon@kernel.org, zyjzyj2000@gmail.com,
linux-rdma@vger.kernel.org, yanjun.zhu@linux.dev,
netdev@vger.kernel.org, davem@davemloft.net
Subject: [PATCHv2 5/6] RDMA/rxe: Replace global variable with sock lookup functions
Date: Thu, 6 Oct 2022 04:59:20 -0400 [thread overview]
Message-ID: <20221006085921.1323148-6-yanjun.zhu@linux.dev> (raw)
In-Reply-To: <20221006085921.1323148-1-yanjun.zhu@linux.dev>
From: Zhu Yanjun <yanjun.zhu@linux.dev>
Originally a global variable is to keep the sock of udp listening
on port 4791. In fact, sock lookup functions can be used to get
the sock.
Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
---
drivers/infiniband/sw/rxe/rxe.c | 1 +
drivers/infiniband/sw/rxe/rxe_net.c | 58 ++++++++++++++++++++-------
drivers/infiniband/sw/rxe/rxe_net.h | 5 ---
drivers/infiniband/sw/rxe/rxe_verbs.h | 1 +
4 files changed, 45 insertions(+), 20 deletions(-)
diff --git a/drivers/infiniband/sw/rxe/rxe.c b/drivers/infiniband/sw/rxe/rxe.c
index 1b8b74ea84e9..933d8e129c47 100644
--- a/drivers/infiniband/sw/rxe/rxe.c
+++ b/drivers/infiniband/sw/rxe/rxe.c
@@ -74,6 +74,7 @@ static void rxe_init_device_param(struct rxe_dev *rxe)
rxe->ndev->dev_addr);
rxe->max_ucontext = RXE_MAX_UCONTEXT;
+ rxe->l_sk6 = NULL;
}
/* initialize port attributes */
diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index 6e35566e933b..64b11faccfb4 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -18,8 +18,6 @@
#include "rxe_net.h"
#include "rxe_loc.h"
-static struct rxe_recv_sockets recv_sockets;
-
static struct dst_entry *rxe_find_route4(struct net_device *ndev,
struct in_addr *saddr,
struct in_addr *daddr)
@@ -49,6 +47,23 @@ static struct dst_entry *rxe_find_route6(struct net_device *ndev,
{
struct dst_entry *ndst;
struct flowi6 fl6 = { { 0 } };
+ struct rxe_dev *rdev;
+
+ rdev = rxe_get_dev_from_net(ndev);
+ if (!rdev->l_sk6) {
+ struct sock *sk;
+
+ rcu_read_lock();
+ sk = udp6_lib_lookup(&init_net, NULL, 0, &in6addr_any, htons(ROCE_V2_UDP_DPORT), 0);
+ rcu_read_unlock();
+ if (!sk) {
+ pr_info("file: %s +%d, error\n", __FILE__, __LINE__);
+ return (struct dst_entry *)sk;
+ }
+ __sock_put(sk);
+ rdev->l_sk6 = sk->sk_socket;
+ }
+
memset(&fl6, 0, sizeof(fl6));
fl6.flowi6_oif = ndev->ifindex;
@@ -56,8 +71,8 @@ static struct dst_entry *rxe_find_route6(struct net_device *ndev,
memcpy(&fl6.daddr, daddr, sizeof(*daddr));
fl6.flowi6_proto = IPPROTO_UDP;
- ndst = ipv6_stub->ipv6_dst_lookup_flow(sock_net(recv_sockets.sk6->sk),
- recv_sockets.sk6->sk, &fl6,
+ ndst = ipv6_stub->ipv6_dst_lookup_flow(dev_net(ndev),
+ rdev->l_sk6->sk, &fl6,
NULL);
if (IS_ERR(ndst)) {
pr_err_ratelimited("no route to %pI6\n", daddr);
@@ -530,15 +545,33 @@ int rxe_net_add(const char *ibdev_name, struct net_device *ndev)
#define SK_REF_FOR_TUNNEL 2
void rxe_net_del(struct ib_device *dev)
{
- if (refcount_read(&recv_sockets.sk6->sk->sk_refcnt) > SK_REF_FOR_TUNNEL)
- __sock_put(recv_sockets.sk6->sk);
+ struct sock *sk;
+
+ rcu_read_lock();
+ sk = udp4_lib_lookup(&init_net, 0, 0, htonl(INADDR_ANY), htons(ROCE_V2_UDP_DPORT), 0);
+ rcu_read_unlock();
+ if (!sk)
+ return;
+
+ __sock_put(sk);
+
+ if (refcount_read(&sk->sk_refcnt) > SK_REF_FOR_TUNNEL)
+ __sock_put(sk);
else
- rxe_release_udp_tunnel(recv_sockets.sk6);
+ rxe_release_udp_tunnel(sk->sk_socket);
+
+ rcu_read_lock();
+ sk = udp6_lib_lookup(&init_net, NULL, 0, &in6addr_any, htons(ROCE_V2_UDP_DPORT), 0);
+ rcu_read_unlock();
+ if (!sk)
+ return;
+
+ __sock_put(sk);
- if (refcount_read(&recv_sockets.sk4->sk->sk_refcnt) > SK_REF_FOR_TUNNEL)
- __sock_put(recv_sockets.sk4->sk);
+ if (refcount_read(&sk->sk_refcnt) > SK_REF_FOR_TUNNEL)
+ __sock_put(sk);
else
- rxe_release_udp_tunnel(recv_sockets.sk4);
+ rxe_release_udp_tunnel(sk->sk_socket);
}
static void rxe_port_event(struct rxe_dev *rxe,
@@ -647,10 +680,8 @@ static int rxe_net_ipv4_init(void)
sock = rxe_setup_udp_tunnel(&init_net, htons(ROCE_V2_UDP_DPORT), false);
if (IS_ERR(sock)) {
pr_err("Failed to create IPv4 UDP tunnel\n");
- recv_sockets.sk4 = NULL;
return -1;
}
- recv_sockets.sk4 = sock;
return 0;
}
@@ -670,17 +701,14 @@ static int rxe_net_ipv6_init(void)
sock = rxe_setup_udp_tunnel(&init_net, htons(ROCE_V2_UDP_DPORT), true);
if (PTR_ERR(sock) == -EAFNOSUPPORT) {
- recv_sockets.sk6 = NULL;
pr_warn("IPv6 is not supported, can not create a UDPv6 socket\n");
return 0;
}
if (IS_ERR(sock)) {
- recv_sockets.sk6 = NULL;
pr_err("Failed to create IPv6 UDP tunnel\n");
return -1;
}
- recv_sockets.sk6 = sock;
#endif
return 0;
}
diff --git a/drivers/infiniband/sw/rxe/rxe_net.h b/drivers/infiniband/sw/rxe/rxe_net.h
index f48f22f3353b..027b20e1bab6 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.h
+++ b/drivers/infiniband/sw/rxe/rxe_net.h
@@ -11,11 +11,6 @@
#include <net/if_inet6.h>
#include <linux/module.h>
-struct rxe_recv_sockets {
- struct socket *sk4;
- struct socket *sk6;
-};
-
int rxe_net_add(const char *ibdev_name, struct net_device *ndev);
void rxe_net_del(struct ib_device *dev);
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
index 96af3e054f4d..13b12f02a52e 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.h
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
@@ -406,6 +406,7 @@ struct rxe_dev {
struct rxe_port port;
struct crypto_shash *tfm;
+ struct socket *l_sk6;
};
static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index)
--
2.27.0
next prev parent reply other threads:[~2022-10-05 16:33 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-06 8:59 [PATCHv2 0/6] Fix the problem that rxe can not work in net yanjun.zhu
2022-10-06 8:59 ` [PATCHv2 1/6] RDMA/rxe: Creating listening sock in newlink function yanjun.zhu
2022-10-06 8:59 ` [PATCHv2 2/6] RDMA/rxe: Support more rdma links in init_net yanjun.zhu
2022-10-06 8:59 ` [PATCHv2 3/6] RDMA/nldev: Add dellink function pointer yanjun.zhu
2022-10-06 8:59 ` [PATCHv2 4/6] RDMA/rxe: Implement dellink in rxe yanjun.zhu
2022-10-06 8:59 ` yanjun.zhu [this message]
2022-10-06 8:59 ` [PATCHv2 6/6] RDMA/rxe: add the support of net namespace yanjun.zhu
2022-10-19 14:56 ` [PATCHv2 0/6] Fix the problem that rxe can not work in net Yanjun Zhu
2022-11-11 2:36 ` Yanjun Zhu
2022-11-11 3:35 ` Parav Pandit
2022-11-11 3:38 ` Yanjun Zhu
2022-11-13 4:58 ` Parav Pandit
2022-11-13 10:25 ` Yanjun Zhu
2023-02-13 12:00 ` Zhu Yanjun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221006085921.1323148-6-yanjun.zhu@linux.dev \
--to=yanjun.zhu@linux.dev \
--cc=davem@davemloft.net \
--cc=jgg@ziepe.ca \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=zyjzyj2000@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.