| .. | .. |
|---|
| 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; |
|---|