[openib-general] [PATCH 00/12] ofed_1_2 - Neighbour update support

Michael S. Tsirkin mst at mellanox.co.il
Sun Feb 4 05:14:14 PST 2007


> Quoting Steve Wise <swise at opengridcomputing.com>:
> Subject: Re: [PATCH 00/12] ofed_1_2 - Neighbour update support
> 
> On Fri, 2007-02-02 at 08:03 +0200, Michael S. Tsirkin wrote:
> > > We could use a global refcnt to count the number of pending destructions
> > > and use a completion object to block unload until all the destructors
> > > fire and the refcnt goes to zero.
> > 
> > It has the same race as module refcnt. So just use that.
> > 
> 
> I don't understand the race.  Can you explain please?  This should be
> able to be done without a race with a refcnt, a spinlock, a bit saying
> we're unloading, and a completion object.
> 
> But maybe I'm confused ;-)

In short, the rule is that you can't pass a pointer to your function
to another module, and the unload module safely without synchronizing with that
other module.

Simplified example:

destructor
{
	complete(&foo);
A:
	return;
}

module_cleanup:
{
	wait(foo)
	return;
}

Now, assume destructor runs up to point A, then your module unloads,
and the memory its text occupied is overwritten by something else.
An attempt to execute code from point A will now crash.
So completion is not better than just module refcount here.

That said, I think the race is unlikely and just using module
refcount should be sufficient, and it's certainly simple.

-- 
MST




More information about the general mailing list