Re: [RFC PATCH 1/1] block: get rid of request queue ->sysfs_dir_lock

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

 




On 1/22/25 11:58 AM, Christoph Hellwig wrote:
> On Mon, Jan 20, 2025 at 06:34:11PM +0530, Nilay Shroff wrote:
>> The request queue uses ->sysfs_dir_lock for protecting the addition/
>> deletion of kobject entries under sysfs while we register/unregister
>> blk-mq. However kobject addition/deletion is already protected with
>> kernfs/sysfs internal synchronization primitives. So use of q->sysfs_
>> dir_lock seems redundant.
> 
> From the pure sysfs perspective, yes.  The weird thing with block
> layer sysfs is that unregistration/registration can happen at weird
> times, though.
> 
>> Moreover, q->sysfs_dir_lock is also used at few other callsites along
>> with q->sysfs_lock for protecting the addition/deletion of kojects.
>> One such example is when we register with sysfs a set of independent
>> access ranges for a disk. Here as well we could get rid off q->sysfs_
>> dir_lock and only use q->sysfs_lock.
>>
>> The only variable which q->sysfs_dir_lock appears to protect is q->
>> mq_sysfs_init_done which is set/unset while registering/unregistering
>> blk-mq with sysfs. But this variable could be easily converted to an
>> atomic type and used safely without using q->sysfs_dir_lock.
>>
> 
> So sysfs_dir_lock absolutely should go.  OTOH relying more on sysfs_lock
> is a bad idea, as that is also serialied with the attributes, which
> again on a pure sysfs basis isn't needed.  Given that you don't add
> new critical sections for it this should be fine, though.
> 
>> So with this patch we remove q->sysfs_dir_lock from each callsite
>> and also make q->mq_sysfs_init_done an atomic variable.
> 
> Using an atomic_t for a single variable is usually not a good idea.
> Let's take a step back and look at what mq_sysfs_init_done is trying
> to do.
> 
> It is set by blk_mq_sysfs_register, which is called by
> blk_register_queue. before marking the queue registered and setting the
> disk live.  It is cleared in blk_mq_sysfs_unregister called from
> blk_unregister_queue just after clearing the queue registered bit.
>
Yeah that's good idea! Indeed, I think we can remove ->mq_sysfs_init_done and 
replace it with the QUEUE_FLAG_REGISTERED.
 
> So maybe we could do something with the queue registered bit, although
> eventually I'd like to kill that as well, but either way we need
> to explain how the flag prevents the nr_hw_queues update racing with
> disk addition/removal.  AFAICS we're not completely getting this
> right even right now.  We'd probably need to hold tag_list_lock
> over registering and unregistering the hctx sysfs files.
> 
Agreed, makes sense to hold ->tag_list_lock so that we can contain 
the race between nr_hw_queue update with registering/unregistering the 
hctx sysfs files. 

I'd spin a new patch with above changes and submit.

Thank you Christoph for your review and comments!

--Nilay





[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux