tech-net archive

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

Re: workqueue in if_bnx: static struct work * seems wrong



On Tue, Feb 21, 2012 at 12:30:56PM -0500, Greg Troxel wrote:
> 
> My colleague Bev Schwartz found that in src/sys/dev/pci/if_bnx.c,
> workqueue_enqueue is called with a struct work * that points to a static
> variable.  But, this struct is used as a linked list, and reuse of the
> struct risks creating a circular list.
> 
> bnx's workqueue callback does not free the struct work *.  Other
> workqueue uses seem to alloc before enqueue and then free after the work
> is done.
> 
> It turns out that under our workloads we have yet to see a case where
> wk->wk_entry == wk.
> 
> Can anyone explain why the current code is ok, or how it should change?

I agree it's not clean, and it should probably be changed.
It works because each workqueue (which are per-bnx instance) can have
only one work enqueued at a time, so wk->wk_entry is always NULL.
If the workqueue implementation is ever changed to use something else
but a SIMPLE_QUEUE, this will fail.

-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
     NetBSD: 26 ans d'experience feront toujours la difference
--


Home | Main Index | Thread Index | Old Index