peter.memishian at sun.com wrote:

>I don't think this is the case.  The line in question is:
>
>       if ((mp = copyb(mp)) == NULL || (mp->b_cont = copyb(mp)) == NULL) {
>               freemsg(mp);
>               return (ENOMEM);
>       }
>
>... but if the first copyb() fails, then it will return NULL and `mp' will
>be assigned to NULL prior to entering the body of the `if'.  We will then
>call `freemsg(NULL)' which is documented to do nothing.
>  
>
Agreed.

> > * ipif_up(): After the call to ipif_ndp_up, we want to return if
> >   the error is EINPROGRESS, but we fall through.
>
>Yes, this is a bug in my changes (thanks for catching it) -- however ...
>
> >   But I am not sure about ipif_ndp_up behavior, it does not seem to
> >   return the EINPROGRESS I guess something related to Jim's DAD changes?
>
>... it seems that ipif_ndp_up() (even before DAD, according to Jim) has
>never returned EINPROGRESS.  So the bug above is an accidental fix of
>sorts ;-)  Still, I will restore original behavior, as I don't want to
>modify that logic without a lot more research, and it's out-of-scope for
>my changes.
>  
>
ok.

> > * ip_reprocess_ioctl() The check at L25359 is redundant. ipsq_current_ipif
> >   is bound to be NULL here. So we can call ipsq_current_start directly. 
> > Right ?
>
>This is an interesting case.  Is your assertion that ipsq_current_ipif
>must be NULL because if it's non-NULL, the it must still have the original
>IPSQ value and thus the ipsq_try_enter() in ipif_set_values() will always
>trivially succeed (by reentering itself)?  If so, I think I agree, but the
>current code in Nevada is not so bold -- that is, ip_reprocess_ioctl()
>does not ASSERT() that ipsq_current_ipif is NULL prior to setting it to
>ill->ill_ipif -- so it ends up working in both cases.  The wording of the
>comment in ip_reprocess_ioctl() also suggests that there are cases where
>ipsq_current_ipif is already set.
>
>For now, I've made ip_reprocess_ioctl() mirror the ipsq_current_start()
>code in ipif_set_values() -- but I could be convinced to be more bold.
>  
>
ip_reprocess_ioctl is called only from ipsq_exit() during the unwind from
the ipsq and not directly.  ipsq_dq() picks the next message from the ipsq.
ipsq_dq() won't pick up the next message from ipsq_xopq_mphead unless
ipsq_current_ipif is NULL.  In the case of ipif_set_values -> ipsq_try_enter
it specifies NEW_OP. Based on all the above you can assert that 
ipsq_current_ipif
must be NULL in this case.

>Is there an explicit problem with always treating DL_NOTIFY_IND as a new
>operation?  Since IP cannot be sure that driver support DL_NOTIFY, it does
>not wait for the response for the drivers when it sends the DL_NOTIFY_REQ
>probe -- so why would it be appropriate to consider the resulting
>DL_NOTIFY_IND's part of the current operation?
>  
>
There may not be any problem today. But consider the following.
We start some operation say a plumb which consists of multiple DLPI message
exchanges between IP and the driver. Some message say DL_BIND triggers a
DL_NOTE_LINK_UP. Now we don't process this message immediately and
queue it as a NEW_OP and continue the DLPI message exchange process.
After the plumb is over, this DL_NOTE_LINK_UP is irrelevant, but we pick it
up now and attempt to set the RUNNING flag, but it should already be set.

>Updated webrev:
>
>      http://atlantic.east/ws/meem/physaddr/webrev
>
>Thanks again for your help.
>--
>meem
>  
>
Do you need the ill_fastpath_flush() in ill_set_phys_addr_tail() ?
Hasn't bringing down and bringing up the interface achieved
that already ?

Thirumalai


Reply via email to