Skip to contentSkip to conversation

Calling request_firmware under the spinlocks in file advansys.c

Question Vaishali Thakkar 2 participants 3 messages Sep 13, 2016 – Sep 27, 2016 SCSI

lore
Share & tools
lore
#0 lore raw

Hi,

In the file drivers/scsi/advansys.c we are calling function AdvISR at 2 instances [in the function advansys_reset and advansys_interrupt] while holding spinlock. Function AdvISR eventually calls request_firmware following this sequence of routines:

AdvISR -> adv_async_callback -> AdvResetChipAndSB -> AdvInitAsc3550Driver -> request_firmware

According to the definition of request_firmware it should be called from user context where sleeping is allowed. And usually sleeping under the spin lock is not allowed. Is it really necessary to call AdvISR under spinlocks here? Are we taking care of sleeping related concern of request_firmware or am I overlooking something here?

Thank you.

Signature · 1 line
Vaishali
#1 lore raw
Quoted 7 lines · Vaishali Thakkar

Hi,

In the file drivers/scsi/advansys.c we are calling function AdvISR at 2 instances [in the function advansys_reset and advansys_interrupt] while holding spinlock. Function AdvISR eventually calls request_firmware following this sequence of routines:

Quoted 8 lines

AdvISR -> adv_async_callback -> AdvResetChipAndSB -> AdvInitAsc3550Driver -> request_firmware

According to the definition of request_firmware it should be called from user context where sleeping is allowed. And usually sleeping under the spin lock is not allowed. Is it really necessary to call AdvISR under spinlocks here? Are we taking care of sleeping related concern of request_firmware or am I overlooking something here?

Hi,

Any comments on this?

Thanks

Quoted 2 lines

Thank you.

Signature · 1 line
Vaishali
#2 lore raw
Quoted 19 lines · Vaishali Thakkar
Quoted 7 lines · Vaishali Thakkar

Hi,

In the file drivers/scsi/advansys.c we are calling function AdvISR at 2 instances [in the function advansys_reset and advansys_interrupt] while holding spinlock. Function AdvISR eventually calls request_firmware following this sequence of routines:

Quoted 8 lines

AdvISR -> adv_async_callback -> AdvResetChipAndSB -> AdvInitAsc3550Driver -> request_firmware

According to the definition of request_firmware it should be called from user context where sleeping is allowed. And usually sleeping under the spin lock is not allowed. Is it really necessary to call AdvISR under spinlocks here? Are we taking care of sleeping related concern of request_firmware or am I overlooking something here?

Quoted 4 lines

Hi,

Any comments on this?

AdvISR is the main interrupt handling routine, for which we definitely will want to have interupts disabled. Plus the SCSI parallel drivers (ab-) use the interrupt routine to do all sorts of things, and are thereby well versed to keep interrupts disabled for an extented amount of time.
However, we don't really have a good way of handling a request firmware here; we probably would need to implement a workqueue to handle this properly ...

Cheers,

Hannes

Signature · 5 lines
Dr. Hannes Reinecke		   Teamlead Storage & Networking
[email protected]			               +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)