diff options
Diffstat (limited to 'net/rds/ib_send.c')
| -rw-r--r-- | net/rds/ib_send.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index a10fab6886d1..17fa80803ab0 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c | |||
| @@ -243,8 +243,12 @@ void rds_ib_send_cq_comp_handler(struct ib_cq *cq, void *context) | |||
| 243 | struct rds_message *rm; | 243 | struct rds_message *rm; |
| 244 | 244 | ||
| 245 | rm = rds_send_get_message(conn, send->s_op); | 245 | rm = rds_send_get_message(conn, send->s_op); |
| 246 | if (rm) | 246 | if (rm) { |
| 247 | if (rm->m_rdma_op) | ||
| 248 | rds_ib_send_unmap_rdma(ic, rm->m_rdma_op); | ||
| 247 | rds_ib_send_rdma_complete(rm, wc.status); | 249 | rds_ib_send_rdma_complete(rm, wc.status); |
| 250 | rds_message_put(rm); | ||
| 251 | } | ||
| 248 | } | 252 | } |
| 249 | 253 | ||
| 250 | oldest = (oldest + 1) % ic->i_send_ring.w_nr; | 254 | oldest = (oldest + 1) % ic->i_send_ring.w_nr; |
| @@ -482,6 +486,13 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 482 | BUG_ON(off % RDS_FRAG_SIZE); | 486 | BUG_ON(off % RDS_FRAG_SIZE); |
| 483 | BUG_ON(hdr_off != 0 && hdr_off != sizeof(struct rds_header)); | 487 | BUG_ON(hdr_off != 0 && hdr_off != sizeof(struct rds_header)); |
| 484 | 488 | ||
| 489 | /* Do not send cong updates to IB loopback */ | ||
| 490 | if (conn->c_loopback | ||
| 491 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | ||
| 492 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | ||
| 493 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | ||
| 494 | } | ||
| 495 | |||
| 485 | /* FIXME we may overallocate here */ | 496 | /* FIXME we may overallocate here */ |
| 486 | if (be32_to_cpu(rm->m_inc.i_hdr.h_len) == 0) | 497 | if (be32_to_cpu(rm->m_inc.i_hdr.h_len) == 0) |
| 487 | i = 1; | 498 | i = 1; |
| @@ -574,8 +585,7 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 574 | rds_ib_send_grab_credits(ic, 0, &posted, 1, RDS_MAX_ADV_CREDIT - adv_credits); | 585 | rds_ib_send_grab_credits(ic, 0, &posted, 1, RDS_MAX_ADV_CREDIT - adv_credits); |
| 575 | adv_credits += posted; | 586 | adv_credits += posted; |
| 576 | BUG_ON(adv_credits > 255); | 587 | BUG_ON(adv_credits > 255); |
| 577 | } else if (ic->i_rm != rm) | 588 | } |
| 578 | BUG(); | ||
| 579 | 589 | ||
| 580 | send = &ic->i_sends[pos]; | 590 | send = &ic->i_sends[pos]; |
| 581 | first = send; | 591 | first = send; |
| @@ -714,8 +724,8 @@ add_header: | |||
| 714 | ic->i_rm = prev->s_rm; | 724 | ic->i_rm = prev->s_rm; |
| 715 | prev->s_rm = NULL; | 725 | prev->s_rm = NULL; |
| 716 | } | 726 | } |
| 717 | /* Finesse this later */ | 727 | |
| 718 | BUG(); | 728 | rds_ib_conn_error(ic->conn, "ib_post_send failed\n"); |
| 719 | goto out; | 729 | goto out; |
| 720 | } | 730 | } |
| 721 | 731 | ||
