]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/infiniband/core/ucma.c
IB/cm: Improve local id allocation
[linux-2.6-omap-h63xx.git] / drivers / infiniband / core / ucma.c
index c859134c1daa3a0d73306f517bebc1c3920a949d..53b4c94a7eb5a34a0ffe8ab29a4dcb941967c33b 100644 (file)
@@ -306,26 +306,18 @@ static ssize_t ucma_get_event(struct ucma_file *file, const char __user *inbuf,
 
        mutex_lock(&file->mut);
        while (list_empty(&file->event_list)) {
-               if (file->filp->f_flags & O_NONBLOCK) {
-                       ret = -EAGAIN;
-                       break;
-               }
+               mutex_unlock(&file->mut);
 
-               if (signal_pending(current)) {
-                       ret = -ERESTARTSYS;
-                       break;
-               }
+               if (file->filp->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+
+               if (wait_event_interruptible(file->poll_wait,
+                                            !list_empty(&file->event_list)))
+                       return -ERESTARTSYS;
 
-               prepare_to_wait(&file->poll_wait, &wait, TASK_INTERRUPTIBLE);
-               mutex_unlock(&file->mut);
-               schedule();
                mutex_lock(&file->mut);
-               finish_wait(&file->poll_wait, &wait);
        }
 
-       if (ret)
-               goto done;
-
        uevent = list_entry(file->event_list.next, struct ucma_event, list);
 
        if (uevent->resp.event == RDMA_CM_EVENT_CONNECT_REQUEST) {