|
@@ -407,29 +407,18 @@ static ssize_t ib_ucm_event(struct ib_ucm_file *file,
|
|
|
|
|
|
mutex_lock(&file->file_mutex);
|
|
|
while (list_empty(&file->events)) {
|
|
|
+ mutex_unlock(&file->file_mutex);
|
|
|
|
|
|
- if (file->filp->f_flags & O_NONBLOCK) {
|
|
|
- result = -EAGAIN;
|
|
|
- break;
|
|
|
- }
|
|
|
+ if (file->filp->f_flags & O_NONBLOCK)
|
|
|
+ return -EAGAIN;
|
|
|
|
|
|
- if (signal_pending(current)) {
|
|
|
- result = -ERESTARTSYS;
|
|
|
- break;
|
|
|
- }
|
|
|
+ if (wait_event_interruptible(file->poll_wait,
|
|
|
+ !list_empty(&file->events)))
|
|
|
+ return -ERESTARTSYS;
|
|
|
|
|
|
- prepare_to_wait(&file->poll_wait, &wait, TASK_INTERRUPTIBLE);
|
|
|
-
|
|
|
- mutex_unlock(&file->file_mutex);
|
|
|
- schedule();
|
|
|
mutex_lock(&file->file_mutex);
|
|
|
-
|
|
|
- finish_wait(&file->poll_wait, &wait);
|
|
|
}
|
|
|
|
|
|
- if (result)
|
|
|
- goto done;
|
|
|
-
|
|
|
uevent = list_entry(file->events.next, struct ib_ucm_event, file_list);
|
|
|
|
|
|
if (ib_ucm_new_cm_id(uevent->resp.event)) {
|