On Wednesday 01 March 2006 20:18, Sean Hefty wrote:
> Can we just remove the if and let the code fall through?
We still need to compare the source (i.e., originator) GIDs if the grh flag is 
set.  This means:  the destination GID of the received packet, and the source 
GID of the sent packet (converting the gid index to a GID).

Patch is below.

- Jack
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

compare MAD GIDs at query-originator side, too,
to handle case where same TID is used for sending with
with different GIDs from same port.

Signed-off-by: Jack Morgenstein <[EMAIL PROTECTED]>

Index: src/drivers/infiniband/core/mad.c
===================================================================
--- src.orig/drivers/infiniband/core/mad.c      2006-03-01 10:04:21.818944000 
+0200
+++ src/drivers/infiniband/core/mad.c   2006-03-02 17:42:16.441851000 +0200
@@ -35,6 +35,7 @@
  */
 #include <linux/dma-mapping.h>
 
+#include <rdma/ib_cache.h>
 #include "mad_priv.h"
 #include "mad_rmpp.h"
 #include "smi.h"
@@ -1644,40 +1645,51 @@ static inline int rcv_has_same_class(str
                rwc->recv_buf.mad->mad_hdr.mgmt_class;
 }
 
-static inline int rcv_has_same_gid(struct ib_mad_send_wr_private *wr,
+static inline int rcv_has_same_gid(struct ib_mad_agent_private 
*mad_agent_priv,
+                                  struct ib_mad_send_wr_private *wr,
                                   struct ib_mad_recv_wc *rwc )
 {
        struct ib_ah_attr attr;
        u8 send_resp, rcv_resp;
+       union ib_gid  sg;
 
        send_resp = ((struct ib_mad *)(wr->send_buf.mad))->
                     mad_hdr.method & IB_MGMT_METHOD_RESP;
        rcv_resp = rwc->recv_buf.mad->mad_hdr.method & IB_MGMT_METHOD_RESP;
 
-       if (!send_resp && rcv_resp)
-               /* is request/response. GID/LIDs are both local (same). */
-               return 1;
-
        if (send_resp == rcv_resp)
                /* both requests, or both responses. GIDs different */
                return 0;
 
        if (ib_query_ah(wr->send_buf.ah, &attr))
-               /* Assume not equal, to avoid false positives. */
+               /* Assume different, to avoid false positives. */
                return 0;
 
        if (!(attr.ah_flags & IB_AH_GRH) && !(rwc->wc->wc_flags & IB_WC_GRH))
                return attr.dlid == rwc->wc->slid;
        else if ((attr.ah_flags & IB_AH_GRH) &&
-                (rwc->wc->wc_flags & IB_WC_GRH))
-               return memcmp(attr.grh.dgid.raw,
-                             rwc->recv_buf.grh->sgid.raw, 16) == 0;
-       else
+                (rwc->wc->wc_flags & IB_WC_GRH)) {
+               if (send_resp)
+                       /* compare remote GIDs */
+                       return !memcmp(attr.grh.dgid.raw,
+                                      rwc->recv_buf.grh->sgid.raw, 16);
+               else {
+                       /* compare local GIDs */
+                       if (ib_get_cached_gid(mad_agent_priv->agent.device,
+                                             mad_agent_priv->agent.port_num,
+                                             attr.grh.sgid_index,
+                                             &sg))
+                               /* assume different if cannot get GID */
+                               return 0;
+                       return !memcmp(sg.raw, rwc->recv_buf.grh->dgid.raw, 16);
+               }
+       } else
                /* one has GID, other does not.  Assume different */
                return 0;
 }
+
 struct ib_mad_send_wr_private*
-ib_find_send_mad(struct ib_mad_agent_private *mad_agent_priv,
+ib_find_send_mad(struct ib_mad_agent_private *mad_agent,
                 struct ib_mad_recv_wc *mad_recv_wc)
 {
        struct ib_mad_send_wr_private *mad_send_wr;
@@ -1685,11 +1697,11 @@ ib_find_send_mad(struct ib_mad_agent_pri
 
        mad = (struct ib_mad *)mad_recv_wc->recv_buf.mad;
 
-       list_for_each_entry(mad_send_wr, &mad_agent_priv->wait_list,
+       list_for_each_entry(mad_send_wr, &mad_agent->wait_list,
                            agent_list) {
                if ((mad_send_wr->tid == mad->mad_hdr.tid) &&
                    rcv_has_same_class(mad_send_wr, mad_recv_wc) &&
-                   rcv_has_same_gid(mad_send_wr, mad_recv_wc))
+                   rcv_has_same_gid(mad_agent, mad_send_wr, mad_recv_wc))
                        return mad_send_wr;
        }
 
@@ -1697,13 +1709,13 @@ ib_find_send_mad(struct ib_mad_agent_pri
         * It's possible to receive the response before we've
         * been notified that the send has completed
         */
-       list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list,
+       list_for_each_entry(mad_send_wr, &mad_agent->send_list,
                            agent_list) {
-               if (is_data_mad(mad_agent_priv, mad_send_wr->send_buf.mad) &&
+               if (is_data_mad(mad_agent, mad_send_wr->send_buf.mad) &&
                    mad_send_wr->tid == mad->mad_hdr.tid &&
                    mad_send_wr->timeout &&
                    rcv_has_same_class(mad_send_wr, mad_recv_wc) &&
-                   rcv_has_same_gid(mad_send_wr, mad_recv_wc)) {
+                   rcv_has_same_gid(mad_agent, mad_send_wr, mad_recv_wc)) {
                        /* Verify request has not been canceled */
                        return (mad_send_wr->status == IB_WC_SUCCESS) ?
                                mad_send_wr : NULL;
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to