Messages in this thread | | | From | "Chris Smith" <> | Subject | I/O Requests again | Date | Tue, 1 Jun 1999 13:36:20 -0600 |
| |
Hi,
Okay, I posted a question yesterday about calling make_request() from within my block driver's request_fn. I have since realized that this would deadlock trying to grab the I/O request spinlock twice, since it is held by add_request through the call to dev->request_fn. Yes, I see that request_fn needs to hold that lock to play around with its request list, but if I stop playing around with my request list, can I safely release the lock to call make_request?
My problem comes from the fact that the saved flags are stored in a local variable in the calling instance of add_request! Are there safe values for these flags that I can use to unlock the I/O request queue, assuming I don't play with request lists until I lock it again? And in particular, can I call make_request with interrupts disabled? Here's my basic plan for my driver right now, so please let me know if this is okay (essentially, it's supposed to make an existing block device available through my major number):
xxx_end_request() { finish the corresponding request to my driver }
xxx_make_request() { unlock the I/O request spinlock (but keep current flags) create a new struct buffer_head with completion function set to xxx_end_request call make_request lock the I/O request spinlock (keep current flags) }
xxx_request() { Get and remove the current request Call xxx_make_request to create the underlying request }
So, any reason this doesn't work? (Again, apologies if this question is answered somewhere obvious that I haven't found.)
TIA, Chris
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |