tech-kern archive

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

Re: Fileassoc locking



On Fri, Dec 25, 2009 at 7:50 PM, Adam Hamsik <haaaad%gmail.com@localhost> wrote:

> RW locks have some performance problems, and they should not be used until 
> it's needed. I think that same think can be accomplished by using reference 
> counters and mutexes/cv variables. You can look at dm_dev_t I have used same 
> approach there. Rw locks has very bad effect on CPU caches and can slow 
> things down on a bigger SMP systems.

I didn't think it was this bad... Okay, I'll have a look and try to
redo it using mutexes and condition variables.

> Also it would be good to describe locking protocol used in fileassoc on top 
> of this file

Once it's done...

>> +/* Expects faf writer-locked. */
>> static void
>> file_free(struct fileassoc_file *faf)
>> {
>> @@ -126,11 +134,19 @@ file_free(struct fileassoc_file *faf)
>>
>>       LIST_REMOVE(faf, faf_list);
>>
>> +     rw_enter(&fileassoc_list_lock, RW_READER);
>>       LIST_FOREACH(assoc, &fileassoc_list, assoc_list) {
>> +             rw_enter(&assoc->assoc_lock, RW_READER);
>>               file_cleanup(faf, assoc);
>> +             rw_exit(&assoc->assoc_lock);
>>       }
>> +     rw_exit(&fileassoc_list_lock);
>> +
>>       vfs_composefh_free(faf->faf_handle);
>>       specificdata_fini(fileassoc_domain, &faf->faf_data);
>> +
>> +     rw_exit(&faf->faf_lock);
>> +
>
> Where faf->faf_lock was entered here ?

file_free() expects it to be locked -- see comment.

>> +     rw_init(&assoc->assoc_lock);
>>
>> +     /* Lock it so no one can use this assoc until we're done. */
>> +     rw_enter(&assoc->assoc_lock, RW_WRITER);
>> +
>> +     rw_enter(&fileassoc_list_lock, RW_WRITER);
>>       LIST_INSERT_HEAD(&fileassoc_list, assoc, assoc_list);
>> +     rw_exit(&fileassoc_list_lock);
>> +
>> +     rw_exit(&assoc->assoc_lock);
>>
>
> With one mutex used for fileassoc_list_lock you do not need to do this dance 
> you jsut lock mutex, insert head, unlock.

I have removed the locking on "assoc" here. There's going to be a
favorable reader:writer ratio for fileassoc_list_lock -- should it
still be a mutex?

> If function returns locked tbl it should be documented somewhere in this file.

Comments added where necessary...

>> -     return file_getdata(faf, assoc);
>> +     rw_enter(&assoc->assoc_lock, RW_READER);
>> +     data = file_getdata(faf, assoc);
>> +     rw_exit(&assoc->assoc_lock);
>> +
>> +     rw_exit(&faf->faf_lock);
>> +
>> +     return data;
>
> Here you return pointer for assoc data but, this can be released/freed by 
> another thread while caller of this will sleep. With reference counting you 
> will hold reference counter on assoc/data and no one can change them until he 
> has last reference holding by himself.

I think maybe to make fileassoc_lookup() always increase the reference
count on the file entry before it returns, and require the caller
(user of the KPI) to fileassoc_release() once it's done to avoid the
data being freed while in use.

> Maybe you should post whole file somewhere because it's hard to review your 
> changes this way because they are too large.

I'll do that in future posts.

Thanks,

-e.


Home | Main Index | Thread Index | Old Index