+struct page_wait_queue {
+ struct page *page;
+ int bit;
+ wait_queue_t wait;
+};
+
+static int page_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key)
+{
+ struct page *page = key;
+ struct page_wait_queue *wq;
+
+ wq = container_of(wait, struct page_wait_queue, wait);
+ if (wq->page != page || test_bit(wq->bit, &page->flags))
+ return 0;
+ else
+ return autoremove_wake_function(wait, mode, sync, NULL);
+}
+
+#define __DEFINE_PAGE_WAIT(name, p, b, f) \
+ struct page_wait_queue name = { \
+ .page = p, \
+ .bit = b, \
+ .wait = { \
+ .task = current, \
+ .func = page_wake_function, \
+ .flags = f, \
+ .task_list = LIST_HEAD_INIT(name.wait.task_list),\
+ }, \
+ }
+
+#define DEFINE_PAGE_WAIT(name, p, b) __DEFINE_PAGE_WAIT(name, p, b, 0)
+#define DEFINE_PAGE_WAIT_EXCLUSIVE(name, p, b) \
+ __DEFINE_PAGE_WAIT(name, p, b, WQ_FLAG_EXCLUSIVE)
+