> > --- umad.cpp      (revision 7570)
> >
> > +++ umad.cpp   (revision 7571)
> >
> > @@ -613,11 +613,11 @@
> >
> >
> >
> >                 umad_convert_addr(&mad->addr, &((WM_MAD *) mad)->Address);
> >
> >                 hr = ports[portid].prov->Send((WM_MAD *) mad, NULL);
> >
> > -              umad_convert_av(&((WM_MAD *) mad)->Address, &mad->addr);
> >
> >                 if (FAILED(hr)) {
> >
> >                                 _set_errno(EIO);
> >
> >                                 return GetLastError();
> >
> >                 }
> >
> > +             umad_convert_av(&((WM_MAD *) mad)->Address, &mad->addr);
> 
> There is something else wrong here, possibly in the upper layer.  The caller 
> is freeing the memory
> referenced by the *umad parameter while the umad_send() call is still 
> operating on it.  They could
> just as easily free the *umad memory in the success case.
> 
> It looks like the caller may be using an event to indicate that umad_send() 
> is done with the buffer,
> which is not the case.  If you have full details on what's happening, we may 
> want to bring this up
> with the opensm maintainer to make sure that we have the right solution.

I haven't seen any response yet, possibly because of the ofa conference.  We 
need a different 'fix' for this.  The easiest thing to do is to copy the user's 
input buffer into a new one and call umad_convert_addr on that buffer.  That 
would remove the need to call umad_convert_av.  This is obviously less 
efficient, since we need to copy the buffer, but it would fix the issue and 
work with the existing kernel.  There's an implicit assumption that umad_send() 
will not touch the user's buffer again after the underlying file write call has 
been invoked.

- Sean
_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to