Re: [PATCH 1/1] IB: rxe: replace av->network_type with skb->protocol

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



ping

On 2019/2/24 19:26, Zhu Yanjun wrote:
In the function rxe_init_packet, based on av->network_type,
skb->protocol is set to ipv4 or ipv6. The functions rxe_prepare
and rxe_send are called after the functin rxe_init_packet.
So in these functions, av->network_type can be replaced with
skb->protocol.
The functions are in the xmit fast path. So with skb->protocol,
the performance will be better.

Signed-off-by: Zhu Yanjun <yanjun.zhu@xxxxxxxxxx>
---
  drivers/infiniband/sw/rxe/rxe_net.c | 26 +++++++++++---------------
  1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index 8fd03ae..edac208 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -368,13 +368,13 @@ static void prepare_ipv6_hdr(struct dst_entry *dst, struct sk_buff *skb,
  	ip6h->payload_len = htons(skb->len - sizeof(*ip6h));
  }
-static int prepare4(struct rxe_pkt_info *pkt, struct sk_buff *skb,
-		    struct rxe_av *av)
+static int prepare4(struct rxe_pkt_info *pkt, struct sk_buff *skb)
  {
  	struct rxe_qp *qp = pkt->qp;
  	struct dst_entry *dst;
  	bool xnet = false;
  	__be16 df = htons(IP_DF);
+	struct rxe_av *av = rxe_get_av(pkt);
  	struct in_addr *saddr = &av->sgid_addr._sockaddr_in.sin_addr;
  	struct in_addr *daddr = &av->dgid_addr._sockaddr_in.sin_addr;
@@ -397,11 +397,11 @@ static int prepare4(struct rxe_pkt_info *pkt, struct sk_buff *skb,
  	return 0;
  }
-static int prepare6(struct rxe_pkt_info *pkt, struct sk_buff *skb,
-		    struct rxe_av *av)
+static int prepare6(struct rxe_pkt_info *pkt, struct sk_buff *skb)
  {
  	struct rxe_qp *qp = pkt->qp;
  	struct dst_entry *dst;
+	struct rxe_av *av = rxe_get_av(pkt);
  	struct in6_addr *saddr = &av->sgid_addr._sockaddr_in6.sin6_addr;
  	struct in6_addr *daddr = &av->dgid_addr._sockaddr_in6.sin6_addr;
@@ -428,12 +428,11 @@ static int prepare6(struct rxe_pkt_info *pkt, struct sk_buff *skb,
  int rxe_prepare(struct rxe_pkt_info *pkt, struct sk_buff *skb, u32 *crc)
  {
  	int err = 0;
-	struct rxe_av *av = rxe_get_av(pkt);
- if (av->network_type == RDMA_NETWORK_IPV4)
-		err = prepare4(pkt, skb, av);
-	else if (av->network_type == RDMA_NETWORK_IPV6)
-		err = prepare6(pkt, skb, av);
+	if (skb->protocol == htons(ETH_P_IP))
+		err = prepare4(pkt, skb);
+	else if (skb->protocol == htons(ETH_P_IPV6))
+		err = prepare6(pkt, skb);
*crc = rxe_icrc_hdr(pkt, skb); @@ -455,23 +454,20 @@ static void rxe_skb_tx_dtor(struct sk_buff *skb) int rxe_send(struct rxe_pkt_info *pkt, struct sk_buff *skb)
  {
-	struct rxe_av *av;
  	int err;
- av = rxe_get_av(pkt);
-
  	skb->destructor = rxe_skb_tx_dtor;
  	skb->sk = pkt->qp->sk->sk;
rxe_add_ref(pkt->qp);
  	atomic_inc(&pkt->qp->skb_out);
- if (av->network_type == RDMA_NETWORK_IPV4) {
+	if (skb->protocol == htons(ETH_P_IP)) {
  		err = ip_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb);
-	} else if (av->network_type == RDMA_NETWORK_IPV6) {
+	} else if (skb->protocol == htons(ETH_P_IPV6)) {
  		err = ip6_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb);
  	} else {
-		pr_err("Unknown layer 3 protocol: %d\n", av->network_type);
+		pr_err("Unknown layer 3 protocol: %d\n", skb->protocol);
  		atomic_dec(&pkt->qp->skb_out);
  		rxe_drop_ref(pkt->qp);
  		kfree_skb(skb);



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux