From: Zhu Yanjun <yanjun.zhu@linux.dev>
To: Bob Pearson <rpearsonhpe@gmail.com>,
jgg@nvidia.com, linux-rdma@vger.kernel.org
Subject: Re: [PATCH for-next 3/6] RDMA/rxe: Register IP mcast address
Date: Sat, 4 Nov 2023 20:42:26 +0800 [thread overview]
Message-ID: <30513a47-68c6-410f-bbfb-09211f07b082@linux.dev> (raw)
In-Reply-To: <20231103204324.9606-4-rpearsonhpe@gmail.com>
在 2023/11/4 4:43, Bob Pearson 写道:
> Add code to rxe_mcast_add() and rxe_mcast_del() to register/deregister
> the IP multicast address. This is required for multicast traffic to
> reach the rxe driver.
>
> Fixes: 6090a0c4c7c6 ("RDMA/rxe: Cleanup rxe_mcast.c")
> Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
> ---
> drivers/infiniband/sw/rxe/rxe_mcast.c | 110 +++++++++++++++++++++-----
> drivers/infiniband/sw/rxe/rxe_net.c | 2 +-
> drivers/infiniband/sw/rxe/rxe_net.h | 1 +
> drivers/infiniband/sw/rxe/rxe_verbs.h | 1 +
> 4 files changed, 93 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_mcast.c b/drivers/infiniband/sw/rxe/rxe_mcast.c
> index 86cc2e18a7fd..ec757b955979 100644
> --- a/drivers/infiniband/sw/rxe/rxe_mcast.c
> +++ b/drivers/infiniband/sw/rxe/rxe_mcast.c
> @@ -19,38 +19,107 @@
> * mcast packets in the rxe receive path.
> */
>
> +#include <linux/igmp.h>
> +
> #include "rxe.h"
>
> -/**
> - * rxe_mcast_add - add multicast address to rxe device
> - * @rxe: rxe device object
> - * @mgid: multicast address as a gid
> - *
> - * Returns 0 on success else an error
> - */
> -static int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)
> +/* register mcast IP and MAC addresses with net stack */
> +static int rxe_mcast_add6(struct rxe_dev *rxe, union ib_gid *mgid)
> {
> unsigned char ll_addr[ETH_ALEN];
> + struct in6_addr *addr6 = (struct in6_addr *)mgid;
> + int err;
Using reverse fir tree, a.k.a. reverse Christmas tree or reverse XMAS
tree, for
variable declarations isn't strictly required, though it is still preferred.
Zhu Yanjun
> +
> + rtnl_lock();
> + err = ipv6_sock_mc_join(recv_sockets.sk6->sk, rxe->ndev->ifindex,
> + addr6);
> + rtnl_unlock();
> + if (err && err != -EADDRINUSE)
> + goto err_out;
>
> ipv6_eth_mc_map((struct in6_addr *)mgid->raw, ll_addr);
> + err = dev_mc_add(rxe->ndev, ll_addr);
> + if (err)
> + goto err_drop;
> +
> + return 0;
>
> - return dev_mc_add(rxe->ndev, ll_addr);
> +err_drop:
> + ipv6_sock_mc_drop(recv_sockets.sk6->sk, rxe->ndev->ifindex, addr6);
> +err_out:
> + return err;
> }
>
> -/**
> - * rxe_mcast_del - delete multicast address from rxe device
> - * @rxe: rxe device object
> - * @mgid: multicast address as a gid
> - *
> - * Returns 0 on success else an error
> - */
> -static int rxe_mcast_del(struct rxe_dev *rxe, union ib_gid *mgid)
> +static int rxe_mcast_add(struct rxe_mcg *mcg)
> {
> + struct rxe_dev *rxe = mcg->rxe;
> + union ib_gid *mgid = &mcg->mgid;
> + struct ip_mreqn imr = {};
> unsigned char ll_addr[ETH_ALEN];
> + int err;
> +
> + if (mcg->is_ipv6)
> + return rxe_mcast_add6(rxe, mgid);
> +
> + imr.imr_multiaddr = *(struct in_addr *)(mgid->raw + 12);
> + imr.imr_ifindex = rxe->ndev->ifindex;
> + rtnl_lock();
> + err = ip_mc_join_group(recv_sockets.sk4->sk, &imr);
> + rtnl_unlock();
> + if (err && err != -EADDRINUSE)
> + goto err_out;
> +
> + ip_eth_mc_map(imr.imr_multiaddr.s_addr, ll_addr);
> + err = dev_mc_add(rxe->ndev, ll_addr);
> + if (err)
> + goto err_leave;
> +
> + return 0;
> +
> +err_leave:
> + ip_mc_leave_group(recv_sockets.sk4->sk, &imr);
> +err_out:
> + return err;
> +}
> +
> +/* deregister mcast IP and MAC addresses with net stack */
> +static int rxe_mcast_del6(struct rxe_dev *rxe, union ib_gid *mgid)
> +{
> + unsigned char ll_addr[ETH_ALEN];
> + int err, err2;
>
> ipv6_eth_mc_map((struct in6_addr *)mgid->raw, ll_addr);
> + err = dev_mc_del(rxe->ndev, ll_addr);
> +
> + rtnl_lock();
> + err2 = ipv6_sock_mc_drop(recv_sockets.sk6->sk,
> + rxe->ndev->ifindex, (struct in6_addr *)mgid);
> + rtnl_unlock();
> +
> + return err ?: err2;
> +}
> +
> +static int rxe_mcast_del(struct rxe_mcg *mcg)
> +{
> + struct rxe_dev *rxe = mcg->rxe;
> + union ib_gid *mgid = &mcg->mgid;
> + struct ip_mreqn imr = {};
> + unsigned char ll_addr[ETH_ALEN];
> + int err, err2;
> +
> + if (mcg->is_ipv6)
> + return rxe_mcast_del6(rxe, mgid);
> +
> + imr.imr_multiaddr = *(struct in_addr *)(mgid->raw + 12);
> + imr.imr_ifindex = rxe->ndev->ifindex;
> + ip_eth_mc_map(imr.imr_multiaddr.s_addr, ll_addr);
> + err = dev_mc_del(rxe->ndev, ll_addr);
> +
> + rtnl_lock();
> + err2 = ip_mc_leave_group(recv_sockets.sk4->sk, &imr);
> + rtnl_unlock();
>
> - return dev_mc_del(rxe->ndev, ll_addr);
> + return err ?: err2;
> }
>
> /**
> @@ -164,6 +233,7 @@ static void __rxe_init_mcg(struct rxe_dev *rxe, union ib_gid *mgid,
> {
> kref_init(&mcg->ref_cnt);
> memcpy(&mcg->mgid, mgid, sizeof(mcg->mgid));
> + mcg->is_ipv6 = !ipv6_addr_v4mapped((struct in6_addr *)mgid);
> INIT_LIST_HEAD(&mcg->qp_list);
> mcg->rxe = rxe;
>
> @@ -225,7 +295,7 @@ static struct rxe_mcg *rxe_get_mcg(struct rxe_dev *rxe, union ib_gid *mgid)
> spin_unlock_bh(&rxe->mcg_lock);
>
> /* add mcast address outside of lock */
> - err = rxe_mcast_add(rxe, mgid);
> + err = rxe_mcast_add(mcg);
> if (!err)
> return mcg;
>
> @@ -273,7 +343,7 @@ static void __rxe_destroy_mcg(struct rxe_mcg *mcg)
> static void rxe_destroy_mcg(struct rxe_mcg *mcg)
> {
> /* delete mcast address outside of lock */
> - rxe_mcast_del(mcg->rxe, &mcg->mgid);
> + rxe_mcast_del(mcg);
>
> spin_lock_bh(&mcg->rxe->mcg_lock);
> __rxe_destroy_mcg(mcg);
> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
> index 2fad56fc95e7..36617d07fddf 100644
> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> @@ -18,7 +18,7 @@
> #include "rxe_net.h"
> #include "rxe_loc.h"
>
> -static struct rxe_recv_sockets recv_sockets;
> +struct rxe_recv_sockets recv_sockets;
>
> static struct dst_entry *rxe_find_route4(struct rxe_qp *qp,
> struct net_device *ndev,
> diff --git a/drivers/infiniband/sw/rxe/rxe_net.h b/drivers/infiniband/sw/rxe/rxe_net.h
> index 45d80d00f86b..89cee7d5340f 100644
> --- a/drivers/infiniband/sw/rxe/rxe_net.h
> +++ b/drivers/infiniband/sw/rxe/rxe_net.h
> @@ -15,6 +15,7 @@ struct rxe_recv_sockets {
> struct socket *sk4;
> struct socket *sk6;
> };
> +extern struct rxe_recv_sockets recv_sockets;
>
> int rxe_net_add(const char *ibdev_name, struct net_device *ndev);
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
> index ccb9d19ffe8a..7be9e6232dd9 100644
> --- a/drivers/infiniband/sw/rxe/rxe_verbs.h
> +++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
> @@ -352,6 +352,7 @@ struct rxe_mcg {
> atomic_t qp_num;
> u32 qkey;
> u16 pkey;
> + bool is_ipv6;
> };
>
> struct rxe_mca {
next prev parent reply other threads:[~2023-11-04 12:42 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-03 20:43 [PATCH for-next 0/6] RDMA/rxe: Make multicast actually work Bob Pearson
2023-11-03 20:43 ` [PATCH for-next 1/6] RDMA/rxe: Cleanup rxe_ah/av_chk_attr Bob Pearson
2023-11-03 20:43 ` [PATCH for-next 2/6] RDMA/rxe: Handle loopback of mcast packets Bob Pearson
2023-11-04 12:30 ` Zhu Yanjun
2023-11-03 20:43 ` [PATCH for-next 3/6] RDMA/rxe: Register IP mcast address Bob Pearson
2023-11-04 12:42 ` Zhu Yanjun [this message]
2023-11-05 20:19 ` Bob Pearson
2023-11-06 13:26 ` Zhu Yanjun
2023-11-06 17:31 ` Bob Pearson
2023-11-08 1:24 ` Zhu Yanjun
2023-11-03 20:43 ` [PATCH for-next 4/6] RDMA/rxe: Let rxe_lookup_mcg use rcu_read_lock Bob Pearson
2023-11-03 20:43 ` [PATCH for-next 5/6] RDMA/rxe: Split multicast lock Bob Pearson
2023-11-03 20:43 ` [PATCH for-next 6/6] RDMA/rxe: Cleanup mcg lifetime Bob Pearson
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=30513a47-68c6-410f-bbfb-09211f07b082@linux.dev \
--to=yanjun.zhu@linux.dev \
--cc=jgg@nvidia.com \
--cc=linux-rdma@vger.kernel.org \
--cc=rpearsonhpe@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.