I understand.  Maybe it should be the first active, if none, then the
first UP, and if none, the first !disabled.
Mostly I was trying to get something that picked ipath0 port 1
when it was the only port in the system even if the link
is down.

On Tue, 2006-01-10 at 17:12 -0500, Hal Rosenstock wrote:
> Hi Ralph,
> 
> On Tue, 2006-01-10 at 13:31, Ralph Campbell wrote:
> > If opensm is started with no arguments, the default algorithm
> > for finding a port to bind to will skip ports which are present
> > but the link is DOWN.  If there is only one port in the system,
> > no port is selected and opensm tries the default HCA name "mthca0"
> > which, if not present, confuses opensm and it exits.
> > 
> > The following patch changes the port selection so that the first
> > active port is selected, and if none, the first non-disabled port.
> 
> This is close and headed in the right direction but has one property I'm
> not too fond of: when there are no active ports, it does not prefer a
> port whose physical state is link up over one in (say) polling (anything
> other than link up) so the subnet may not come up when it could in that
> case.
> 
> -- Hal
> 
> > Signed-off-by: Ralph Campbell <[EMAIL PROTECTED]>
> > 
> > Index: umad.c
> > ===================================================================
> > --- umad.c  (revision 4900)
> > +++ umad.c  (working copy)
> > @@ -207,9 +207,9 @@
> >  }
> >  
> >  /*
> > - * if *port > 0 checks ca[port] state. Otherwise set *port to
> > + * if *port > 0, check ca[port] state. Otherwise set *port to
> >   * the first port that is active, and if such is not found, to
> > - * the first port that is (physically) up. Otherwise return -1;
> > + * the first port that is not disabled.  Otherwise return -1;
> >   */
> >  static int
> >  resolve_ca_port(char *ca_name, int *port)
> > @@ -228,14 +228,14 @@
> >             return 1;
> >     }
> >  
> > -   if (*port > 0) {        /* user wants user gets */
> > +   if (*port > 0) {        /* check only the port the user wants */
> >             if (*port > ca.numports)
> >                     return -1;
> >             if (!ca.ports[*port])
> >                     return -1;
> >             if (ca.ports[*port]->state == 4)
> >                     return 1;
> > -           if (ca.ports[*port]->phys_state == 5)
> > +           if (ca.ports[*port]->phys_state != 3)
> >                     return 0;
> >             return -1;
> >     }
> > @@ -244,7 +244,7 @@
> >             DEBUG("checking port %d", i);
> >             if (!ca.ports[i])
> >                     continue;
> > -           if (up < 0 && ca.ports[i]->phys_state == 5)
> > +           if (up < 0 && ca.ports[i]->phys_state != 3)
> >                     up = *port = i;
> >             if (ca.ports[i]->state == 4) {
> >                     active = *port = i;
> > @@ -278,10 +278,11 @@
> >             return ca_name;
> >     }
> >             
> > -   /* find first existing HCA with Active port */
> > +   /* Get the list of CA names. */
> >     if ((n = umad_get_cas_names((void *)names, UMAD_CA_NAME_LEN)) < 0)
> >             return 0;
> >  
> > +   /* Find the first existing CA with an active port. */
> >     for (caidx = 0; caidx < n; caidx++) {
> >             TRACE("checking ca '%s'", names[caidx]);
> >     
> 
-- 
Ralph Campbell <[EMAIL PROTECTED]>

_______________________________________________
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