fcntl spinlock in Linux?
Rusty Russell
rusty at samba.org
Sun Feb 17 22:38:36 MST 2013
"J. Bruce Fields" <bfields at fieldses.org> writes:
> On Thu, Feb 14, 2013 at 08:12:59PM +1030, Rusty Russell wrote:
>> Volker Lendecke <Volker.Lendecke at SerNet.DE> writes:
>> > Also, I am pretty certain that the fact that this happens in
>> > an otherwise overloaded system adds to that effect, during
>> > my tests here the systems were otherwise idle.
>>
>> Oops, I dropped the list from my CC's somehow.
>>
>> OK, I'll assume that improving this benchmark with 10000 or 20000 mean
>> we have a real improvement.
>>
>> I haven't tested, but one thing I noticed looking at the code: we're
>> often deleted from the block list when we're woken, so we don't need
>> to re-grab the lock in that case:
>
> Hm. But __locks_delete_block does more than make &waiter->fl_block
> empty. Isn't there a possibility that I could call locks_delete_block
> while someone else was partway through __locks_delete_block? So
> something like:
>
> __locks_delete_block:
> list_del_init(&waiter->fl_block);
>
> locks_delete_block sees
> fl_block empty, returns,
> caller frees the block
> list_del_init(&waiter->fl_link);
> waiter->fl_next = NULL;
>
> and then someone's writing into memory that belonged to the now-freed
> block?
Sorry, it was more a though experiement (and benchmarking question) than
patch candidate. In practice, we should probably do:
void locks_delete_block(struct file_lock *waiter)
{
/* We could already be deleted by the time this runs. */
if (!waiter->fl_next)
return;
lock_flocks();
__locks_delete_block(waiter);
unlock_flocks();
}
and in __locks_delete_block:
{
list_del_init(&waiter->fl_block);
list_del_init(&waiter->fl_link);
smp_wmb();
waiter->fl_next = NULL;
}
(I'm assuming waiter->fl_next is never NULL, but that might be
v. wrong).
Cheers,
Rusty.
More information about the samba-technical
mailing list