hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/pci/switch/switchtec.c
....@@ -43,10 +43,11 @@
4343
4444 enum mrpc_state state;
4545
46
- struct completion comp;
46
+ wait_queue_head_t cmd_comp;
4747 struct kref kref;
4848 struct list_head list;
4949
50
+ bool cmd_done;
5051 u32 cmd;
5152 u32 status;
5253 u32 return_code;
....@@ -68,7 +69,7 @@
6869 stuser->stdev = stdev;
6970 kref_init(&stuser->kref);
7071 INIT_LIST_HEAD(&stuser->list);
71
- init_completion(&stuser->comp);
72
+ init_waitqueue_head(&stuser->cmd_comp);
7273 stuser->event_cnt = atomic_read(&stdev->event_cnt);
7374
7475 dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
....@@ -147,7 +148,7 @@
147148 kref_get(&stuser->kref);
148149 stuser->read_len = sizeof(stuser->data);
149150 stuser_set_state(stuser, MRPC_QUEUED);
150
- reinit_completion(&stuser->comp);
151
+ stuser->cmd_done = false;
151152 list_add_tail(&stuser->list, &stdev->mrpc_queue);
152153
153154 mrpc_cmd_submit(stdev);
....@@ -184,7 +185,8 @@
184185 stuser->read_len);
185186
186187 out:
187
- complete_all(&stuser->comp);
188
+ stuser->cmd_done = true;
189
+ wake_up_interruptible(&stuser->cmd_comp);
188190 list_del_init(&stuser->list);
189191 stuser_put(stuser);
190192 stdev->mrpc_busy = 0;
....@@ -354,7 +356,7 @@
354356 return PTR_ERR(stuser);
355357
356358 filp->private_data = stuser;
357
- nonseekable_open(inode, filp);
359
+ stream_open(inode, filp);
358360
359361 dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
360362
....@@ -454,10 +456,11 @@
454456 mutex_unlock(&stdev->mrpc_mutex);
455457
456458 if (filp->f_flags & O_NONBLOCK) {
457
- if (!try_wait_for_completion(&stuser->comp))
459
+ if (!READ_ONCE(stuser->cmd_done))
458460 return -EAGAIN;
459461 } else {
460
- rc = wait_for_completion_interruptible(&stuser->comp);
462
+ rc = wait_event_interruptible(stuser->cmd_comp,
463
+ stuser->cmd_done);
461464 if (rc < 0)
462465 return rc;
463466 }
....@@ -505,7 +508,7 @@
505508 struct switchtec_dev *stdev = stuser->stdev;
506509 __poll_t ret = 0;
507510
508
- poll_wait(filp, &stuser->comp.wait, wait);
511
+ poll_wait(filp, &stuser->cmd_comp, wait);
509512 poll_wait(filp, &stdev->event_wq, wait);
510513
511514 if (lock_mutex_and_test_alive(stdev))
....@@ -513,7 +516,7 @@
513516
514517 mutex_unlock(&stdev->mrpc_mutex);
515518
516
- if (try_wait_for_completion(&stuser->comp))
519
+ if (READ_ONCE(stuser->cmd_done))
517520 ret |= EPOLLIN | EPOLLRDNORM;
518521
519522 if (stuser->event_cnt != atomic_read(&stdev->event_cnt))
....@@ -1037,7 +1040,8 @@
10371040
10381041 /* Wake up and kill any users waiting on an MRPC request */
10391042 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);
10411045 list_del_init(&stuser->list);
10421046 stuser_put(stuser);
10431047 }