Signed-off-by: Stefan Roscher <[EMAIL PROTECTED]> ---
diff -Nurp libehca_old/src/ehca_ureqs.c libehca_new/src/ehca_ureqs.c --- libehca_old/src/ehca_ureqs.c 2007-01-26 14:27:03.000000000 +0100 +++ libehca_new/src/ehca_ureqs.c 2007-01-26 14:27:43.000000000 +0100 @@ -38,25 +38,20 @@ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. - * - * $Id: ehca_ureqs.c,v 1.5 2006/03/26 22:26:54 nguyen Exp $ */ -#define DEB_PREFIX "reqs" - -#include "ehca_uclasses.h" +#include <errno.h> +#include <unistd.h> +#include <netinet/in.h> #include <infiniband/verbs.h> +#include "ehca_uclasses.h" #include "ehca_utools.h" #include "hipz_fns_core.h" #include "ehca_everbs.h" #include "ehca_asm.h" #include "ipzu_pt_fn.h" -#include <errno.h> -#include <unistd.h> -#include <netinet/in.h> - static inline int write_rwqe(struct ipzu_queue *ipz_rqueue, struct ehca_wqe *wqe_p, struct ibv_recv_wr *recv_wr) @@ -64,34 +59,35 @@ static inline int write_rwqe(struct ipzu u8 cnt_ds; if (unlikely((recv_wr->num_sge < 0) || (recv_wr->num_sge > ipz_rqueue->act_nr_of_sg))) { - EDEB_ERR(4, "Invalid number of WQE SGE. " - "num_sqe=%x max_nr_of_sg=%x", - recv_wr->num_sge, ipz_rqueue->act_nr_of_sg); - return (-EINVAL); /* invalid SG list length */ + ehca_gen_err("Invalid number of WQE SGE. " + "num_sqe=%x max_nr_of_sg=%x", + recv_wr->num_sge, ipz_rqueue->act_nr_of_sg); + return -EINVAL; /* invalid SG list length */ } clear_cacheline(wqe_p); - clear_cacheline((u8 *) wqe_p + 32); - clear_cacheline((u8 *) wqe_p + 64); + clear_cacheline((u8*)wqe_p + 32); + clear_cacheline((u8*)wqe_p + 64); wqe_p->work_request_id = be64_to_cpu(recv_wr->wr_id); wqe_p->nr_of_data_seg = recv_wr->num_sge; for (cnt_ds = 0; cnt_ds < recv_wr->num_sge; cnt_ds++) { wqe_p->u.all_rcv.sg_list[cnt_ds].vaddr = - be64_to_cpu(recv_wr->sg_list[cnt_ds].addr); + be64_to_cpu(recv_wr->sg_list[cnt_ds].addr); wqe_p->u.all_rcv.sg_list[cnt_ds].lkey = - ntohl(recv_wr->sg_list[cnt_ds].lkey); + ntohl(recv_wr->sg_list[cnt_ds].lkey); wqe_p->u.all_rcv.sg_list[cnt_ds].length = - ntohl(recv_wr->sg_list[cnt_ds].length); + ntohl(recv_wr->sg_list[cnt_ds].length); } - if (IS_EDEB_ON(7)) { - EDEB(7, "RECEIVE WQE written into ipz_rqueue=%p", ipz_rqueue); - EDEB_DMP(7, wqe_p, 16*(6 + wqe_p->nr_of_data_seg), "recv wqe"); + if (unlikely(libehca_trace_on)) { + ehca_gen_dbg("RECEIVE WQE written into ipz_rqueue=%p", + ipz_rqueue); + ehca_dmp_dbg(wqe_p, 16*(6 + wqe_p->nr_of_data_seg), "recv wqe"); } - return (0); + return 0; } static inline int write_swqe(struct ehcau_qp *qp, @@ -100,18 +96,18 @@ static inline int write_swqe(struct ehca { u32 idx; u64 dma_length; - struct ehcau_av *my_av = NULL; + struct ehcau_av *my_av; u32 remote_qkey = send_wr->wr.ud.remote_qkey; clear_cacheline(wqe_p); - clear_cacheline((u8 *) wqe_p + 32); + clear_cacheline((u8 *)wqe_p + 32); if (unlikely((send_wr->num_sge < 0) || (send_wr->num_sge > qp->ipz_squeue.act_nr_of_sg))) { - EDEB_ERR(4, "Invalid number of WQE SGE. " - "num_sqe=%x max_nr_of_sg=%x", - send_wr->num_sge, qp->ipz_rqueue.act_nr_of_sg); - return (-EINVAL); /* invalid SG list length */ + ehca_gen_err("Invalid number of WQE SGE. " + "num_sqe=%x max_nr_of_sg=%x", + send_wr->num_sge, qp->ipz_rqueue.act_nr_of_sg); + return -EINVAL; /* invalid SG list length */ } wqe_p->work_request_id = be64_to_cpu(send_wr->wr_id); @@ -129,16 +125,16 @@ static inline int write_swqe(struct ehca wqe_p->optype = WQE_OPTYPE_RDMAREAD; break; default: - EDEB_ERR(4, "Invalid opcode=%x", send_wr->opcode); - return (-EINVAL); /* invalid opcode */ + ehca_gen_err("Invalid opcode=%x", send_wr->opcode); + return -EINVAL; /* invalid opcode */ } wqe_p->wqef = (send_wr->opcode) & 0xF0; wqe_p->wr_flag = 0; - if (send_wr->send_flags & IBV_SEND_SIGNALED) { + if (send_wr->send_flags & IBV_SEND_SIGNALED) wqe_p->wr_flag |= WQE_WRFLAG_REQ_SIGNAL_COM; - } + if (send_wr->opcode == IBV_WR_SEND_WITH_IMM || send_wr->opcode == IBV_WR_RDMA_WRITE_WITH_IMM) { @@ -152,71 +148,70 @@ static inline int write_swqe(struct ehca switch (qp->qp_type) { case IBV_QPT_UD: /* IB 1.2 spec C10-15 compliance */ - if (send_wr->wr.ud.remote_qkey & 0x80000000) { + if (send_wr->wr.ud.remote_qkey & 0x80000000) remote_qkey = qp->qkey; - } wqe_p->destination_qp_number = - ntohl(send_wr->wr.ud.remote_qpn << 8); + ntohl(send_wr->wr.ud.remote_qpn << 8); wqe_p->local_ee_context_qkey = ntohl(remote_qkey); - if (send_wr->wr.ud.ah==NULL) { - EDEB_ERR(4, "wr.ud.ah is NULL. qp=%p", qp); - return (-EINVAL); + if (!send_wr->wr.ud.ah) { + ehca_gen_err("wr.ud.ah is NULL. qp=%p", qp); + return -EINVAL; } my_av = container_of(send_wr->wr.ud.ah, struct ehcau_av, ib_ah); wqe_p->u.ud_av.ud_av = my_av->av; /* omitted check of IBV_SEND_INLINE - since HW does not support it */ + * since HW does not support it + */ for (idx = 0; idx < send_wr->num_sge; idx++) { wqe_p->u.ud_av.sg_list[idx].vaddr = - be64_to_cpu(send_wr->sg_list[idx].addr); + be64_to_cpu(send_wr->sg_list[idx].addr); wqe_p->u.ud_av.sg_list[idx].lkey = - ntohl(send_wr->sg_list[idx].lkey); + ntohl(send_wr->sg_list[idx].lkey); wqe_p->u.ud_av.sg_list[idx].length = - ntohl(send_wr->sg_list[idx].length); + ntohl(send_wr->sg_list[idx].length); } /* eof for idx */ break; case IBV_QPT_UC: - if (send_wr->send_flags & IBV_SEND_FENCE) { + if (send_wr->send_flags & IBV_SEND_FENCE) wqe_p->wr_flag |= WQE_WRFLAG_FENCE; - } - /* no break is intential here */ + /* no break is intentional here */ case IBV_QPT_RC: /*@@TODO atomic???*/ wqe_p->u.nud.remote_virtual_adress = - be64_to_cpu(send_wr->wr.rdma.remote_addr); + be64_to_cpu(send_wr->wr.rdma.remote_addr); wqe_p->u.nud.rkey = ntohl(send_wr->wr.rdma.rkey); /* omitted checking of IBV_SEND_INLINE - since HW does not support it */ + * since HW does not support it + */ dma_length = 0; for (idx = 0; idx < send_wr->num_sge; idx++) { wqe_p->u.nud.sg_list[idx].vaddr = - be64_to_cpu(send_wr->sg_list[idx].addr); + be64_to_cpu(send_wr->sg_list[idx].addr); wqe_p->u.nud.sg_list[idx].lkey = - ntohl(send_wr->sg_list[idx].lkey); + ntohl(send_wr->sg_list[idx].lkey); wqe_p->u.nud.sg_list[idx].length = - ntohl(send_wr->sg_list[idx].length); + ntohl(send_wr->sg_list[idx].length); dma_length += send_wr->sg_list[idx].length; } /* eof idx */ wqe_p->u.nud.atomic_1st_op_dma_len = be64_to_cpu(dma_length); - break; - default: - EDEB_ERR(4, "Invalid qptype=%x", qp->qp_type); - return (-EINVAL); + ehca_gen_err("Invalid qptype=%x", qp->qp_type); + return -EINVAL; } - if (IS_EDEB_ON(7)) { - EDEB(7, "SEND WQE written into queue qp=%p ", qp); - EDEB_DMP(7, wqe_p, 16*(6 + wqe_p->nr_of_data_seg), "send wqe"); + if (unlikely(libehca_trace_on)) { + ehca_gen_dbg("SEND WQE written into queue qp=%p ", qp); + ehca_dmp_dbg(wqe_p, 16 * (6 + wqe_p->nr_of_data_seg), + "send wqe"); } - return (0); + return 0; } -/** +/* * map_ib_wc_status - convert cqe_status to ib_wc_status */ static inline void map_ib_wc_status(u32 cqe_status, @@ -251,7 +246,8 @@ static inline void map_ib_wc_status(u32 switch ((cqe_status & 0x0000F800) >> 11) { case 0x0: /* PSN Sequence Error! - couldn't find a matching VAPI status! */ + * couldn't find a matching VAPI status! + */ *wc_status = IBV_WC_GENERAL_ERR; break; case 0x1: @@ -297,44 +293,49 @@ static inline void map_ib_wc_status(u32 *wc_status = IBV_WC_FATAL_ERR; } - } else { + } else *wc_status = IBV_WC_SUCCESS; - } } int ehcau_post_send(struct ibv_qp *qp, struct ibv_send_wr *send_wr, struct ibv_send_wr **bad_send_wr) { - struct ehcau_qp *my_qp = NULL; - struct ibv_send_wr *cur_send_wr = NULL; - struct ehca_wqe *wqe_p = NULL; + struct ehcau_qp *my_qp; + struct ibv_send_wr *cur_send_wr; + struct ehca_wqe *wqe_p; int wqe_cnt = 0; int retcode = 0; - EHCA_CHECK_ADR(qp); + if (!qp) { + ehca_gen_err("qp=%p check failed line %i", qp, __LINE__); + return -EFAULT; + } my_qp = container_of(qp, struct ehcau_qp, ib_qp); - EHCA_CHECK_QP(my_qp); - EHCA_CHECK_ADR(send_wr); - EDEB_EN(7, "ehcau_qp=%p qp_num=%x send_wr=%p bad_send_wr=%p", - my_qp, qp->qp_num, send_wr, bad_send_wr); + if (!send_wr) { + ehca_gen_err("send_wr=%p check failed line %i", + send_wr, __LINE__); + return -EFAULT; + } + ehca_dbg(qp->context->device, "ehcau_qp=%p qp_num=%x send_wr=%p " + "bad_send_wr=%p", my_qp, qp->qp_num, send_wr, bad_send_wr); /* LOCK the QUEUE */ ehcau_lock(&my_qp->lockvar_s); /* loop processes list of send reqs */ - for (cur_send_wr = send_wr; cur_send_wr != NULL; + for (cur_send_wr = send_wr; cur_send_wr; cur_send_wr = cur_send_wr->next) { void *start_addr = my_qp->ipz_squeue.current_q_addr; /* get pointer next to free WQE */ wqe_p = ipzu_qeit_get_inc(&my_qp->ipz_squeue); - if (unlikely(wqe_p == NULL)) { + if (unlikely(!wqe_p)) { /* too many posted work requests: queue overflow */ - if (bad_send_wr != NULL) { + if (bad_send_wr) *bad_send_wr = cur_send_wr; - } - if (wqe_cnt==0) { + if (!wqe_cnt) { retcode = -ENOMEM; - EDEB_ERR(4, "Too many posted WQEs qp_num=%x", + ehca_err(qp->context->device, + "Too many posted WQEs qp_num=%x", qp->qp_num); } goto post_send_exit0; @@ -342,20 +343,22 @@ int ehcau_post_send(struct ibv_qp *qp, /* write a SEND WQE into the QUEUE */ retcode = write_swqe(my_qp, wqe_p, cur_send_wr); /* if something failed, reset the - free entry pointer to the start value */ - if (unlikely(retcode != 0)) { + * free entry pointer to the start value + */ + if (unlikely(retcode)) { my_qp->ipz_squeue.current_q_addr = start_addr; *bad_send_wr = cur_send_wr; - if (wqe_cnt==0) { + if (!wqe_cnt) { retcode = -EINVAL; - EDEB_ERR(4, "Could not write WQE qp_num=%x", + ehca_err(qp->context->device, + "Could not write WQE qp_num=%x", qp->qp_num); } goto post_send_exit0; } wqe_cnt++; - EDEB(7, "ehca_qp=%p qp_num=%x wqe_cnt=%d", - my_qp, qp->qp_num, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp=%p qp_num=%x wqe_cnt=%d", + my_qp, qp->qp_num, wqe_cnt); } /* eof for cur_send_wr */ post_send_exit0: @@ -363,8 +366,8 @@ int ehcau_post_send(struct ibv_qp *qp, ehcau_unlock(&my_qp->lockvar_s); asm_sync_mem(); /* serialize GAL register access */ hipz_update_SQA(my_qp, wqe_cnt); - EDEB_EX(7, "ehca_qp=%p qp_num=%x ret=%x wqe_cnt=%d", - my_qp, qp->qp_num, retcode, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp=%p qp_num=%x ret=%x wqe_cnt=%d", + my_qp, qp->qp_num, retcode, wqe_cnt); return retcode; } @@ -372,36 +375,43 @@ int ehcau_post_recv(struct ibv_qp *qp, struct ibv_recv_wr *recv_wr, struct ibv_recv_wr **bad_recv_wr) { - struct ehcau_qp *my_qp = NULL; - struct ibv_recv_wr *cur_recv_wr = NULL; - struct ehca_wqe *wqe_p = NULL; + struct ehcau_qp *my_qp; + struct ibv_recv_wr *cur_recv_wr; + struct ehca_wqe *wqe_p; int wqe_cnt = 0; int retcode = 0; - EHCA_CHECK_ADR(qp); + if (!qp) { + ehca_gen_err("qp=%p check failed line %i", qp, __LINE__); + return -EFAULT; + } my_qp = container_of(qp, struct ehcau_qp, ib_qp); - EHCA_CHECK_QP(my_qp); - EHCA_CHECK_ADR(recv_wr); - EDEB_EN(7, "ehca_qp=%p qp_num=%x recv_wr=%p bad_recv_wr=%p", - my_qp, qp->qp_num, recv_wr, bad_recv_wr); + if (!recv_wr) { + ehca_gen_err("recv_wr=%p check failed line %i", + recv_wr, __LINE__); + return -EFAULT; + } + ehca_dbg(qp->context->device, + "ehca_qp=%p qp_num=%x recv_wr=%p bad_recv_wr=%p", + my_qp, qp->qp_num, recv_wr, bad_recv_wr); /* LOCK the QUEUE */ ehcau_lock(&my_qp->lockvar_r); /* loop processes list of send reqs */ - for (cur_recv_wr = recv_wr; cur_recv_wr != NULL; + for (cur_recv_wr = recv_wr; cur_recv_wr; cur_recv_wr = cur_recv_wr->next) { void *start_addr = my_qp->ipz_rqueue.current_q_addr; /* get pointer next to free WQE */ wqe_p = ipzu_qeit_get_inc(&my_qp->ipz_rqueue); - if (unlikely(wqe_p == NULL)) { + if (unlikely(!wqe_p)) { /* too many posted work requests: queue overflow */ - if (bad_recv_wr != NULL) { + if (bad_recv_wr) *bad_recv_wr = cur_recv_wr; - } - if (wqe_cnt==0) { + if (!wqe_cnt) { retcode = -ENOMEM; - EDEB_ERR(4, "Too many posted WQEs qp_num=%x", + ehca_err(qp->context->device, + "Too many posted WQEs qp_num=%x", qp->qp_num); } goto post_recv_exit0; @@ -409,20 +419,22 @@ int ehcau_post_recv(struct ibv_qp *qp, /* write a RECV WQE into the QUEUE */ retcode = write_rwqe(&my_qp->ipz_rqueue, wqe_p, cur_recv_wr); /* if something failed, reset the - free entry pointer to the start value */ - if (unlikely(retcode != 0)) { + * free entry pointer to the start value + */ + if (unlikely(retcode)) { my_qp->ipz_rqueue.current_q_addr = start_addr; *bad_recv_wr = cur_recv_wr; - if (wqe_cnt==0) { + if (!wqe_cnt) { retcode = -EINVAL; - EDEB_ERR(4, "Could not write WQE qp_num=%x", + ehca_err(qp->context->device, + "Could not write WQE qp_num=%x", qp->qp_num); } goto post_recv_exit0; } wqe_cnt++; - EDEB(7, "ehca_qp=%p qp_num=%x wqe_cnt=%d", - my_qp, qp->qp_num, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp=%p qp_num=%x wqe_cnt=%d", + my_qp, qp->qp_num, wqe_cnt); } /* eof for cur_recv_wr */ post_recv_exit0: @@ -430,98 +442,109 @@ int ehcau_post_recv(struct ibv_qp *qp, ehcau_unlock(&my_qp->lockvar_r); asm_sync_mem(); /* serialize GAL register access */ hipz_update_RQA(my_qp, wqe_cnt); - EDEB_EX(7, "ehca_qp=%p qp_num=%x ret=%x wqe_cnt=%d", - my_qp, qp->qp_num, retcode, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp=%p qp_num=%x ret=%x wqe_cnt=%d", + my_qp, qp->qp_num, retcode, wqe_cnt); return retcode; } -/** +/* * Table converts ehca wc opcode to ib * Since we use zero to indicate invalid opcode, the actual ib opcode must * be decremented!!! */ static const u8 ib_wc_opcode[255] = { - [0x00] = 1, /* for daqp optype is always zero */ - [0x01] = IBV_WC_RECV+1, - [0x02] = IBV_WC_RECV_RDMA_WITH_IMM+1, - [0x04] = IBV_WC_BIND_MW+1, - [0x08] = IBV_WC_FETCH_ADD+1, - [0x10] = IBV_WC_COMP_SWAP+1, - [0x20] = IBV_WC_RDMA_WRITE+1, - [0x40] = IBV_WC_RDMA_READ+1, - [0x80] = IBV_WC_SEND+1 + [0x00] = 1, /* for daqp optype is always zero */ + [0x01] = IBV_WC_RECV + 1, + [0x02] = IBV_WC_RECV_RDMA_WITH_IMM + 1, + [0x04] = IBV_WC_BIND_MW + 1, + [0x08] = IBV_WC_FETCH_ADD + 1, + [0x10] = IBV_WC_COMP_SWAP + 1, + [0x20] = IBV_WC_RDMA_WRITE + 1, + [0x40] = IBV_WC_RDMA_READ + 1, + [0x80] = IBV_WC_SEND + 1 }; -/** @brief internal function to poll one entry of cq - */ +/* internal function to poll one entry of cq */ static inline int ehca_poll_cq_one(struct ibv_cq *cq, struct ibv_wc *wc) { int retcode = 0; struct ehcau_cq *my_cq = container_of(cq, struct ehcau_cq, ib_cq); - struct ehca_cqe *cqe = NULL; + struct ehca_cqe *cqe; int cqe_count = 0; - EDEB_EN(7, "ehca_cq=%p cq_num=%x wc=%p", my_cq, my_cq->cq_number, wc); + ehca_dbg(cq->context->device, "ehca_cq=%p cq_num=%x wc=%p", + my_cq, my_cq->cq_number, wc); - poll_cq_one_read_cqe: +poll_cq_one_read_cqe: cqe = (struct ehca_cqe *)ipzu_qeit_get_inc_valid(&my_cq->ipz_queue); - if (cqe == NULL) { + if (!cqe) { retcode = -EAGAIN; - EDEB(7, "Completion queue is empty ehca_cq=%p cq_num=%x " - "retcode=%x", my_cq, my_cq->cq_number, retcode); + ehca_dbg(cq->context->device, + "Completion queue is empty ehca_cq=%p cq_num=%x " + "retcode=%x", my_cq, my_cq->cq_number, retcode); goto poll_cq_one_exit0; } + + /* prevents loads being reordered across this point */ + lwsync(); + cqe_count++; if (unlikely(cqe->status & 0x10)) { /* purge bit set */ - struct ehcau_qp *qp=ehca_cq_get_qp(my_cq, cqe->local_qp_number); - int purgeflag = 0; - if (qp==NULL) { /* should not happen */ - EDEB_ERR(4, "cq_num=%x qp_num=%x " + struct ehcau_qp *qp = ehca_cq_get_qp(my_cq, + cqe->local_qp_number); + int purgeflag; + if (!qp) { /* should not happen */ + ehca_err(cq->context->device, "cq_num=%x qp_num=%x " "could not find qp -> ignore cqe", my_cq->cq_number, cqe->local_qp_number); - EDEB_DMP(4, cqe, 64, "cq_num=%x qp_num=%x", - my_cq->cq_number, cqe->local_qp_number); + ehca_dmp_err(cqe, 64, "cq_num=%x qp_num=%x", + my_cq->cq_number, cqe->local_qp_number); /* ignore this purged cqe */ goto poll_cq_one_read_cqe; } ehcau_lock(&qp->lockvar_s); purgeflag = qp->sqerr_purgeflag; ehcau_unlock(&qp->lockvar_s); - if (purgeflag!=0) { - EDEB(6, "Got CQE with purged bit qp_num=%x src_qp=%x", - cqe->local_qp_number, cqe->remote_qp_number); - EDEB_DMP(6, cqe, 64, "qp_num=%x src_qp=%x", + if (purgeflag) { + ehca_dbg(cq->context->device, + "Got CQE with purged bit qp_num=%x src_qp=%x", cqe->local_qp_number, cqe->remote_qp_number); + ehca_dmp_dbg(cqe, 64, "qp_num=%x src_qp=%x", + cqe->local_qp_number, + cqe->remote_qp_number); /* ignore this to avoid double cqes of bad wqe - that caused sqe and turn off purge flag */ + * that caused sqe and turn off purge flag + */ qp->sqerr_purgeflag = 0; goto poll_cq_one_read_cqe; } } /* tracing cqe */ - if (IS_EDEB_ON(7)) { - EDEB(7, "Received COMPLETION ehca_cq=%p cq_num=%x -----", - my_cq, my_cq->cq_number); - EDEB_DMP(7, cqe, 64, "ehca_cq=%p cq_num=%x", + if (unlikely(libehca_trace_on)) { + ehca_dbg(cq->context->device, + "Received COMPLETION ehca_cq=%p cq_num=%x -----", + my_cq, my_cq->cq_number); + ehca_dmp_dbg(cqe, 64, "ehca_cq=%p cq_num=%x", + my_cq, my_cq->cq_number); + ehca_dbg(cq->context->device, + "ehca_cq=%p cq_num=%x -------------------------", my_cq, my_cq->cq_number); - EDEB(7, "ehca_cq=%p cq_num=%x -------------------------", - my_cq, my_cq->cq_number); } /* we got a completion! */ wc->wr_id = cqe->work_request_id; /* eval ib_wc_opcode */ - wc->opcode = ib_wc_opcode[cqe->optype]-1; + wc->opcode = ib_wc_opcode[cqe->optype] - 1; if (unlikely(wc->opcode == -1)) { /* no error code required, but do trace out */ - EDEB_ERR(4, "Invalid cqe->OPType=%x cqe->status=%x " - "ehca_cq=%p cq_num=%x", + ehca_err(cq->context->device, "Invalid cqe->OPType=%x " + "cqe->status=%x ehca_cq=%p cq_num=%x", cqe->optype, cqe->status, my_cq, my_cq->cq_number); /* dump cqe for other infos */ - EDEB_DMP(4, cqe, 64, "ehca_cq=%p cq_num=%x", - my_cq, my_cq->cq_number); + ehca_dmp_err(cqe, 64, "ehca_cq=%p cq_num=%x", + my_cq, my_cq->cq_number); /* update also queue adder to throw away this entry!!! */ goto poll_cq_one_exit0; } @@ -530,9 +553,8 @@ static inline int ehca_poll_cq_one(struc if (unlikely(cqe->status & 0x80000000)) { /* complete with errors */ map_ib_wc_status(cqe->status, &wc->status); wc->vendor_err = wc->status; - } else { + } else wc->status = IBV_WC_SUCCESS; - } wc->qp_num = cqe->local_qp_number; wc->byte_len = cqe->nr_bytes_transferred; @@ -544,191 +566,224 @@ static inline int ehca_poll_cq_one(struc wc->imm_data = cqe->immediate_data; wc->sl = cqe->service_level; - poll_cq_one_exit0: - if (cqe_count>0) { +poll_cq_one_exit0: + if (cqe_count > 0) hipz_update_FECA(my_cq, cqe_count); - } - EDEB_EX(7, "retcode=%x ehca_cq=%p cq_number=%x wc=%p " - "status=%x opcode=%x qp_num=%x byte_len=%x", - retcode, my_cq, my_cq->cq_number, wc, wc->status, - wc->opcode, wc->qp_num, wc->byte_len); - return (retcode); + ehca_dbg(cq->context->device, "retcode=%x ehca_cq=%p cq_number=%x " + "wc=%p status=%x opcode=%x qp_num=%x byte_len=%x", + retcode, my_cq, my_cq->cq_number, wc, wc->status, + wc->opcode, wc->qp_num, wc->byte_len); + return retcode; } int ehcau_poll_cq(struct ibv_cq *cq, int num_entries, struct ibv_wc *wc) { - EHCA_CHECK_CQ(cq); - EHCA_CHECK_ADR(wc); + if (!cq) { + ehca_gen_err("cq=%p check failed line %i", cq, __LINE__); + return -EFAULT; + } + if (!wc) { + ehca_gen_err("wc=%p check failed line %i", wc, __LINE__); + return -EFAULT; + } int retcode = 0; struct ehcau_cq *my_cq = container_of(cq, struct ehcau_cq, ib_cq); - EHCA_CHECK_CQ(my_cq); if (num_entries < 1) { - EDEB_ERR(4, "ehcau_cq=%p, invalid num_entries=%d", - my_cq, num_entries); + ehca_err(cq->context->device, "ehcau_cq=%p, " + "invalid num_entries=%d", my_cq, num_entries); return -EINVAL; } - EDEB_EN(7, "ehcau_cq=%p num_entries=%d wc=%p", my_cq, num_entries, wc); + ehca_dbg(cq->context->device, "ehcau_cq=%p num_entries=%d wc=%p", + my_cq, num_entries, wc); int nr = 0; struct ibv_wc *current_wc = wc; ehcau_lock(&my_cq->lockvar); for (nr = 0; nr < num_entries; nr++) { retcode = ehca_poll_cq_one(cq, current_wc); - if (0 != retcode) { + if (retcode) break; - } current_wc++; } /* eof for nr */ ehcau_unlock(&my_cq->lockvar); - if (-EAGAIN == retcode || 0 == retcode) { + if (retcode == -EAGAIN || !retcode) retcode = nr; - } - EDEB_EX(7, "retcode=%x cq_number=%x wc=%p nr_entries=%d", - retcode, my_cq->cq_number, wc, nr); - return (retcode); + ehca_dbg(cq->context->device, "retcode=%x cq_number=%x wc=%p " + "nr_entries=%d", retcode, my_cq->cq_number, wc, nr); + return retcode; } int ehcau_req_notify_cq(struct ibv_cq *cq, int solicited) { - int retcode = 0; - struct ehcau_cq *my_cq = NULL; + struct ehcau_cq *my_cq; - EHCA_CHECK_CQ(cq); + if (!cq) { + ehca_gen_err("cq=%p check failed line %i", cq, __LINE__); + return -EFAULT; + } my_cq = container_of(cq, struct ehcau_cq, ib_cq); - EHCA_CHECK_CQ(my_cq); - EDEB_EN(7, "ehcau_cq=%p solicited=%x", my_cq, solicited); + ehca_dbg(cq->context->device, "ehcau_cq=%p solicited=%x", + my_cq, solicited); - if (solicited != 0) { /* IB_CQ_SOLICITED */ + if (solicited) /* IB_CQ_SOLICITED */ hipz_set_CQx_N0(my_cq, 1); - } else { /* IB_CQ_NEXT_COMP */ + else /* IB_CQ_NEXT_COMP */ hipz_set_CQx_N1(my_cq, 1); - } - EDEB_EX(7, "ehcau_cq=%p retcode=%x", cq, retcode); - - return (retcode); + ehca_dbg(cq->context->device, "ehcau_cq=%p", cq); + return 0; } int ehcau_send_wr_trigger(struct ibv_qp *qp, int wqe_count) { - struct ehcau_qp *my_qp = NULL; + struct ehcau_qp *my_qp; - EHCA_CHECK_ADR(qp); + if (!qp) { + ehca_gen_err("qp=%p check failed line %i", qp, __LINE__); + return -EFAULT; + } my_qp = container_of(qp, struct ehcau_qp, ib_qp); - EHCA_CHECK_QP(my_qp); - EDEB_EN(7, "ehca_qp=%p wqe_count=%x", my_qp, wqe_count); + ehca_dbg(qp->context->device, "ehca_qp=%p wqe_count=%x", + my_qp, wqe_count); asm_sync_mem(); /* serialize GAL register access */ hipz_update_SQA(my_qp, wqe_count); - EDEB_EX(7, "ehca_qp=%p wqe_count=%x", my_qp, wqe_count); + ehca_dbg(qp->context->device, "ehca_qp=%p wqe_count=%x", + my_qp, wqe_count); return 0; } int ehcau_recv_wr_trigger(struct ibv_qp *qp, int wqe_count) { - struct ehcau_qp *my_qp = NULL; + struct ehcau_qp *my_qp; - EHCA_CHECK_ADR(qp); + if (!qp) { + ehca_gen_err("qp=%p check failed line %i", qp, __LINE__); + return -EFAULT; + } my_qp = container_of(qp, struct ehcau_qp, ib_qp); - EHCA_CHECK_QP(my_qp); - EDEB_EN(7, "ehca_qp=%p wqe_count=%x", my_qp, wqe_count); + ehca_dbg(qp->context->device, "ehca_qp=%p wqe_count=%x", + my_qp, wqe_count); asm_sync_mem(); /* serialize GAL register access */ hipz_update_RQA(my_qp, wqe_count); - EDEB_EX(7, "ehca_qp=%p wqe_count=%x", my_qp, wqe_count); + ehca_dbg(qp->context->device, "ehca_qp=%p wqe_count=%x", + my_qp, wqe_count); return 0; } int ehcau_write_swqe(void *wqe, struct ibv_qp *qp, struct ibv_send_wr *send_wr, struct ibv_send_wr **bad_wr) { - struct ehcau_qp *my_qp = NULL; - int retcode = 0; - struct ibv_send_wr *cur_send_wr = NULL; + struct ehcau_qp *my_qp; + int retcode; + struct ibv_send_wr *cur_send_wr; int wqe_cnt = 0; - struct ehca_wqe *wqe_p = NULL; + struct ehca_wqe *wqe_p; - EHCA_CHECK_ADR(qp); + if (!qp) { + ehca_gen_err("qp=%p check failed line %i", qp, __LINE__); + return -EFAULT; + } my_qp = container_of(qp, struct ehcau_qp, ib_qp); - EHCA_CHECK_QP(my_qp); - EHCA_CHECK_QP(wqe); - EHCA_CHECK_ADR(send_wr); + if (!wqe) { + ehca_gen_err("wqe=%p check failed line %i", wqe, __LINE__); + return -EFAULT; + } + if (!send_wr) { + ehca_gen_err("send_wr=%p check failed line %i", + send_wr, __LINE__); + return -EFAULT; + } - EDEB_EN(7, "ehcau_qp=%p wqe=%p send_wr=%p bad_wr=%p", - my_qp, wqe, send_wr, bad_wr); + ehca_dbg(qp->context->device, "ehcau_qp=%p wqe=%p send_wr=%p bad_wr=%p", + my_qp, wqe, send_wr, bad_wr); /* LOCK the QUEUE */ ehcau_lock(&my_qp->lockvar_s); /* loop processes list of send reqs */ wqe_p = (struct ehca_wqe*)wqe; - for (cur_send_wr = send_wr; cur_send_wr != NULL; + for (cur_send_wr = send_wr; cur_send_wr; cur_send_wr = cur_send_wr->next) { /* write a SEND WQE into the QUEUE */ retcode = write_swqe(my_qp, wqe_p, cur_send_wr); /* if something failed, leave loop */ - if (unlikely(retcode != 0)) { + if (unlikely(retcode)) { *bad_wr = cur_send_wr; break; } wqe_cnt++; wqe_p++; - EDEB(7, "ehca_qp %p wqe_cnt %d", my_qp, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp %p wqe_cnt %d", + my_qp, wqe_cnt); } /* eof for cur_send_wr */ retcode = wqe_cnt; /* UNLOCK the QUEUE */ ehcau_unlock(&my_qp->lockvar_s); - EDEB_EX(7, "ehca_qp=%p ret=%x wqe_cnt=%d", my_qp, retcode, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp=%p ret=%x wqe_cnt=%d", + my_qp, retcode, wqe_cnt); return retcode; } int ehcau_write_rwqe(void *wqe, struct ibv_qp *qp, struct ibv_recv_wr *recv_wr, struct ibv_recv_wr **bad_wr) { - struct ehcau_qp *my_qp = NULL; - int retcode = 0; - struct ibv_recv_wr *cur_recv_wr = NULL; + struct ehcau_qp *my_qp; + int retcode; + struct ibv_recv_wr *cur_recv_wr; int wqe_cnt = 0; - struct ehca_wqe *wqe_p = NULL; + struct ehca_wqe *wqe_p; - EHCA_CHECK_ADR(qp); + if (!qp) { + ehca_gen_err("qp=%p check failed line %i", qp, __LINE__); + return -EFAULT; + } my_qp = container_of(qp, struct ehcau_qp, ib_qp); - EHCA_CHECK_QP(my_qp); - EHCA_CHECK_ADR(wqe); - EHCA_CHECK_ADR(recv_wr); + if (!wqe) { + ehca_gen_err("wqe=%p check failed line %i", wqe, __LINE__); + return -EFAULT; + } + if (!recv_wr) { + ehca_gen_err("recv_wr=%p check failed line %i", + recv_wr, __LINE__); + return -EFAULT; + } - EDEB_EN(7, "ehca_qp=%p wqe=%p recv_wr=%p bad_wr=%p", - my_qp, wqe, recv_wr, bad_wr); + ehca_dbg(qp->context->device, "ehca_qp=%p wqe=%p recv_wr=%p bad_wr=%p", + my_qp, wqe, recv_wr, bad_wr); /* LOCK the QUEUE */ ehcau_lock(&my_qp->lockvar_r); /* loop processes list of send reqs */ wqe_p = (struct ehca_wqe*)wqe; - for (cur_recv_wr = recv_wr; cur_recv_wr != NULL; + for (cur_recv_wr = recv_wr; cur_recv_wr; cur_recv_wr = cur_recv_wr->next) { /* write a RECV WQE into the QUEUE */ retcode = write_rwqe(&my_qp->ipz_rqueue, wqe_p, cur_recv_wr); /* if something failed, leave loop */ - if (unlikely(retcode != 0)) { + if (unlikely(retcode)) { *bad_wr = cur_recv_wr; break; } wqe_cnt++; wqe_p++; - EDEB(7, "ehca_qp %p wqe_cnt %d", my_qp, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp %p wqe_cnt %d", + my_qp, wqe_cnt); } /* eof for cur_recv_wr */ retcode = wqe_cnt; /* UNLOCK the QUEUE */ ehcau_unlock(&my_qp->lockvar_r); - EDEB_EX(7, "ehca_qp=%p ret=%x wqe_cnt=%d", my_qp, retcode, wqe_cnt); + ehca_dbg(qp->context->device, "ehca_qp=%p ret=%x wqe_cnt=%d", + my_qp, retcode, wqe_cnt); return retcode; } _______________________________________________ openib-general mailing list openib-general@openib.org http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general