From: Zhu Yanjun <yanjun.zhu@linux.dev>
To: Eric Biggers <ebiggers@kernel.org>,
linux-rdma@vger.kernel.org,
Mustafa Ismail <mustafa.ismail@intel.com>,
Tatyana Nikolova <tatyana.e.nikolova@intel.com>,
Jason Gunthorpe <jgg@ziepe.ca>, Leon Romanovsky <leon@kernel.org>,
Zhu Yanjun <zyjzyj2000@gmail.com>,
Bernard Metzler <bmt@zurich.ibm.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/6] RDMA/rxe: consolidate code for calculating ICRC of packets
Date: Wed, 29 Jan 2025 19:11:35 +0100 [thread overview]
Message-ID: <048daa22-fdc6-4f5f-9fa3-e023dc421aab@linux.dev> (raw)
In-Reply-To: <20250127223840.67280-3-ebiggers@kernel.org>
在 2025/1/27 23:38, Eric Biggers 写道:
> From: Eric Biggers <ebiggers@google.com>
>
> Since rxe_icrc_hdr() is always immediately followed by updating the CRC
> with the packet's payload, just rename it to rxe_icrc() and make it
> include the payload in the CRC, so it now handles the entire packet.
>
> This is a refactor with no change in behavior.
In this commit, currently the entire packet are checked while the header
is checked in the original source code.
Now it can work between RXE <----> RXE.
I am not sure whether RXE <---> MLX can work or not.
If it can work well, I am fine with this patch.
Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>
Zhu Yanjun
>
> Signed-off-by: Eric Biggers <ebiggers@google.com>
> ---
> drivers/infiniband/sw/rxe/rxe_icrc.c | 36 ++++++++++++----------------
> 1 file changed, 15 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_icrc.c b/drivers/infiniband/sw/rxe/rxe_icrc.c
> index ee417a0bbbdca..c7b0b4673b959 100644
> --- a/drivers/infiniband/sw/rxe/rxe_icrc.c
> +++ b/drivers/infiniband/sw/rxe/rxe_icrc.c
> @@ -60,26 +60,24 @@ static u32 rxe_crc32(struct rxe_dev *rxe, u32 crc, void *next, size_t len)
>
> return icrc;
> }
>
> /**
> - * rxe_icrc_hdr() - Compute the partial ICRC for the network and transport
> - * headers of a packet.
> + * rxe_icrc() - Compute the ICRC of a packet
> * @skb: packet buffer
> * @pkt: packet information
> *
> - * Return: the partial ICRC
> + * Return: the ICRC
> */
> -static u32 rxe_icrc_hdr(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> +static u32 rxe_icrc(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> {
> unsigned int bth_offset = 0;
> struct iphdr *ip4h = NULL;
> struct ipv6hdr *ip6h = NULL;
> struct udphdr *udph;
> struct rxe_bth *bth;
> u32 crc;
> - int length;
> int hdr_size = sizeof(struct udphdr) +
> (skb->protocol == htons(ETH_P_IP) ?
> sizeof(struct iphdr) : sizeof(struct ipv6hdr));
> /* pseudo header buffer size is calculate using ipv6 header size since
> * it is bigger than ipv4
> @@ -118,17 +116,23 @@ static u32 rxe_icrc_hdr(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> bth = (struct rxe_bth *)&pshdr[bth_offset];
>
> /* exclude bth.resv8a */
> bth->qpn |= cpu_to_be32(~BTH_QPN_MASK);
>
> - length = hdr_size + RXE_BTH_BYTES;
> - crc = rxe_crc32(pkt->rxe, crc, pshdr, length);
> + /* Update the CRC with the first part of the headers. */
> + crc = rxe_crc32(pkt->rxe, crc, pshdr, hdr_size + RXE_BTH_BYTES);
>
> - /* And finish to compute the CRC on the remainder of the headers. */
> + /* Update the CRC with the remainder of the headers. */
> crc = rxe_crc32(pkt->rxe, crc, pkt->hdr + RXE_BTH_BYTES,
> rxe_opcode[pkt->opcode].length - RXE_BTH_BYTES);
> - return crc;
> +
> + /* Update the CRC with the payload. */
> + crc = rxe_crc32(pkt->rxe, crc, payload_addr(pkt),
> + payload_size(pkt) + bth_pad(pkt));
> +
> + /* Invert the CRC and return it. */
> + return ~crc;
> }
>
> /**
> * rxe_icrc_check() - Compute ICRC for a packet and compare to the ICRC
> * delivered in the packet.
> @@ -146,18 +150,12 @@ int rxe_icrc_check(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> * descending order from the x^31 coefficient to the x^0 one. When the
> * result is interpreted as a 32-bit integer using the required reverse
> * mapping between bits and polynomial coefficients, it's a __le32.
> */
> __le32 *icrcp = (__le32 *)(pkt->hdr + pkt->paylen - RXE_ICRC_SIZE);
> - u32 icrc;
>
> - icrc = rxe_icrc_hdr(skb, pkt);
> - icrc = rxe_crc32(pkt->rxe, icrc, (u8 *)payload_addr(pkt),
> - payload_size(pkt) + bth_pad(pkt));
> - icrc = ~icrc;
> -
> - if (unlikely(icrc != le32_to_cpu(*icrcp)))
> + if (unlikely(rxe_icrc(skb, pkt) != le32_to_cpu(*icrcp)))
> return -EINVAL;
>
> return 0;
> }
>
> @@ -167,12 +165,8 @@ int rxe_icrc_check(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> * @pkt: packet information
> */
> void rxe_icrc_generate(struct sk_buff *skb, struct rxe_pkt_info *pkt)
> {
> __le32 *icrcp = (__le32 *)(pkt->hdr + pkt->paylen - RXE_ICRC_SIZE);
> - u32 icrc;
>
> - icrc = rxe_icrc_hdr(skb, pkt);
> - icrc = rxe_crc32(pkt->rxe, icrc, (u8 *)payload_addr(pkt),
> - payload_size(pkt) + bth_pad(pkt));
> - *icrcp = cpu_to_le32(~icrc);
> + *icrcp = cpu_to_le32(rxe_icrc(skb, pkt));
> }
next prev parent reply other threads:[~2025-01-29 18:11 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-27 22:38 [PATCH 0/6] RDMA: switch to using CRC32 library functions Eric Biggers
2025-01-27 22:38 ` [PATCH 1/6] RDMA/rxe: handle ICRC correctly on big endian systems Eric Biggers
2025-01-29 9:44 ` Zhu Yanjun
2025-01-29 18:30 ` Jason Gunthorpe
2025-01-29 18:51 ` Eric Biggers
2025-01-29 19:43 ` Jason Gunthorpe
2025-01-29 20:25 ` Eric Biggers
2025-01-29 21:16 ` Jason Gunthorpe
2025-01-29 22:21 ` Eric Biggers
2025-01-30 1:29 ` Jason Gunthorpe
2025-01-30 2:04 ` Eric Biggers
2025-01-30 13:52 ` Jason Gunthorpe
2025-01-30 9:17 ` Zhu Yanjun
2025-01-30 7:27 ` Zhu Yanjun
2025-01-29 18:27 ` Zhu Yanjun
2025-01-29 19:02 ` Eric Biggers
2025-01-27 22:38 ` [PATCH 2/6] RDMA/rxe: consolidate code for calculating ICRC of packets Eric Biggers
2025-01-29 18:11 ` Zhu Yanjun [this message]
2025-01-30 2:15 ` Eric Biggers
2025-01-30 7:24 ` Zhu Yanjun
2025-01-31 2:42 ` Eric Biggers
2025-01-27 22:38 ` [PATCH 3/6] RDMA/rxe: switch to using the crc32 library Eric Biggers
2025-01-29 18:30 ` Zhu Yanjun
2025-01-27 22:38 ` [PATCH 4/6] RDMA/irdma: switch to using the crc32c library Eric Biggers
2025-01-27 22:38 ` [PATCH 5/6] RDMA/siw: fix type of CRC field Eric Biggers
2025-01-31 12:24 ` Bernard Metzler
2025-01-27 22:38 ` [PATCH 6/6] RDMA/siw: switch to using the crc32c library Eric Biggers
2025-01-31 14:17 ` Bernard Metzler
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=048daa22-fdc6-4f5f-9fa3-e023dc421aab@linux.dev \
--to=yanjun.zhu@linux.dev \
--cc=bmt@zurich.ibm.com \
--cc=ebiggers@kernel.org \
--cc=jgg@ziepe.ca \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=mustafa.ismail@intel.com \
--cc=tatyana.e.nikolova@intel.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox