diff options
Diffstat (limited to 'drivers/misc/mic/scif/scif_nm.c')
-rw-r--r-- | drivers/misc/mic/scif/scif_nm.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/misc/mic/scif/scif_nm.c b/drivers/misc/mic/scif/scif_nm.c index 9b4c5382d6a7..79f26a02a1cb 100644 --- a/drivers/misc/mic/scif/scif_nm.c +++ b/drivers/misc/mic/scif/scif_nm.c | |||
@@ -34,6 +34,7 @@ static void scif_invalidate_ep(int node) | |||
34 | list_for_each_safe(pos, tmpq, &scif_info.disconnected) { | 34 | list_for_each_safe(pos, tmpq, &scif_info.disconnected) { |
35 | ep = list_entry(pos, struct scif_endpt, list); | 35 | ep = list_entry(pos, struct scif_endpt, list); |
36 | if (ep->remote_dev->node == node) { | 36 | if (ep->remote_dev->node == node) { |
37 | scif_unmap_all_windows(ep); | ||
37 | spin_lock(&ep->lock); | 38 | spin_lock(&ep->lock); |
38 | scif_cleanup_ep_qp(ep); | 39 | scif_cleanup_ep_qp(ep); |
39 | spin_unlock(&ep->lock); | 40 | spin_unlock(&ep->lock); |
@@ -50,6 +51,7 @@ static void scif_invalidate_ep(int node) | |||
50 | wake_up_interruptible(&ep->sendwq); | 51 | wake_up_interruptible(&ep->sendwq); |
51 | wake_up_interruptible(&ep->recvwq); | 52 | wake_up_interruptible(&ep->recvwq); |
52 | spin_unlock(&ep->lock); | 53 | spin_unlock(&ep->lock); |
54 | scif_unmap_all_windows(ep); | ||
53 | } | 55 | } |
54 | } | 56 | } |
55 | mutex_unlock(&scif_info.connlock); | 57 | mutex_unlock(&scif_info.connlock); |
@@ -61,8 +63,8 @@ void scif_free_qp(struct scif_dev *scifdev) | |||
61 | 63 | ||
62 | if (!qp) | 64 | if (!qp) |
63 | return; | 65 | return; |
64 | scif_free_coherent((void *)qp->inbound_q.rb_base, | 66 | scif_unmap_single(qp->local_buf, scifdev, qp->inbound_q.size); |
65 | qp->local_buf, scifdev, qp->inbound_q.size); | 67 | kfree(qp->inbound_q.rb_base); |
66 | scif_unmap_single(qp->local_qp, scifdev, sizeof(struct scif_qp)); | 68 | scif_unmap_single(qp->local_qp, scifdev, sizeof(struct scif_qp)); |
67 | kfree(scifdev->qpairs); | 69 | kfree(scifdev->qpairs); |
68 | scifdev->qpairs = NULL; | 70 | scifdev->qpairs = NULL; |
@@ -125,8 +127,12 @@ void scif_cleanup_scifdev(struct scif_dev *dev) | |||
125 | } | 127 | } |
126 | scif_destroy_intr_wq(dev); | 128 | scif_destroy_intr_wq(dev); |
127 | } | 129 | } |
130 | flush_work(&scif_info.misc_work); | ||
128 | scif_destroy_p2p(dev); | 131 | scif_destroy_p2p(dev); |
129 | scif_invalidate_ep(dev->node); | 132 | scif_invalidate_ep(dev->node); |
133 | scif_zap_mmaps(dev->node); | ||
134 | scif_cleanup_rma_for_zombies(dev->node); | ||
135 | flush_work(&scif_info.misc_work); | ||
130 | scif_send_acks(dev); | 136 | scif_send_acks(dev); |
131 | if (!dev->node && scif_info.card_initiated_exit) { | 137 | if (!dev->node && scif_info.card_initiated_exit) { |
132 | /* | 138 | /* |
@@ -147,14 +153,8 @@ void scif_cleanup_scifdev(struct scif_dev *dev) | |||
147 | void scif_handle_remove_node(int node) | 153 | void scif_handle_remove_node(int node) |
148 | { | 154 | { |
149 | struct scif_dev *scifdev = &scif_dev[node]; | 155 | struct scif_dev *scifdev = &scif_dev[node]; |
150 | struct scif_peer_dev *spdev; | 156 | |
151 | 157 | if (scif_peer_unregister_device(scifdev)) | |
152 | rcu_read_lock(); | ||
153 | spdev = rcu_dereference(scifdev->spdev); | ||
154 | rcu_read_unlock(); | ||
155 | if (spdev) | ||
156 | scif_peer_unregister_device(spdev); | ||
157 | else | ||
158 | scif_send_acks(scifdev); | 158 | scif_send_acks(scifdev); |
159 | } | 159 | } |
160 | 160 | ||