tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: On softints, softnet_lock and sleeping (aka ipv6 vs USB network interfaces)



   Date: Mon, 7 Dec 2015 07:40:38 +0000
   From: Nick Hudson <skrll%netbsd.org@localhost>

   On 12/06/15 16:01, Taylor R Campbell wrote:
   > One quick fix might be to change nd6_timer to call in6_purgeaddr in a
   > workqueue (or...task, if we had that).  It seems to me that
   > in6_purgeaddr is a relatively expensive operation (and I think there's
   > a bug: it calls callout_stop via nd6_dad_stop/nd6_dad_stoptimer when
   > it should probably call callout_halt), so calling it from a callout
   > doesn't seem right anyway.

   Sure, but the "sleeping with softnet_lock held" problem still exists.

Yes -- this only solves part of your problem.  But calling
in6_purgeaddr from callout looks like a problem in itself, as does
using callout_stop in nd6_dad_stop instead of callout_halt.

   > As a practical matter, I don't see how that would help -- IPL_SOFTUSB
   > is only ever used as a mutex ipl, and IPL_SOFT* is equivalent to
   > IPL_NONE for the practical purposes of mutex(9).

   Why do IPL_SOFT* exist? If the intention is to show usage then
   IPL_SOFT is enough, right?

They can be used to block softints with splraiseipl.  For mutex(9), we
just allow the softint lwp to sleep instead of using spl* to block
soft interruption.

   > That aside, can softints even interrupt softints, or are the
   > priorities only about who goes first if two softints are scheduled
   > `simultaneously' (as far as softint_dispatch can discern)?

   The latter, iiuc.

I checked on arm, and it looks like higher-priority softints can
interrupt lower-priority softints, if I read dosoftints in
arm32_machdep.c correctly.  But I could be wrong, and on cursory
glance the story looked different for other architectures.  So it
would be nice if someone who understands softints better than I do
could swoop in and clarify, and then maybe we can update the man page
to explain the semantics more clearly.

   > If so, even then, using SOFTINT_BIO instead of SOFTINT_NET wouldn't
   > help here -- SOFTINT_BIO is even lower-priority than SOFTINT_NET, but
   > you need to allow the USB HC interrupt to run (I assume you mean,
   > e.g., ehci_softintr?) faster than SOFTINT_NET in order to wake
   > usbd_transfer while a SOFTINT_NET lwp is blocked on softnet_lock.

   Looking at spl(9) and the code again I meant SOFTINT_SERIAL. The
   idea would indeed be that the USB HC softint (e.g. ehci_softintr)
   would run before SOFTINT_NET handlers.

That would make more sense.  Worth a try, anyway.


Home | Main Index | Thread Index | Old Index