cvs commit: src/share/man/man4 ipfirewall.4 src/share/man/man9 pfil.9 src/sys/alpha/conf GENERIC src/sys/amd64/conf GENERIC src/sys/conf NOTES files options src/sys/i386/conf GENERIC src/sys/ia64/conf GENERIC SKI src/sys/modules/bridge Makefile ...

Max Laier max at love2party.net
Fri Aug 27 13:54:47 PDT 2004


On Friday 27 August 2004 22:21, Darren Reed wrote:
> On Fri, Aug 27, 2004 at 09:45:44PM +0200, Andre Oppermann wrote:
> > Darren Reed wrote:
> > > On Fri, Aug 27, 2004 at 06:12:11PM +0200, Max Laier wrote:
> > > > Maybe we should hide:
> > > >   if (inet_pfil_hook.ph_busy_count == -1)
> > >
> > > There's now a double check on ph_busy_count for inet & inet6 as it's
> > > first statement in pfil_run_hooks().  Seems a bit silly...
> >
> > It's not.  There is quite a bit of code that follows the pfil_run_hooks()
> > to look for certain things that might have happend to a packet.  If no
> > hooks are connected we can save the work and simply jump over it.  Take
> > a look the code that is jumped over.
>
> You misunderstand what I'm saying here.  I'm not saying get rid of the
> outer check or don't do it (or that's not my intention, anyway.)
>
> If you were to unroll the pfil_run_hooks(), the code would be:
>
> if (ph_busy_count == -1)
>         goto passin;
> if (ph_busy_count == -1 || ph_want_write == 1)
>         goto passin;
>
> Now that's an oversimplification but perhaps it better illustrates
> what I see the problem as being.  Can you see what's wrong here ?

This is actually right. The check inside pfil_run_hooks() was introduced 
before PFIL_HOOKS got part of GENERIC to avoid the lock operation for empty 
hooks. It is okay to remove it now that we do the check earlier. A wrapper is 
called for, nontheless!

> > > > behind a macro in case we modify the locking for pfil_hooks in the
> > > > future. I am thinking of something like:
> > > >  if (PFIL_IS_EMPTY(&inet_pfil_hook))
> > >
> > > Unless pfil(9) is being used with a protocol that has been loaded via
> > > an LKM (and can therefore disappear), there should be no risk here to
> > > warrant the use of locking.
>
> Actually, my analysis there is wrong.  The only risk here is if
> the pfil_head structure can disappear and at present they're all
> staticly allocated.
>
> > Locking is used to protect changes to the hooks.  If you hook/unhook
> > there might be another CPU traversing the hooks while you yank them
> > underneath it.  Panic.
>
> Right, but you've not understood what I'm saying here, again.
>
> The check to see if the pfil_head is empty doesn't traverse it,
> does it?  So there's no need to get a lock to do it.  Even if you
> were to replace the check on ph_busy_count with a "is the list
> empty" check, you still don't need to lock the pfil_head until
> before you start to walk it.  The worst that can happen is that
> a packet will either bypass or enter pfil_run_hooks() when it
> might have gone in, depending on timing.

That is right. Nobody asked to lock the check in the first place. The whole 
point in the check for ph_busy_count == -1 is to avoid the lock/unlock in the 
case of an empty hook list.

> You've doubled up on an if() for performance reasons, yet you want
> to put in a macro to hide an operation that is even more expensive
> than is ther enow - mutex attempt - at some point in the future ?
> This doesn't add up ?

You don't understood what I am saying. The problem is that ph_busy_count might 
be removed once we revisit the locking and thus we need to modify the check. 
Hence we should wrap the check in anticipation of that.

> > > The pfil locking should be overhauled, however, with the main aim
> > > to replace PFIL_*LOCK() with the use of sx(9).
> >
> > Please read the reply from Max.  He already explained why sx(9) is
> > inappropriate.
>
> I don't seem to have it in my mailbox...
>
> I'd like to say he's wrong but without reading his reply, I can't :(

Take a look at how sx(9) is implemented. What is there in pfil now is not very 
different. Long story short sx(9) has even more overhead and has starvation 
problems.

> The strategy currently in place is more akin to something that would
> be used in a device driver where you have two "halves" and one will
> sleep.  In none of the code wrapped by PFIL_WLOCK is there anything
> that will make the system wait.

You cannot sleep with PFIL_WLOCK held. It's a plain mutex lock!

> The use of sx(9) should be a no-brainer.

Yes, but it will reduce performance and introduce stravation problems. Once we 
have a better sx(9) implementation I am all for switching over. Right now it 
does not work.

-- 
/"\  Best regards,                      | mlaier at freebsd.org
\ /  Max Laier                          | ICQ #67774661
 X   http://pf4freebsd.love2party.net/  | mlaier at EFnet
/ \  ASCII Ribbon Campaign              | Against HTML Mail and News
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: signature
Url : http://lists.freebsd.org/pipermail/cvs-src/attachments/20040827/25725955/attachment.bin


More information about the cvs-src mailing list