hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/infiniband/core/mad_rmpp.c
....@@ -40,8 +40,7 @@
4040 enum rmpp_state {
4141 RMPP_STATE_ACTIVE,
4242 RMPP_STATE_TIMEOUT,
43
- RMPP_STATE_COMPLETE,
44
- RMPP_STATE_CANCELING
43
+ RMPP_STATE_COMPLETE
4544 };
4645
4746 struct mad_rmpp_recv {
....@@ -52,7 +51,7 @@
5251 struct completion comp;
5352 enum rmpp_state state;
5453 spinlock_t lock;
55
- atomic_t refcount;
54
+ refcount_t refcount;
5655
5756 struct ib_ah *ah;
5857 struct ib_mad_recv_wc *rmpp_wc;
....@@ -73,7 +72,7 @@
7372
7473 static inline void deref_rmpp_recv(struct mad_rmpp_recv *rmpp_recv)
7574 {
76
- if (atomic_dec_and_test(&rmpp_recv->refcount))
75
+ if (refcount_dec_and_test(&rmpp_recv->refcount))
7776 complete(&rmpp_recv->comp);
7877 }
7978
....@@ -81,7 +80,7 @@
8180 {
8281 deref_rmpp_recv(rmpp_recv);
8382 wait_for_completion(&rmpp_recv->comp);
84
- rdma_destroy_ah(rmpp_recv->ah);
83
+ rdma_destroy_ah(rmpp_recv->ah, RDMA_DESTROY_AH_SLEEPABLE);
8584 kfree(rmpp_recv);
8685 }
8786
....@@ -92,22 +91,18 @@
9291
9392 spin_lock_irqsave(&agent->lock, flags);
9493 list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) {
95
- if (rmpp_recv->state != RMPP_STATE_COMPLETE)
96
- ib_free_recv_mad(rmpp_recv->rmpp_wc);
97
- rmpp_recv->state = RMPP_STATE_CANCELING;
98
- }
99
- spin_unlock_irqrestore(&agent->lock, flags);
100
-
101
- list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) {
10294 cancel_delayed_work(&rmpp_recv->timeout_work);
10395 cancel_delayed_work(&rmpp_recv->cleanup_work);
10496 }
97
+ spin_unlock_irqrestore(&agent->lock, flags);
10598
10699 flush_workqueue(agent->qp_info->port_priv->wq);
107100
108101 list_for_each_entry_safe(rmpp_recv, temp_rmpp_recv,
109102 &agent->rmpp_list, list) {
110103 list_del(&rmpp_recv->list);
104
+ if (rmpp_recv->state != RMPP_STATE_COMPLETE)
105
+ ib_free_recv_mad(rmpp_recv->rmpp_wc);
111106 destroy_rmpp_recv(rmpp_recv);
112107 }
113108 }
....@@ -171,7 +166,7 @@
171166 hdr_len, 0, GFP_KERNEL,
172167 IB_MGMT_BASE_VERSION);
173168 if (IS_ERR(msg))
174
- rdma_destroy_ah(ah);
169
+ rdma_destroy_ah(ah, RDMA_DESTROY_AH_SLEEPABLE);
175170 else {
176171 msg->ah = ah;
177172 msg->context[0] = ah;
....@@ -201,7 +196,7 @@
201196
202197 ret = ib_post_send_mad(msg, NULL);
203198 if (ret) {
204
- rdma_destroy_ah(msg->ah);
199
+ rdma_destroy_ah(msg->ah, RDMA_DESTROY_AH_SLEEPABLE);
205200 ib_free_send_mad(msg);
206201 }
207202 }
....@@ -209,7 +204,8 @@
209204 void ib_rmpp_send_handler(struct ib_mad_send_wc *mad_send_wc)
210205 {
211206 if (mad_send_wc->send_buf->context[0] == mad_send_wc->send_buf->ah)
212
- rdma_destroy_ah(mad_send_wc->send_buf->ah);
207
+ rdma_destroy_ah(mad_send_wc->send_buf->ah,
208
+ RDMA_DESTROY_AH_SLEEPABLE);
213209 ib_free_send_mad(mad_send_wc->send_buf);
214210 }
215211
....@@ -237,7 +233,7 @@
237233
238234 ret = ib_post_send_mad(msg, NULL);
239235 if (ret) {
240
- rdma_destroy_ah(msg->ah);
236
+ rdma_destroy_ah(msg->ah, RDMA_DESTROY_AH_SLEEPABLE);
241237 ib_free_send_mad(msg);
242238 }
243239 }
....@@ -271,10 +267,6 @@
271267 unsigned long flags;
272268
273269 spin_lock_irqsave(&rmpp_recv->agent->lock, flags);
274
- if (rmpp_recv->state == RMPP_STATE_CANCELING) {
275
- spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags);
276
- return;
277
- }
278270 list_del(&rmpp_recv->list);
279271 spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags);
280272 destroy_rmpp_recv(rmpp_recv);
....@@ -304,7 +296,7 @@
304296 INIT_DELAYED_WORK(&rmpp_recv->cleanup_work, recv_cleanup_handler);
305297 spin_lock_init(&rmpp_recv->lock);
306298 rmpp_recv->state = RMPP_STATE_ACTIVE;
307
- atomic_set(&rmpp_recv->refcount, 1);
299
+ refcount_set(&rmpp_recv->refcount, 1);
308300
309301 rmpp_recv->rmpp_wc = mad_recv_wc;
310302 rmpp_recv->cur_seg_buf = &mad_recv_wc->recv_buf;
....@@ -356,7 +348,7 @@
356348 spin_lock_irqsave(&agent->lock, flags);
357349 rmpp_recv = find_rmpp_recv(agent, mad_recv_wc);
358350 if (rmpp_recv)
359
- atomic_inc(&rmpp_recv->refcount);
351
+ refcount_inc(&rmpp_recv->refcount);
360352 spin_unlock_irqrestore(&agent->lock, flags);
361353 return rmpp_recv;
362354 }
....@@ -552,7 +544,7 @@
552544 destroy_rmpp_recv(rmpp_recv);
553545 return continue_rmpp(agent, mad_recv_wc);
554546 }
555
- atomic_inc(&rmpp_recv->refcount);
547
+ refcount_inc(&rmpp_recv->refcount);
556548
557549 if (get_last_flag(&mad_recv_wc->recv_buf)) {
558550 rmpp_recv->state = RMPP_STATE_COMPLETE;