diff mbox

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

Message ID 1456851143-138332-10-git-send-email-eli@mellanox.com (mailing list archive)
State Superseded
Headers show

Commit Message

Eli Cohen March 1, 2016, 4:52 p.m. UTC
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@mellanox.com>
---
 drivers/infiniband/ulp/ipoib/ipoib_ib.c | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

Comments

Yuval Shaia March 6, 2016, 11:50 a.m. UTC | #1
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@mellanox.com>
> ---
>  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@vger.kernel.org
> 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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Or Gerlitz March 6, 2016, 12:13 p.m. UTC | #2
On Sun, Mar 6, 2016 at 1:50 PM, Yuval Shaia <yuval.shaia@oracle.com> wrote:
> On Tue, Mar 01, 2016 at 06:52:22PM +0200, Eli Cohen wrote:

>> @@ -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

you mean get better perf for A !=B on 64bit ARCHs? yes, we can do
that,  I guess.


> 2. Don't we need also to check subnet_prefix? i.e. is it possible to have
> same interface_id on different networks?

We're trying to figure out if this is US (node X, port Y) who send
this packet, and looking
for the minimal thing to compare on.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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