aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/mic/scif/scif_nm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/mic/scif/scif_nm.c')
-rw-r--r--drivers/misc/mic/scif/scif_nm.c20
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)
147void scif_handle_remove_node(int node) 153void 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