>static void jm_cq_comp_handler(struct ib_cq *cq, void *context) { > struct jm_rdma_conn *conn = context; > struct ib_wc wc; > struct jm_send_ctx *send; > > /* No idea why it should be called twice. */ > printk("cq comp for id %p\n", conn->jc_id); > ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); > while (ib_poll_cq(cq, 1, &wc) == 1) { > if (wc.opcode != IB_WC_RDMA_WRITE) { > printk("completed unknown opcode %d\n", wc.opcode); > /* continue; */ > } > send = (struct jm_send_ctx *)wc.wr_id; > printk("got send=%p\n", send); > printk("completed RDMA_WRITE of IO(%Lu, %u)\n", > send->s_offset, send->s_size); > send->s_done = wc.status == IB_WC_SUCCESS ? 1 : -EIO; > wake_up_all(&send->s_wait); > } > ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
unrelated to your problem, but this second call to ib_req_notify_cq isn't necessary. >static int jm_rdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event >*event) { .. > case RDMA_CM_EVENT_DISCONNECTED: > connstate = -ECONNABORTED; > goto connected; .. >connected: > printk("%pI4:%u (event 0x%x)\n", > &conn->jc_remoteaddr.sin_addr.s_addr, > ntohs(conn->jc_remoteaddr.sin_port), > event->event << 11); > conn->jc_connstate = connstate; > wake_up_all(&conn->jc_connect_wait); > break; How quickly do you respond to the disconnect event? The remote side will wait until it receives a response or times out, which may be several seconds or minutes. - Sean -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html