Re: [PATCH for-next 09/10] IB/ipoib: Allow mcast packets from other VFs

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

 



On Tue, Mar 01, 2016 at 06:52:22PM +0200, Eli Cohen wrote:
> With SRIOV enabled, two VFs on the same HCA which have the same port LID
> and may have the same QP number. To enable receiving multicasts from
> such VFs, further qualify the check: ignore the receive only if, in
> addition, the packet source gid equals the receiving VF's source gid.
> 
> Signed-off-by: Eli Cohen <eli@xxxxxxxxxxxx>
> ---
>  drivers/infiniband/ulp/ipoib/ipoib_ib.c | 29 ++++++++++++++++++++++-------
>  1 file changed, 22 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> index fa9c42ff1fb0..e0b953cdab50 100644
> --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
> @@ -180,6 +180,7 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
>  	struct sk_buff *skb;
>  	u64 mapping[IPOIB_UD_RX_SG];
>  	union ib_gid *dgid;
> +	union ib_gid *sgid;
>  
>  	ipoib_dbg_data(priv, "recv completion: id %d, status: %d\n",
>  		       wr_id, wc->status);
> @@ -203,13 +204,6 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
>  		return;
>  	}
>  
> -	/*
> -	 * Drop packets that this interface sent, ie multicast packets
> -	 * that the HCA has replicated.
> -	 */
> -	if (wc->slid == priv->local_lid && wc->src_qp == priv->qp->qp_num)
> -		goto repost;
> -
>  	memcpy(mapping, priv->rx_ring[wr_id].mapping,
>  	       IPOIB_UD_RX_SG * sizeof *mapping);
>  
> @@ -239,6 +233,27 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
>  	else
>  		skb->pkt_type = PACKET_MULTICAST;
>  
> +	sgid = &((struct ib_grh *)skb->data)->sgid;
> +
> +	/*
> +	 * Drop packets that this interface sent, ie multicast packets
> +	 * that the HCA has replicated.
> +	 */
> +	if (wc->slid == priv->local_lid && wc->src_qp == priv->qp->qp_num) {
> +		int need_repost = 1;
> +
> +		if ((wc->wc_flags & IB_WC_GRH) &&
> +		    memcmp(&sgid->global.interface_id,
> +			   &priv->local_gid.global.interface_id,
> +			   sizeof(sgid->global.interface_id)))
1. Why can't we do sgid->global.interface_id !=
priv->local_gid.global.interface_id
2. Don't we need also to check subnet_prefix? i.e. is it possible to have
same interface_id on different networks?
> +			need_repost = 0;
> +
> +		if (need_repost) {
> +			dev_kfree_skb_any(skb);
> +			goto repost;
> +		}
> +	}
> +
>  	skb_pull(skb, IB_GRH_BYTES);
>  
>  	skb->protocol = ((struct ipoib_header *) skb->data)->proto;
> -- 
> 1.8.3.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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