On 08/03/2013 03:45, Nicholas A. Bellinger wrote:
+void
+isert_dump_ib_wc(struct ib_wc *wc)
+{
+ pr_debug("wc->wr_id: %llu\n", wc->wr_id);
+ pr_debug("wc->status: 0x%08x\n", wc->status);
This helper is called for a CQ completion with error, but when this
happens all the WC fields except for the wr_id and the status aren't
defined, so there's no point in dumping them (can be terribly misleading)
+ pr_debug("wc->opcode: 0x%08x\n", wc->opcode);
+ pr_debug("wc->vendor_err: 0x%08x\n", wc->vendor_err);
+ pr_debug("wc->byte_len: %u\n", wc->byte_len);
+ pr_debug("wc->qp: %p\n", wc->qp);
+ pr_debug("wc->src_qp: %u\n", wc->src_qp);
+ pr_debug("wc->wc_flags: 0x%08x\n", wc->wc_flags);
+ pr_debug("wc->pkey_index: %hu\n", wc->pkey_index);
+ pr_debug("wc->slid: %hu\n", wc->slid);
+ pr_debug("wc->sl: 0x%02x\n", wc->sl);
+ pr_debug("wc->dlid_path_bits: 0x%02x\n", wc->dlid_path_bits);
+ pr_debug("wc->port_num: 0x%02x\n", wc->port_num);
+}
+
+void
+iser_cq_tx_tasklet(unsigned long data)
+{
+ struct isert_conn *isert_conn = (struct isert_conn *)data;
+ struct ib_cq *tx_cq = isert_conn->conn_tx_cq;
+ struct iser_tx_desc *tx_desc;
+ struct ib_wc wc;
+
+ while (ib_poll_cq(tx_cq, 1, &wc) == 1) {
+ tx_desc = (struct iser_tx_desc *)(unsigned long)wc.wr_id;
+
+ if (wc.status == IB_WC_SUCCESS) {
+ isert_send_completion(tx_desc, isert_conn);
+ } else {
+ pr_debug("TX wc.status != IB_WC_SUCCESS
>>>>>>>>>>>>>>\n");
+ isert_dump_ib_wc(&wc);
+ atomic_dec(&isert_conn->post_send_buf_count);
+ isert_cq_comp_err(tx_desc, isert_conn);
+ }
+ }
+
+ ib_req_notify_cq(tx_cq, IB_CQ_NEXT_COMP);
+}
+
+void
+isert_cq_tx_callback(struct ib_cq *cq, void *context)
+{
+ struct isert_conn *isert_conn = context;
+
+ tasklet_schedule(&isert_conn->conn_tx_tasklet);
+}
+
+void
+iser_cq_rx_tasklet(unsigned long data)
+{
+ struct isert_conn *isert_conn = (struct isert_conn *)data;
+ struct ib_cq *rx_cq = isert_conn->conn_rx_cq;
+ struct iser_rx_desc *rx_desc;
+ struct ib_wc wc;
+ unsigned long xfer_len;
+
+ while (ib_poll_cq(rx_cq, 1, &wc) == 1) {
+ rx_desc = (struct iser_rx_desc *)(unsigned long)wc.wr_id;
+
+ if (wc.status == IB_WC_SUCCESS) {
+ xfer_len = (unsigned long)wc.byte_len;
+ isert_rx_completion(rx_desc, isert_conn, xfer_len);
+ } else {
+ pr_debug("RX wc.status != IB_WC_SUCCESS
>>>>>>>>>>>>>>\n");
+ if (wc.status != IB_WC_WR_FLUSH_ERR)
+ isert_dump_ib_wc(&wc);
+
+ isert_conn->post_recv_buf_count--;
+ isert_cq_comp_err(NULL, isert_conn);
+ }
+ }
+
+ ib_req_notify_cq(rx_cq, IB_CQ_NEXT_COMP);
+}
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html