[dm-devel] mirror patches - device failure detection/race fix/deadlock fix
Jonathan E Brassow
jbrassow at redhat.com
Tue Aug 2 18:02:02 UTC 2005
On Aug 2, 2005, at 12:35 PM, Alasdair G Kergon wrote:
> On Tue, Aug 02, 2005 at 11:00:05AM -0500, Jon Brassow wrote:
>> The 'race.patch' fixes a couple race conditions that were a result of
>> the __rh_alloc() function releasing and regrabbing a lock when called.
>
> - read_unlock(&rh->hash_lock);
> - nreg = mempool_alloc(rh->region_pool, GFP_NOIO);
> + nreg = mempool_alloc(rh->region_pool, GFP_ATOMIC);
> nreg->state = rh->log->type->in_sync(rh->log, region, 1) ?
>
> So mempool_alloc is now called while holding a spinlock.
> With GFP_ATOMIC, what happens if it returns NULL?
That's what the mempool is all about. :) I suppose, if you were under
memory pressure long enough and the kernel never successfully reclaimed
memory, it *might* return NULL -- in which case, the kernel oops's. I
think this is so unlikely, that I would be willing to put in a BUG()
call if nreg is found to be NULL. BTW, the scenario is exactly the
same as if the gfp_flag was GFP_NOIO -- if the kernel can't get us
memory, it can't get us memory.
> Doesn't it need to be able to sleep to get the benefit of the mempool?
No. mempool will try to allocate memory honoring the flags you have
set (in this case GFP_ATOMIC). If unsuccessful, it will tap into the
memory reserve you have created when you did a mempool_create. So,
when there is no memory left to give us, we have 64 _regions_ left in
our repository.
Am I wrong?
>
>> The 'deadlock.patch' switches all spin_lock calls on the region_lock
>> to
>> spin_lock_irqsave. Without this patch you machine will hang.
>
> I'd prefer it if race.patch used the correct versions (with or without
> _irq).
>
Are you asking me to "combine" the patches? I can do that.
brassow
More information about the dm-devel
mailing list