struct futex_q q;
 };
 
+extern int futex_parse_waitv(struct futex_vector *futexv,
+                            struct futex_waitv __user *uwaitv,
+                            unsigned int nr_futexes, futex_wake_fn *wake,
+                            void *wake_data);
+
 extern int futex_wait_multiple(struct futex_vector *vs, unsigned int count,
                               struct hrtimer_sleeper *to);
 
 
  * @futexv:    Kernel side list of waiters to be filled
  * @uwaitv:     Userspace list to be parsed
  * @nr_futexes: Length of futexv
+ * @wake:      Wake to call when futex is woken
+ * @wake_data: Data for the wake handler
  *
  * Return: Error code on failure, 0 on success
  */
-static int futex_parse_waitv(struct futex_vector *futexv,
-                            struct futex_waitv __user *uwaitv,
-                            unsigned int nr_futexes)
+int futex_parse_waitv(struct futex_vector *futexv,
+                     struct futex_waitv __user *uwaitv,
+                     unsigned int nr_futexes, futex_wake_fn *wake,
+                     void *wake_data)
 {
        struct futex_waitv aux;
        unsigned int i;
                futexv[i].w.val = aux.val;
                futexv[i].w.uaddr = aux.uaddr;
                futexv[i].q = futex_q_init;
+               futexv[i].q.wake = wake;
+               futexv[i].q.wake_data = wake_data;
        }
 
        return 0;
                goto destroy_timer;
        }
 
-       ret = futex_parse_waitv(futexv, waiters, nr_futexes);
+       ret = futex_parse_waitv(futexv, waiters, nr_futexes, futex_wake_mark,
+                               NULL);
        if (!ret)
                ret = futex_wait_multiple(futexv, nr_futexes, timeout ? &to : NULL);
 
        if (!waiters)
                return -EINVAL;
 
-       ret = futex_parse_waitv(futexes, waiters, 2);
+       ret = futex_parse_waitv(futexes, waiters, 2, futex_wake_mark, NULL);
        if (ret)
                return ret;