| .. | .. |
|---|
| 43 | 43 | |
|---|
| 44 | 44 | enum mrpc_state state; |
|---|
| 45 | 45 | |
|---|
| 46 | | - struct completion comp; |
|---|
| 46 | + wait_queue_head_t cmd_comp; |
|---|
| 47 | 47 | struct kref kref; |
|---|
| 48 | 48 | struct list_head list; |
|---|
| 49 | 49 | |
|---|
| 50 | + bool cmd_done; |
|---|
| 50 | 51 | u32 cmd; |
|---|
| 51 | 52 | u32 status; |
|---|
| 52 | 53 | u32 return_code; |
|---|
| .. | .. |
|---|
| 68 | 69 | stuser->stdev = stdev; |
|---|
| 69 | 70 | kref_init(&stuser->kref); |
|---|
| 70 | 71 | INIT_LIST_HEAD(&stuser->list); |
|---|
| 71 | | - init_completion(&stuser->comp); |
|---|
| 72 | + init_waitqueue_head(&stuser->cmd_comp); |
|---|
| 72 | 73 | stuser->event_cnt = atomic_read(&stdev->event_cnt); |
|---|
| 73 | 74 | |
|---|
| 74 | 75 | dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); |
|---|
| .. | .. |
|---|
| 147 | 148 | kref_get(&stuser->kref); |
|---|
| 148 | 149 | stuser->read_len = sizeof(stuser->data); |
|---|
| 149 | 150 | stuser_set_state(stuser, MRPC_QUEUED); |
|---|
| 150 | | - reinit_completion(&stuser->comp); |
|---|
| 151 | + stuser->cmd_done = false; |
|---|
| 151 | 152 | list_add_tail(&stuser->list, &stdev->mrpc_queue); |
|---|
| 152 | 153 | |
|---|
| 153 | 154 | mrpc_cmd_submit(stdev); |
|---|
| .. | .. |
|---|
| 184 | 185 | stuser->read_len); |
|---|
| 185 | 186 | |
|---|
| 186 | 187 | out: |
|---|
| 187 | | - complete_all(&stuser->comp); |
|---|
| 188 | + stuser->cmd_done = true; |
|---|
| 189 | + wake_up_interruptible(&stuser->cmd_comp); |
|---|
| 188 | 190 | list_del_init(&stuser->list); |
|---|
| 189 | 191 | stuser_put(stuser); |
|---|
| 190 | 192 | stdev->mrpc_busy = 0; |
|---|
| .. | .. |
|---|
| 354 | 356 | return PTR_ERR(stuser); |
|---|
| 355 | 357 | |
|---|
| 356 | 358 | filp->private_data = stuser; |
|---|
| 357 | | - nonseekable_open(inode, filp); |
|---|
| 359 | + stream_open(inode, filp); |
|---|
| 358 | 360 | |
|---|
| 359 | 361 | dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); |
|---|
| 360 | 362 | |
|---|
| .. | .. |
|---|
| 454 | 456 | mutex_unlock(&stdev->mrpc_mutex); |
|---|
| 455 | 457 | |
|---|
| 456 | 458 | if (filp->f_flags & O_NONBLOCK) { |
|---|
| 457 | | - if (!try_wait_for_completion(&stuser->comp)) |
|---|
| 459 | + if (!READ_ONCE(stuser->cmd_done)) |
|---|
| 458 | 460 | return -EAGAIN; |
|---|
| 459 | 461 | } else { |
|---|
| 460 | | - rc = wait_for_completion_interruptible(&stuser->comp); |
|---|
| 462 | + rc = wait_event_interruptible(stuser->cmd_comp, |
|---|
| 463 | + stuser->cmd_done); |
|---|
| 461 | 464 | if (rc < 0) |
|---|
| 462 | 465 | return rc; |
|---|
| 463 | 466 | } |
|---|
| .. | .. |
|---|
| 505 | 508 | struct switchtec_dev *stdev = stuser->stdev; |
|---|
| 506 | 509 | __poll_t ret = 0; |
|---|
| 507 | 510 | |
|---|
| 508 | | - poll_wait(filp, &stuser->comp.wait, wait); |
|---|
| 511 | + poll_wait(filp, &stuser->cmd_comp, wait); |
|---|
| 509 | 512 | poll_wait(filp, &stdev->event_wq, wait); |
|---|
| 510 | 513 | |
|---|
| 511 | 514 | if (lock_mutex_and_test_alive(stdev)) |
|---|
| .. | .. |
|---|
| 513 | 516 | |
|---|
| 514 | 517 | mutex_unlock(&stdev->mrpc_mutex); |
|---|
| 515 | 518 | |
|---|
| 516 | | - if (try_wait_for_completion(&stuser->comp)) |
|---|
| 519 | + if (READ_ONCE(stuser->cmd_done)) |
|---|
| 517 | 520 | ret |= EPOLLIN | EPOLLRDNORM; |
|---|
| 518 | 521 | |
|---|
| 519 | 522 | if (stuser->event_cnt != atomic_read(&stdev->event_cnt)) |
|---|
| .. | .. |
|---|
| 1037 | 1040 | |
|---|
| 1038 | 1041 | /* Wake up and kill any users waiting on an MRPC request */ |
|---|
| 1039 | 1042 | list_for_each_entry_safe(stuser, tmpuser, &stdev->mrpc_queue, list) { |
|---|
| 1040 | | - complete_all(&stuser->comp); |
|---|
| 1043 | + stuser->cmd_done = true; |
|---|
| 1044 | + wake_up_interruptible(&stuser->cmd_comp); |
|---|
| 1041 | 1045 | list_del_init(&stuser->list); |
|---|
| 1042 | 1046 | stuser_put(stuser); |
|---|
| 1043 | 1047 | } |
|---|