Message ID | E1QpTpp-00026I-7p@rvml.edm.orcorp.ca (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Rolf, On 17:29 Fri 05 Aug , Rolf Manderscheid wrote: > > Heed the DRSLID and DRDLID fields in DR SMPs. > > Signed-off-by: Rolf Manderscheid <rvm@obsidianresearch.com> > --- > ibsim/sim_mad.c | 35 +++++++++++++++++++++++++---------- > 1 files changed, 25 insertions(+), 10 deletions(-) > > diff --git a/ibsim/sim_mad.c b/ibsim/sim_mad.c > index 61d4866..9396ca3 100644 > --- a/ibsim/sim_mad.c > +++ b/ibsim/sim_mad.c > @@ -152,11 +152,8 @@ static int decode_sim_MAD(Client * cl, struct sim_request * r, ib_rpc_t * rpc, > > if (rpc->mgtclass == 0x81) { // direct route > // word 9 > - if (mad_get_field(buf, 0, IB_DRSMP_DRDLID_F) != 0xffff || > - mad_get_field(buf, 0, IB_DRSMP_DRSLID_F) != 0xffff) { > - IBWARN("dr[ds]lids are used (not supported)"); > - return -1; > - } > + path->drslid = mad_get_field(buf, 0, IB_DRSMP_DRSLID_F); > + path->drdlid = mad_get_field(buf, 0, IB_DRSMP_DRDLID_F); > // bytes 128 - 256 > if (!response) > mad_get_array(buf, 0, IB_DRSMP_PATH_F, path->p); > @@ -1113,11 +1110,27 @@ static Port *direct_route_out_MAD(Port * port, ib_dr_path_t * path) > > static Port *route_MAD(Port * port, int response, int lid, ib_dr_path_t * path) > { > - if (lid >= 0 && lid < 0xffff) > - return lid_route_MAD(port, lid); > + if (lid >= 0 && lid < 0xffff) { > + port = lid_route_MAD(port, lid); > + if (!port) > + return NULL; > + if (!path) > + return port; > + } else if (!path) > + return NULL; // permissive LID with no DR > + > + if (response) { > + port = direct_route_in_MAD(port, path); > + lid = path->drslid; > + } else { > + port = direct_route_out_MAD(port, path); > + lid = path->drdlid; > + } > > - return response ? direct_route_in_MAD(port, path) : > - direct_route_out_MAD(port, path); > + if (port && lid >= 0 && lid < 0xffff) > + port = lid_route_MAD(port, lid); > + > + return port; > } route_MAD() breaks the LID route support. > > static Smpfn *get_handle_fn(ib_rpc_t rpc, int response) > @@ -1176,7 +1189,9 @@ int process_packet(Client * cl, void *p, int size, Client ** dcl) > return 0; > } > > - if (!(port = route_MAD(cl->port, response, ntohs(r->dlid), &path))) { > + port = route_MAD(cl->port, response, ntohs(r->dlid), > + rpc.mgtclass == 0x81 ? &path : NULL); > + if (!port) { I guess you want to do the same for routing response mads. > IBWARN("routing failed: no route to dest lid %u path %s", > ntohs(r->dlid), pathstr(0, &path)); > goto _dropped; > -- > 1.7.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
Hi Alex,
> route_MAD() breaks the LID route support.
I think the change to route_MAD() is sound, there's no change in
behaviour for LID-routed packets. The path argument is expected to be
NULL in the case of a LID routed MAD, which causes an early
return, but this is only an optimization. Even if you forget to pass
in a NULL path (which I did in one case as you pointed out!), the
path->cnt will be zero for LID routed MADs which causes the
direct_route_*_MAD() functions to just return the same port that was
passed in, so it works either way. I tested this with some simple
topologies, running opensm and then doing a perfquery to each
simulated node. I also used python-rdma with a new python simulator
client which is the motivation for this patch. Without this change,
python-rdma exposes the missing handling of leading and/or trailing LIDs
in directed-route SMPs. I'll send an updated patch which passes a
NULL path for LID-routed packets at the second call site.
Rolf
--
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 --git a/ibsim/sim_mad.c b/ibsim/sim_mad.c index 61d4866..9396ca3 100644 --- a/ibsim/sim_mad.c +++ b/ibsim/sim_mad.c @@ -152,11 +152,8 @@ static int decode_sim_MAD(Client * cl, struct sim_request * r, ib_rpc_t * rpc, if (rpc->mgtclass == 0x81) { // direct route // word 9 - if (mad_get_field(buf, 0, IB_DRSMP_DRDLID_F) != 0xffff || - mad_get_field(buf, 0, IB_DRSMP_DRSLID_F) != 0xffff) { - IBWARN("dr[ds]lids are used (not supported)"); - return -1; - } + path->drslid = mad_get_field(buf, 0, IB_DRSMP_DRSLID_F); + path->drdlid = mad_get_field(buf, 0, IB_DRSMP_DRDLID_F); // bytes 128 - 256 if (!response) mad_get_array(buf, 0, IB_DRSMP_PATH_F, path->p); @@ -1113,11 +1110,27 @@ static Port *direct_route_out_MAD(Port * port, ib_dr_path_t * path) static Port *route_MAD(Port * port, int response, int lid, ib_dr_path_t * path) { - if (lid >= 0 && lid < 0xffff) - return lid_route_MAD(port, lid); + if (lid >= 0 && lid < 0xffff) { + port = lid_route_MAD(port, lid); + if (!port) + return NULL; + if (!path) + return port; + } else if (!path) + return NULL; // permissive LID with no DR + + if (response) { + port = direct_route_in_MAD(port, path); + lid = path->drslid; + } else { + port = direct_route_out_MAD(port, path); + lid = path->drdlid; + } - return response ? direct_route_in_MAD(port, path) : - direct_route_out_MAD(port, path); + if (port && lid >= 0 && lid < 0xffff) + port = lid_route_MAD(port, lid); + + return port; } static Smpfn *get_handle_fn(ib_rpc_t rpc, int response) @@ -1176,7 +1189,9 @@ int process_packet(Client * cl, void *p, int size, Client ** dcl) return 0; } - if (!(port = route_MAD(cl->port, response, ntohs(r->dlid), &path))) { + port = route_MAD(cl->port, response, ntohs(r->dlid), + rpc.mgtclass == 0x81 ? &path : NULL); + if (!port) { IBWARN("routing failed: no route to dest lid %u path %s", ntohs(r->dlid), pathstr(0, &path)); goto _dropped;
Heed the DRSLID and DRDLID fields in DR SMPs. Signed-off-by: Rolf Manderscheid <rvm@obsidianresearch.com> --- ibsim/sim_mad.c | 35 +++++++++++++++++++++++++---------- 1 files changed, 25 insertions(+), 10 deletions(-)