Le Fri, 7 Dec 2007 19:58:26 +0530,
"Adil Mujeeb" <[EMAIL PROTECTED]> a écrit :
> void fastcall __lock_page(struct page *page)
>
> {
>
> DEFINE_WAIT_BIT(wait, &page->flags, PG_locked);
>
> __wait_on_bit_lock(page_waitqueue(page), &wait, sync_page,
> TASK_UNINTERRUPTIBLE);
>
> }
>
>
> I think "stores the process descriptor in a wait queue" should be
> corrected as "stores the page descriptor in a wait queue"
I think the text is correct, wait queues are list of processes.
Roughly, what the code does is:
1) Using DEFINE_WAIT_BIT, allocate on the stack a wait_bit_queue
element
2) Call __wait_on_bit_lock(), which will do:
a) Call() prepare_to_wait_exclusive to add the current process
(defined by the wait_bit_queue allocated at 1)) in the waitqueue
of the page (fetched by page_waitqueue(page) in the call to
__wait_on_bit_lock())
b) Test if the condition of wait is met or not (i.e in our case is
page->flags contains PG_locked)
c) If not, call the function sync_page() provided as argument to
the __wait_on_bit_lock() function. The sync_page() will start an
asynchronous I/O operation and call io_schedule() that will elect
another process to be run.
[We're now sleeping...the I/O operation is processed...and...]
When the I/O operation completes, we're woken up and we exit
from io_schedule(), then from sync_page(), and we're now back in
__wait_on_bit_lock().
d) The condition (page->flags contains PG_locked) is tested again.
If it's still not met, then we try again. Otherwise, we're done!
For more information, see http://lwn.net/images/pdf/LDD3/ch06.pdf,
section « Introduction to Sleeping », page 14 of the PDF, page 148 of
the book. It explains how wait queues work.
Thomas
--
Thomas Petazzoni, [EMAIL PROTECTED], http://thomas.enix.org
Jabber, [EMAIL PROTECTED]
Toulibre, http://www.toulibre.org - APRIL, http://www.april.org
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [EMAIL PROTECTED]
Please read the FAQ at http://kernelnewbies.org/FAQ