CacheFiles: Permit the page lock state to be monitored
Add a function to install a monitor on the page lock waitqueue for a particular page, thus allowing the page being unlocked to be detected. This is used by CacheFiles to detect read completion on a page in the backing filesystem so that it can then copy the data to the waiting netfs page. Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Steve Dickson <steved@redhat.com> Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: Al Viro <viro@zeniv.linux.org.uk> Tested-by: Daire Byrne <Daire.Byrne@framestore.com>
This commit is contained in:
parent
b510882281
commit
385e1ca5f2
2 changed files with 23 additions and 0 deletions
|
@ -383,6 +383,11 @@ static inline void wait_on_page_writeback(struct page *page)
|
||||||
|
|
||||||
extern void end_page_writeback(struct page *page);
|
extern void end_page_writeback(struct page *page);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add an arbitrary waiter to a page's wait queue
|
||||||
|
*/
|
||||||
|
extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fault a userspace page into pagetables. Return non-zero on a fault.
|
* Fault a userspace page into pagetables. Return non-zero on a fault.
|
||||||
*
|
*
|
||||||
|
|
18
mm/filemap.c
18
mm/filemap.c
|
@ -564,6 +564,24 @@ void wait_on_page_bit(struct page *page, int bit_nr)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(wait_on_page_bit);
|
EXPORT_SYMBOL(wait_on_page_bit);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add_page_wait_queue - Add an arbitrary waiter to a page's wait queue
|
||||||
|
* @page - Page defining the wait queue of interest
|
||||||
|
* @waiter - Waiter to add to the queue
|
||||||
|
*
|
||||||
|
* Add an arbitrary @waiter to the wait queue for the nominated @page.
|
||||||
|
*/
|
||||||
|
void add_page_wait_queue(struct page *page, wait_queue_t *waiter)
|
||||||
|
{
|
||||||
|
wait_queue_head_t *q = page_waitqueue(page);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&q->lock, flags);
|
||||||
|
__add_wait_queue(q, waiter);
|
||||||
|
spin_unlock_irqrestore(&q->lock, flags);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(add_page_wait_queue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* unlock_page - unlock a locked page
|
* unlock_page - unlock a locked page
|
||||||
* @page: the page
|
* @page: the page
|
||||||
|
|
Loading…
Add table
Reference in a new issue