diff options
author | Bob Pearson <rpearsonhpe@gmail.com> | 2021-06-18 06:57:40 +0200 |
---|---|---|
committer | Jason Gunthorpe <jgg@nvidia.com> | 2021-06-22 20:38:52 +0200 |
commit | 1993cbed65bb590a3479d175fc1ac3c775b6bba8 (patch) | |
tree | 25016387e5bd84731ae53b461275fa262d365f21 /drivers/infiniband | |
parent | RDMA/rxe: Fix redundant call to ip_send_check (diff) | |
download | linux-1993cbed65bb590a3479d175fc1ac3c775b6bba8.tar.xz linux-1993cbed65bb590a3479d175fc1ac3c775b6bba8.zip |
RDMA/rxe: Fix extra copies in build_rdma_network_hdr
build_rdma_network_hdr() in rxe_resp.c does more copying than is
needed. Remove this subroutine and eliminate the extra copies for IPV6 and
reduce the extra copying for IPV4.
Fixes: e404f945a610 ("IB/rxe: improved debug prints & code cleanup")
Link: https://lore.kernel.org/r/20210618045742.204195-4-rpearsonhpe@gmail.com
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/sw/rxe/rxe_resp.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c index 5565d88e0261..5718c8bb28ac 100644 --- a/drivers/infiniband/sw/rxe/rxe_resp.c +++ b/drivers/infiniband/sw/rxe/rxe_resp.c @@ -785,18 +785,6 @@ static enum resp_states read_reply(struct rxe_qp *qp, return state; } -static void build_rdma_network_hdr(union rdma_network_hdr *hdr, - struct rxe_pkt_info *pkt) -{ - struct sk_buff *skb = PKT_TO_SKB(pkt); - - memset(hdr, 0, sizeof(*hdr)); - if (skb->protocol == htons(ETH_P_IP)) - memcpy(&hdr->roce4grh, ip_hdr(skb), sizeof(hdr->roce4grh)); - else if (skb->protocol == htons(ETH_P_IPV6)) - memcpy(&hdr->ibgrh, ipv6_hdr(skb), sizeof(hdr->ibgrh)); -} - static int invalidate_rkey(struct rxe_qp *qp, u32 rkey) { if (rkey_is_mw(rkey)) @@ -811,16 +799,23 @@ static int invalidate_rkey(struct rxe_qp *qp, u32 rkey) static enum resp_states execute(struct rxe_qp *qp, struct rxe_pkt_info *pkt) { enum resp_states err; + struct sk_buff *skb = PKT_TO_SKB(pkt); + union rdma_network_hdr hdr; if (pkt->mask & RXE_SEND_MASK) { if (qp_type(qp) == IB_QPT_UD || qp_type(qp) == IB_QPT_SMI || qp_type(qp) == IB_QPT_GSI) { - union rdma_network_hdr hdr; - - build_rdma_network_hdr(&hdr, pkt); - - err = send_data_in(qp, &hdr, sizeof(hdr)); + if (skb->protocol == htons(ETH_P_IP)) { + memset(&hdr.reserved, 0, + sizeof(hdr.reserved)); + memcpy(&hdr.roce4grh, ip_hdr(skb), + sizeof(hdr.roce4grh)); + err = send_data_in(qp, &hdr, sizeof(hdr)); + } else { + err = send_data_in(qp, ipv6_hdr(skb), + sizeof(hdr)); + } if (err) return err; } |