···320320 * that these values remain available after the ib_post_send() call.321321 * In some error flow cases, svc_rdma_wc_send() releases @ctxt.322322 *323323- * Returns zero if the Send WR was posted successfully. Otherwise, a324324- * negative errno is returned.323323+ * Return values:324324+ * %0: @ctxt's WR chain was posted successfully325325+ * %-ENOTCONN: The connection was lost325326 */326327int svc_rdma_send(struct svcxprt_rdma *rdma, struct svc_rdma_send_ctxt *ctxt)327328{···339338 DMA_TO_DEVICE);340339341340 /* If the SQ is full, wait until an SQ entry is available */342342- while (1) {341341+ while (!test_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags)) {343342 if ((atomic_dec_return(&rdma->sc_sq_avail) < 0)) {344343 svc_rdma_wake_send_waiters(rdma, 1);344344+345345+ /* When the transport is torn down, assume346346+ * ib_drain_sq() will trigger enough Send347347+ * completions to wake us. The XPT_CLOSE test348348+ * above should then cause the while loop to349349+ * exit.350350+ */345351 percpu_counter_inc(&svcrdma_stat_sq_starve);346352 trace_svcrdma_sq_full(rdma, &cid);347353 wait_event(rdma->sc_send_wait,348354 atomic_read(&rdma->sc_sq_avail) > 0);349349- if (test_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags))350350- return -ENOTCONN;351355 trace_svcrdma_sq_retry(rdma, &cid);352356 continue;353357 }354358355359 trace_svcrdma_post_send(ctxt);356360 ret = ib_post_send(rdma->sc_qp, wr, NULL);357357- if (ret)361361+ if (ret) {362362+ trace_svcrdma_sq_post_err(rdma, &cid, ret);363363+ svc_xprt_deferred_close(&rdma->sc_xprt);364364+ svc_rdma_wake_send_waiters(rdma, 1);358365 break;366366+ }359367 return 0;360368 }361361-362362- trace_svcrdma_sq_post_err(rdma, &cid, ret);363363- svc_xprt_deferred_close(&rdma->sc_xprt);364364- svc_rdma_wake_send_waiters(rdma, 1);365365- return ret;369369+ return -ENOTCONN;366370}367371368372/**