>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

Reply via email to