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]

 



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);



[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