We are in the merge window, patches are not being applied Jason On Tue, Mar 05, 2019 at 04:52:41PM +0800, Yanjun Zhu wrote: > 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 > > +++ 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);