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 ...

Darren Reed darrenr at hub.freebsd.org
Sat Aug 28 09:40:44 PDT 2004


I hope I didn't send a reply to this already, I think I had to reconnect...

On Fri, Aug 27, 2004 at 10:52:57PM +0200, Max Laier wrote:
> > 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.

No.

Checking ph_busy_count should be inside pfil_run_hooks or outside of it.

Not in both places.

> 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!

Right, it needs removing and wasn't - just don't say it is right how it is.

> > 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.

I wonder if ph_busy_lock could be made to disappear and its use replaced
with a check for TAILQ_EMPTY() ?  This would nto require a lock/unlock.

> > 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.

Wrong - I haven't read anything else from you so that's not possible.

> 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.

Whether it goes inside a macro or not is immaterial.

> Take a look at how sx(9) is implemented. What is there in pfil now is not
> very different.

Well why won't you rewrite sx(9) then and fix the perceived problems ?

> > 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.

sx(9) seems to work well enough for me :)

Meanwhile, should all the functions in pfil.c that are PFIL_[A-Z]* be
renamed to pfil_[a-z]* ?  This has got to be a KNF violation ?

Darren


More information about the cvs-src mailing list