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 2/6] RDMA/rxe: Handle loopback of mcast packets
Date: Sat, 4 Nov 2023 20:30:50 +0800 [thread overview]
Message-ID: <ee0ee8e1-d9ff-4938-80fe-148d4c367770@linux.dev> (raw)
In-Reply-To: <20231103204324.9606-3-rpearsonhpe@gmail.com>
在 2023/11/4 4:43, Bob Pearson 写道:
> Add a mask bit to indicate that a multicast packet has been locally
> sent and use to set the correct qpn for multicast packets.
>
> Add code to rxe_xmit_packet() to correctly handle multicast packets
> which must be sent on the wire and also duplicated to any local qps
> which may belong the multicast group, but not including the sender.
>
> Fixes: 6090a0c4c7c6 ("RDMA/rxe: Cleanup rxe_mcast.c")
> Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
> ---
> drivers/infiniband/sw/rxe/rxe_av.c | 7 +++++++
> drivers/infiniband/sw/rxe/rxe_loc.h | 1 +
> drivers/infiniband/sw/rxe/rxe_net.c | 25 ++++++++++++++++++++++++-
> drivers/infiniband/sw/rxe/rxe_opcode.h | 2 +-
> drivers/infiniband/sw/rxe/rxe_recv.c | 4 ++++
> drivers/infiniband/sw/rxe/rxe_req.c | 11 +++++++++--
> 6 files changed, 46 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_av.c b/drivers/infiniband/sw/rxe/rxe_av.c
> index 4ac17b8def28..022173eb5d75 100644
> --- a/drivers/infiniband/sw/rxe/rxe_av.c
> +++ b/drivers/infiniband/sw/rxe/rxe_av.c
> @@ -7,6 +7,13 @@
> #include "rxe.h"
> #include "rxe_loc.h"
>
> +bool rxe_is_mcast_av(struct rxe_av *av)
> +{
> + struct in6_addr *daddr = (struct in6_addr *)av->grh.dgid.raw;
> +
> + return rdma_is_multicast_addr(daddr);
> +}
> +
> void rxe_init_av(struct rdma_ah_attr *attr, struct rxe_av *av)
> {
> rxe_av_from_attr(rdma_ah_get_port_num(attr), av, attr);
> diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
> index 3d2504a0ae56..62b2b25903fc 100644
> --- a/drivers/infiniband/sw/rxe/rxe_loc.h
> +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
> @@ -8,6 +8,7 @@
> #define RXE_LOC_H
>
> /* rxe_av.c */
> +bool rxe_is_mcast_av(struct rxe_av *av);
> void rxe_init_av(struct rdma_ah_attr *attr, struct rxe_av *av);
> int rxe_chk_ah_attr(struct rxe_dev *rxe, struct rdma_ah_attr *attr);
> void rxe_av_from_attr(u8 port_num, struct rxe_av *av,
> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
> index cd59666158b1..2fad56fc95e7 100644
> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> @@ -412,6 +412,27 @@ static int rxe_loopback(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> return 0;
> }
>
> +/* for a multicast packet must send remotely and looback to any local qps
> + * that may belong to the mcast group
> + */
https://www.kernel.org/doc/html/v4.15/process/coding-style.html
Please follow the preferred style for long (multi-line) comments in the
above link.
Zhu Yanjun
> +static int rxe_loop_and_send(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> +{
> + struct sk_buff *cskb;
> + int err, loc_err = 0;
> +
> + if (atomic_read(&pkt->rxe->mcg_num)) {
> + loc_err = -ENOMEM;
> + cskb = skb_clone(skb, GFP_KERNEL);
> + if (cskb)
> + loc_err = rxe_loopback(cskb, pkt);
> + }
> +
> + err = rxe_send(skb, pkt);
> + if (loc_err)
> + err = loc_err;
> + return err;
> +}
> +
> int rxe_xmit_packet(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
> struct sk_buff *skb)
> {
> @@ -431,7 +452,9 @@ int rxe_xmit_packet(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
>
> rxe_icrc_generate(skb, pkt);
>
> - if (pkt->mask & RXE_LOOPBACK_MASK)
> + if (pkt->mask & RXE_MCAST_MASK)
> + err = rxe_loop_and_send(skb, pkt);
> + else if (pkt->mask & RXE_LOOPBACK_MASK)
> err = rxe_loopback(skb, pkt);
> else
> err = rxe_send(skb, pkt);
> diff --git a/drivers/infiniband/sw/rxe/rxe_opcode.h b/drivers/infiniband/sw/rxe/rxe_opcode.h
> index 5686b691d6b8..c4cf672ea26d 100644
> --- a/drivers/infiniband/sw/rxe/rxe_opcode.h
> +++ b/drivers/infiniband/sw/rxe/rxe_opcode.h
> @@ -85,7 +85,7 @@ enum rxe_hdr_mask {
> RXE_END_MASK = BIT(NUM_HDR_TYPES + 11),
>
> RXE_LOOPBACK_MASK = BIT(NUM_HDR_TYPES + 12),
> -
> + RXE_MCAST_MASK = BIT(NUM_HDR_TYPES + 13),
> RXE_ATOMIC_WRITE_MASK = BIT(NUM_HDR_TYPES + 14),
>
> RXE_READ_OR_ATOMIC_MASK = (RXE_READ_MASK | RXE_ATOMIC_MASK),
> diff --git a/drivers/infiniband/sw/rxe/rxe_recv.c b/drivers/infiniband/sw/rxe/rxe_recv.c
> index 5861e4244049..7153de0799fc 100644
> --- a/drivers/infiniband/sw/rxe/rxe_recv.c
> +++ b/drivers/infiniband/sw/rxe/rxe_recv.c
> @@ -217,6 +217,10 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb)
> list_for_each_entry(mca, &mcg->qp_list, qp_list) {
> qp = mca->qp;
>
> + /* don't reply packet to sender if locally sent */
> + if (pkt->mask & RXE_MCAST_MASK && qp_num(qp) == deth_sqp(pkt))
> + continue;
> +
> /* validate qp for incoming packet */
> err = check_type_state(rxe, pkt, qp);
> if (err)
> diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c
> index d8c41fd626a9..599bec88cb54 100644
> --- a/drivers/infiniband/sw/rxe/rxe_req.c
> +++ b/drivers/infiniband/sw/rxe/rxe_req.c
> @@ -442,8 +442,12 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
> (pkt->mask & (RXE_WRITE_MASK | RXE_IMMDT_MASK)) ==
> (RXE_WRITE_MASK | RXE_IMMDT_MASK));
>
> - qp_num = (pkt->mask & RXE_DETH_MASK) ? ibwr->wr.ud.remote_qpn :
> - qp->attr.dest_qp_num;
> + if (pkt->mask & RXE_MCAST_MASK)
> + qp_num = IB_MULTICAST_QPN;
> + else if (pkt->mask & RXE_DETH_MASK)
> + qp_num = ibwr->wr.ud.remote_qpn;
> + else
> + qp_num = qp->attr.dest_qp_num;
>
> ack_req = ((pkt->mask & RXE_END_MASK) ||
> (qp->req.noack_pkts++ > RXE_MAX_PKT_PER_ACK));
> @@ -809,6 +813,9 @@ int rxe_requester(struct rxe_qp *qp)
> goto err;
> }
>
> + if (rxe_is_mcast_av(av))
> + pkt.mask |= RXE_MCAST_MASK;
> +
> skb = init_req_packet(qp, av, wqe, opcode, payload, &pkt);
> if (unlikely(!skb)) {
> rxe_dbg_qp(qp, "Failed allocating skb\n");
next prev parent reply other threads:[~2023-11-04 12:31 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 [this message]
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
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=ee0ee8e1-d9ff-4938-80fe-148d4c367770@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox