.. | .. |
---|
40 | 40 | enum rmpp_state { |
---|
41 | 41 | RMPP_STATE_ACTIVE, |
---|
42 | 42 | RMPP_STATE_TIMEOUT, |
---|
43 | | - RMPP_STATE_COMPLETE, |
---|
44 | | - RMPP_STATE_CANCELING |
---|
| 43 | + RMPP_STATE_COMPLETE |
---|
45 | 44 | }; |
---|
46 | 45 | |
---|
47 | 46 | struct mad_rmpp_recv { |
---|
.. | .. |
---|
52 | 51 | struct completion comp; |
---|
53 | 52 | enum rmpp_state state; |
---|
54 | 53 | spinlock_t lock; |
---|
55 | | - atomic_t refcount; |
---|
| 54 | + refcount_t refcount; |
---|
56 | 55 | |
---|
57 | 56 | struct ib_ah *ah; |
---|
58 | 57 | struct ib_mad_recv_wc *rmpp_wc; |
---|
.. | .. |
---|
73 | 72 | |
---|
74 | 73 | static inline void deref_rmpp_recv(struct mad_rmpp_recv *rmpp_recv) |
---|
75 | 74 | { |
---|
76 | | - if (atomic_dec_and_test(&rmpp_recv->refcount)) |
---|
| 75 | + if (refcount_dec_and_test(&rmpp_recv->refcount)) |
---|
77 | 76 | complete(&rmpp_recv->comp); |
---|
78 | 77 | } |
---|
79 | 78 | |
---|
.. | .. |
---|
81 | 80 | { |
---|
82 | 81 | deref_rmpp_recv(rmpp_recv); |
---|
83 | 82 | wait_for_completion(&rmpp_recv->comp); |
---|
84 | | - rdma_destroy_ah(rmpp_recv->ah); |
---|
| 83 | + rdma_destroy_ah(rmpp_recv->ah, RDMA_DESTROY_AH_SLEEPABLE); |
---|
85 | 84 | kfree(rmpp_recv); |
---|
86 | 85 | } |
---|
87 | 86 | |
---|
.. | .. |
---|
92 | 91 | |
---|
93 | 92 | spin_lock_irqsave(&agent->lock, flags); |
---|
94 | 93 | 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) { |
---|
102 | 94 | cancel_delayed_work(&rmpp_recv->timeout_work); |
---|
103 | 95 | cancel_delayed_work(&rmpp_recv->cleanup_work); |
---|
104 | 96 | } |
---|
| 97 | + spin_unlock_irqrestore(&agent->lock, flags); |
---|
105 | 98 | |
---|
106 | 99 | flush_workqueue(agent->qp_info->port_priv->wq); |
---|
107 | 100 | |
---|
108 | 101 | list_for_each_entry_safe(rmpp_recv, temp_rmpp_recv, |
---|
109 | 102 | &agent->rmpp_list, list) { |
---|
110 | 103 | list_del(&rmpp_recv->list); |
---|
| 104 | + if (rmpp_recv->state != RMPP_STATE_COMPLETE) |
---|
| 105 | + ib_free_recv_mad(rmpp_recv->rmpp_wc); |
---|
111 | 106 | destroy_rmpp_recv(rmpp_recv); |
---|
112 | 107 | } |
---|
113 | 108 | } |
---|
.. | .. |
---|
171 | 166 | hdr_len, 0, GFP_KERNEL, |
---|
172 | 167 | IB_MGMT_BASE_VERSION); |
---|
173 | 168 | if (IS_ERR(msg)) |
---|
174 | | - rdma_destroy_ah(ah); |
---|
| 169 | + rdma_destroy_ah(ah, RDMA_DESTROY_AH_SLEEPABLE); |
---|
175 | 170 | else { |
---|
176 | 171 | msg->ah = ah; |
---|
177 | 172 | msg->context[0] = ah; |
---|
.. | .. |
---|
201 | 196 | |
---|
202 | 197 | ret = ib_post_send_mad(msg, NULL); |
---|
203 | 198 | if (ret) { |
---|
204 | | - rdma_destroy_ah(msg->ah); |
---|
| 199 | + rdma_destroy_ah(msg->ah, RDMA_DESTROY_AH_SLEEPABLE); |
---|
205 | 200 | ib_free_send_mad(msg); |
---|
206 | 201 | } |
---|
207 | 202 | } |
---|
.. | .. |
---|
209 | 204 | void ib_rmpp_send_handler(struct ib_mad_send_wc *mad_send_wc) |
---|
210 | 205 | { |
---|
211 | 206 | 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); |
---|
213 | 209 | ib_free_send_mad(mad_send_wc->send_buf); |
---|
214 | 210 | } |
---|
215 | 211 | |
---|
.. | .. |
---|
237 | 233 | |
---|
238 | 234 | ret = ib_post_send_mad(msg, NULL); |
---|
239 | 235 | if (ret) { |
---|
240 | | - rdma_destroy_ah(msg->ah); |
---|
| 236 | + rdma_destroy_ah(msg->ah, RDMA_DESTROY_AH_SLEEPABLE); |
---|
241 | 237 | ib_free_send_mad(msg); |
---|
242 | 238 | } |
---|
243 | 239 | } |
---|
.. | .. |
---|
271 | 267 | unsigned long flags; |
---|
272 | 268 | |
---|
273 | 269 | 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 | | - } |
---|
278 | 270 | list_del(&rmpp_recv->list); |
---|
279 | 271 | spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags); |
---|
280 | 272 | destroy_rmpp_recv(rmpp_recv); |
---|
.. | .. |
---|
304 | 296 | INIT_DELAYED_WORK(&rmpp_recv->cleanup_work, recv_cleanup_handler); |
---|
305 | 297 | spin_lock_init(&rmpp_recv->lock); |
---|
306 | 298 | rmpp_recv->state = RMPP_STATE_ACTIVE; |
---|
307 | | - atomic_set(&rmpp_recv->refcount, 1); |
---|
| 299 | + refcount_set(&rmpp_recv->refcount, 1); |
---|
308 | 300 | |
---|
309 | 301 | rmpp_recv->rmpp_wc = mad_recv_wc; |
---|
310 | 302 | rmpp_recv->cur_seg_buf = &mad_recv_wc->recv_buf; |
---|
.. | .. |
---|
356 | 348 | spin_lock_irqsave(&agent->lock, flags); |
---|
357 | 349 | rmpp_recv = find_rmpp_recv(agent, mad_recv_wc); |
---|
358 | 350 | if (rmpp_recv) |
---|
359 | | - atomic_inc(&rmpp_recv->refcount); |
---|
| 351 | + refcount_inc(&rmpp_recv->refcount); |
---|
360 | 352 | spin_unlock_irqrestore(&agent->lock, flags); |
---|
361 | 353 | return rmpp_recv; |
---|
362 | 354 | } |
---|
.. | .. |
---|
552 | 544 | destroy_rmpp_recv(rmpp_recv); |
---|
553 | 545 | return continue_rmpp(agent, mad_recv_wc); |
---|
554 | 546 | } |
---|
555 | | - atomic_inc(&rmpp_recv->refcount); |
---|
| 547 | + refcount_inc(&rmpp_recv->refcount); |
---|
556 | 548 | |
---|
557 | 549 | if (get_last_flag(&mad_recv_wc->recv_buf)) { |
---|
558 | 550 | rmpp_recv->state = RMPP_STATE_COMPLETE; |
---|