IB/ehca: New features and fixes for 2.6.24
cover IB/ehca: New features and fixes for 2.6.24
Here are some fresh eHCA driver features and fixes for your reviewing pleasure. They have passed internal testing and checkpatch.pl, so we think they are ready for inclusion.
[01/12] adds userspace support for small QPs
[02/12] changes a nit in firmware communication
[03/12] adds support for more than 4096 QPs/CQs in user space [04/12] enables mapping firmware contexts into uspace on 64K-page kernels [05/12] changes hvCall debug trace formatting
[06/12] outputs return codes as signed decimal integers [07/12] makes warnings also appear in non-debug mode, like they should [08/12] replaces get_paca()->paca_index by the portable smp_processor_id() [09/12] checks the allowed max number of SGEs when creating a QP [10/12] fixes some Path Migration problems
[11/12] works around a firmware race condition
[12/12] bumps the driver's version number
The patches should apply cleanly, in order, against Roland's git. Please review the changes and apply the patches for 2.6.24 if they are okay.
Regards,
Joachim
=2D-=20
Joachim Fenkes =A0-- =A0eHCA Linux Driver Developer and Hardware Tamer IBM Deutschland Entwicklung GmbH =A0-- =A0Dept. 3627 (I/O Firmware Dev. 2) Schoenaicher Strasse 220 =A0-- =A071032 Boeblingen =A0-- =A0Germany
eMail: [email protected]
PATCH 1/12 IB/ehca: Small QP userspace support
From: Stefan Roscher <[email protected]>
--- drivers/infiniband/hw/ehca/ehca_qp.c | 7 +++---- drivers/infiniband/hw/ehca/ipz_pt_fn.c | 1 + 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/infiniband/hw/ehca/ehca_qp.c +3 -4
@@ -273,6 +273,7 @@ static inline void queue2resp(struct ipzu_queue_resp *resp, resp->queue_length = queue->queue_length; resp->pagesize = queue->pagesize; resp->toggle_state = queue->toggle_state; + resp->offset = queue->offset; }/*
@@ -598,8 +599,7 @@ static struct ehca_qp *internal_create_qp( parms.squeue.max_sge = max_send_sge; parms.rqueue.max_sge = max_recv_sge; -if (EHCA_BMASK_GET (HCA_CAP_MINI_QP , shca->hca_cap) - && !(context && udata)) {/* no small QP support in userspace ATM */ +if (EHCA_BMASK_GET (HCA_CAP_MINI_QP , shca->hca_cap)) {if (HAS_SQ (my_qp))ehca_determine_small_queue ( &parms.squeue, max_send_sge, is_llqp);
@@ -741,8 +741,7 @@ static struct ehca_qp *internal_create_qp( resp.ext_type = my_qp->ext_type; resp.qkey = my_qp->qkey; resp.real_qp_num = my_qp->real_qp_num; - resp.ipz_rqueue.offset = my_qp->ipz_rqueue.offset; - resp.ipz_squeue.offset = my_qp->ipz_squeue.offset; +if (HAS_SQ (my_qp))queue2resp (&resp.ipz_squeue, &my_qp->ipz_squeue);if (HAS_RQ (my_qp))
drivers/infiniband/hw/ehca/ipz_pt_fn.c +1 -0
@@ -158,6 +158,7 @@ static int alloc_small_queue_page(struct ipz_queue *queue, struct ehca_pd *pd) queue->queue_pages[0 ] = (void *)(page->page | (bit << (order +9 ))); queue->small_page = page; + queue->offset = bit << (order +9 );return 1 ; out:
Signature · 1 line
1.5.2
PATCH 2/12 IB/ehca: Add 1 is not longer needed because of firmware interface change
In reply to Joachim FenkesFrom: Stefan Roscher <[email protected]>
--- drivers/infiniband/hw/ehca/hcp_if.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/ehca/hcp_if.c +2 -2
@@ -317,9 +317,9 @@ u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle, max_r10_reg =EHCA_BMASK_SET (H_ALL_RES_QP_MAX_OUTST_SEND_WR , - parms->squeue.max_wr +1 ) + parms->squeue.max_wr) |EHCA_BMASK_SET (H_ALL_RES_QP_MAX_OUTST_RECV_WR , - parms->rqueue.max_wr +1 ) + parms->rqueue.max_wr) |EHCA_BMASK_SET (H_ALL_RES_QP_MAX_SEND_SGE , parms->squeue.max_sge) | EHCA_BMASK_SET(H_ALL_RES_QP_MAX_RECV_SGE,
Signature · 1 line
1.5.2
Re: [PATCH 02/12] IB/ehca: Add 1 is not longer needed because of firmware interface change
What happens if someone runs the new driver with older firmware? Or what if someone upgrades the firmware without updating the driver?
- R.
Re: [PATCH 02/12] IB/ehca: Add 1 is not longer needed because of firmware interface change
Roland Dreier <[email protected]> wrote on 12.09.2007 22:21:54:
Quoted 2 lines
What happens if someone runs the new driver with older firmware? Or what if someone upgrades the firmware without updating the driver?
Thanks for pointing our noses to this. Your comment triggered some further internal discussions about the meaning of the values for the current system implementation. We'll think this one over again and repost the final solution in time for 2.6.24-rc1.
If the rest of this patchset is okay with you, could you apply it and leave out this one patch? The patchset will apply cleanly without it.
Thanks,
Joachim
Re: [PATCH 02/12] IB/ehca: Add 1 is not longer needed because of firmware interface change
Quoted 2 lines
If the rest of this patchset is okay with you, could you apply it and leave out this one patch? The patchset will apply cleanly without it.
Yes, no problem, I'll drop this patch for now.
- R.
PATCH 3/12 IB/ehca: Support more than 4k QPs for userspace and kernelspace
In reply to Joachim FenkesFrom: Stefan Roscher <[email protected]>
--- drivers/infiniband/hw/ehca/ehca_cq.c | 7 ++++++- drivers/infiniband/hw/ehca/ehca_main.c | 2 +- drivers/infiniband/hw/ehca/ehca_qp.c | 9 +++++++-- drivers/infiniband/hw/ehca/ehca_uverbs.c | 22 +++++++++++----------- 4 files changed, 25 insertions(+), 15 deletions(-)
drivers/infiniband/hw/ehca/ehca_cq.c +6 -1
@@ -166,7 +166,6 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,write_lock_irqsave (&ehca_cq_idr_lock, flags); ret =idr_get_new (&ehca_cq_idr, my_cq, &my_cq->token);write_unlock_irqrestore (&ehca_cq_idr_lock, flags); - }while (ret == -EAGAIN );if (ret) {
@@ -176,6 +175,12 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, goto create_cq_exit1; } +if (my_cq->token >0x1FFFFFF ) { + cq =ERR_PTR (-ENOMEM ); +ehca_err (device,"Invalid number of cq. device=%p" , device); + goto create_cq_exit2; + } +/* * CQs maximum depth is 4GB-64, but we need additional 20 as buffer * for receiving errors CQEs.
drivers/infiniband/hw/ehca/ehca_main.c +1 -1
@@ -380,7 +380,7 @@ int ehca_init_device(struct ehca_shca *shca)strlcpy (shca->ib_device.name,"ehca%d" ,IB_DEVICE_NAME_MAX ); shca->ib_device.owner =THIS_MODULE ; - shca->ib_device.uverbs_abi_ver =7 ; + shca->ib_device.uverbs_abi_ver =8 ; shca->ib_device.uverbs_cmd_mask = (1ull <<IB_USER_VERBS_CMD_GET_CONTEXT ) | (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |
drivers/infiniband/hw/ehca/ehca_qp.c +7 -2
@@ -557,7 +557,6 @@ static struct ehca_qp *internal_create_qp(write_lock_irqsave (&ehca_qp_idr_lock, flags); ret =idr_get_new (&ehca_qp_idr, my_qp, &my_qp->token);write_unlock_irqrestore (&ehca_qp_idr_lock, flags); - }while (ret == -EAGAIN );if (ret) {
@@ -566,11 +565,17 @@ static struct ehca_qp *internal_create_qp( goto create_qp_exit0; } +if (my_qp->token >0x1FFFFFF ) { + ret = -EINVAL ; +ehca_err (pd->device,"Invalid number of qp" ); + goto create_qp_exit1; + } + parms.servicetype =ibqptype2servicetype (qp_type);if (parms.servicetype <0 ) { ret = -EINVAL ;ehca_err (pd->device,"Invalid qp_type=%x" , qp_type); - goto create_qp_exit0; + goto create_qp_exit1; }if (init_attr->sq_sig_type ==IB_SIGNAL_ALL_WR )
drivers/infiniband/hw/ehca/ehca_uverbs.c +11 -11
@@ -164,7 +164,7 @@ static int ehca_mmap_cq(struct vm_area_struct *vma, struct ehca_cq *cq,int ret;switch (rsrc_type) { -case 1 :/* galpa fw handle */ +case 0 :/* galpa fw handle */ ehca_dbg (cq->ib_cq.device,"cq_num=%x fw" , cq->cq_number); ret =ehca_mmap_fw (vma, &cq->galpas, &cq->mm_count_galpa);if (unlikely (ret)) {
@@ -175,7 +175,7 @@ static int ehca_mmap_cq(struct vm_area_struct *vma, struct ehca_cq *cq, }break ; -case 2 :/* cq queue_addr */ +case 1 :/* cq queue_addr */ ehca_dbg (cq->ib_cq.device,"cq_num=%x queue" , cq->cq_number); ret =ehca_mmap_queue (vma, &cq->ipz_queue, &cq->mm_count_queue);if (unlikely (ret)) {
@@ -201,7 +201,7 @@ static int ehca_mmap_qp(struct vm_area_struct *vma, struct ehca_qp *qp,int ret;switch (rsrc_type) { -case 1 :/* galpa fw handle */ +case 0 :/* galpa fw handle */ ehca_dbg (qp->ib_qp.device,"qp_num=%x fw" , qp->ib_qp.qp_num); ret =ehca_mmap_fw (vma, &qp->galpas, &qp->mm_count_galpa);if (unlikely (ret)) {
@@ -212,7 +212,7 @@ static int ehca_mmap_qp(struct vm_area_struct *vma, struct ehca_qp *qp, }break ; -case 2 :/* qp rqueue_addr */ +case 1 :/* qp rqueue_addr */ ehca_dbg (qp->ib_qp.device,"qp_num=%x rqueue" , qp->ib_qp.qp_num); ret = ehca_mmap_queue(vma, &qp->ipz_rqueue,
@@ -225,7 +225,7 @@ static int ehca_mmap_qp(struct vm_area_struct *vma, struct ehca_qp *qp, }break ; -case 3 :/* qp squeue_addr */ +case 2 :/* qp squeue_addr */ ehca_dbg (qp->ib_qp.device,"qp_num=%x squeue" , qp->ib_qp.qp_num); ret = ehca_mmap_queue(vma, &qp->ipz_squeue,
@@ -249,10 +249,10 @@ static int ehca_mmap_qp(struct vm_area_struct *vma, struct ehca_qp *qp,int ehca_mmap (struct ib_ucontext *context,struct vm_area_struct *vma) { -u64 fileoffset = vma->vm_pgoff <<PAGE_SHIFT ; -u32 idr_handle = fileoffset >>32 ; -u32 q_type = (fileoffset >>28 ) &0xF ;/* CQ, QP,... */ -u32 rsrc_type = (fileoffset >>24 ) &0xF ;/* sq,rq,cmnd_window */ +u64 fileoffset = vma->vm_pgoff; +u32 idr_handle = fileoffset &0x1FFFFFF ; +u32 q_type = (fileoffset >>27 ) &0x1 ;/* CQ, QP,... */ +u32 rsrc_type = (fileoffset >>25 ) &0x3 ;/* sq,rq,cmnd_window */ u32 cur_pid = current->tgid;u32 ret;struct ehca_cq *cq;
@@ -261,7 +261,7 @@ int ehca_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)struct ib_uobject *uobject;switch (q_type) { -case 1 :/* CQ */ +case 0 :/* CQ */ read_lock (&ehca_cq_idr_lock); cq =idr_find (&ehca_cq_idr, idr_handle);read_unlock (&ehca_cq_idr_lock);
@@ -289,7 +289,7 @@ int ehca_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) }break ; -case 2 :/* QP */ +case 1 :/* QP */ read_lock (&ehca_qp_idr_lock); qp =idr_find (&ehca_qp_idr, idr_handle);read_unlock (&ehca_qp_idr_lock);
Signature · 1 line
1.5.2
PATCH 4/12 IB/ehca: Use remap_4k_pfn() to map firmware contexts to user space
In reply to Joachim FenkesFrom: Hoang-Nam Nguyen <[email protected]>
Use Paul's new remap_4k_pfn() function to map our 4K firmware contexts into user space on 64K-page machines without exposing neighboring firmware contexts. Return the context's offset within a 64K page to user space so it can determine the proper virtual address.
For details about remap_4k_pfn(), see commit 721151d0 or
http://patchwork.ozlabs.org/linuxppc/patch?id=10281
--- drivers/infiniband/hw/ehca/ehca_classes.h | 4 +++- drivers/infiniband/hw/ehca/ehca_cq.c | 2 ++ drivers/infiniband/hw/ehca/ehca_qp.c | 2 ++ drivers/infiniband/hw/ehca/ehca_uverbs.c | 6 +++--- 4 files changed, 10 insertions(+), 4 deletions(-)
drivers/infiniband/hw/ehca/ehca_classes.h +3 -1
@@ -337,6 +337,8 @@ struct ehca_create_cq_resp {u32 cq_number;u32 token;struct ipzu_queue_resp ipz_queue; +u32 fw_handle_ofs; +u32 dummy; };struct ehca_create_qp_resp {
@@ -347,7 +349,7 @@ struct ehca_create_qp_resp {u32 qkey;/* qp_num assigned by ehca: sqp0/1 may have got different numbers */ u32 real_qp_num; -u32 dummy;/* padding for 8 byte alignment */ +u32 fw_handle_ofs;struct ipzu_queue_resp ipz_squeue;struct ipzu_queue_resp ipz_rqueue; };
drivers/infiniband/hw/ehca/ehca_cq.c +2 -0
@@ -281,6 +281,8 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, resp.ipz_queue.queue_length = ipz_queue->queue_length; resp.ipz_queue.pagesize = ipz_queue->pagesize; resp.ipz_queue.toggle_state = ipz_queue->toggle_state; + resp.fw_handle_ofs = (u32) + (my_cq->galpas.user.fw_handle & (PAGE_SIZE -1 ));if (ib_copy_to_udata (udata, &resp,sizeof (resp))) {ehca_err (device,"Copy to udata failed." ); goto create_cq_exit4;
drivers/infiniband/hw/ehca/ehca_qp.c +2 -0
@@ -751,6 +751,8 @@ static struct ehca_qp *internal_create_qp(queue2resp (&resp.ipz_squeue, &my_qp->ipz_squeue);if (HAS_RQ (my_qp))queue2resp (&resp.ipz_rqueue, &my_qp->ipz_rqueue); + resp.fw_handle_ofs = (u32) + (my_qp->galpas.user.fw_handle & (PAGE_SIZE -1 ));if (ib_copy_to_udata (udata, &resp,sizeof resp)) {ehca_err (pd->device,"Copy to udata failed" );
drivers/infiniband/hw/ehca/ehca_uverbs.c +3 -3
@@ -109,7 +109,7 @@ static int ehca_mmap_fw(struct vm_area_struct *vma, struct h_galpas *galpas,u64 vsize, physical; vsize = vma->vm_end - vma->vm_start; -if (vsize !=EHCA_PAGESIZE ) { +if (vsize <EHCA_PAGESIZE ) {ehca_gen_err ("invalid vsize=%lx" , vma->vm_end - vma->vm_start);return -EINVAL ; }
@@ -118,8 +118,8 @@ static int ehca_mmap_fw(struct vm_area_struct *vma, struct h_galpas *galpas, vma->vm_page_prot =pgprot_noncached (vma->vm_page_prot);ehca_gen_dbg ("vsize=%lx physical=%lx" , vsize, physical);/* VM_IO | VM_RESERVED are set by remap_pfn_range() */ - ret =remap_pfn_range (vma, vma->vm_start, physical >>PAGE_SHIFT , - vsize, vma->vm_page_prot); + ret =remap_4k_pfn (vma, vma->vm_start, physical >>EHCA_PAGESHIFT , + vma->vm_page_prot);if (unlikely (ret)) {ehca_gen_err ("remap_pfn_range() failed ret=%x" , ret);return -ENOMEM ;
Signature · 1 line
1.5.2
PATCH 5/12 IB/ehca: Refactor hvcall tracing
In reply to Joachim FenkesChange hvcall trace output towards better readability: reg numbers instead of argument numbers, return code as signed decimal instead of unsigned hex.
--- drivers/infiniband/hw/ehca/hcp_if.c | 57 ++++++++++++++-------------------- 1 files changed, 24 insertions(+), 33 deletions(-)
drivers/infiniband/hw/ehca/hcp_if.c +24 -33
@@ -84,6 +84,10 @@#define H_MP_SHUTDOWN EHCA_BMASK_IBM(48, 48)#define H_MP_RESET_QKEY_CTR EHCA_BMASK_IBM(49, 49) +#define HCALL4_REGS_FORMAT "r4=%lx r5=%lx r6=%lx r7=%lx" +#define HCALL7_REGS_FORMAT HCALL4_REGS_FORMAT " r8=%lx r9=%lx r10=%lx" +#define HCALL9_REGS_FORMAT HCALL7_REGS_FORMAT " r11=%lx r12=%lx" +static DEFINE_SPINLOCK (hcall_lock);static u32 get_longbusy_msecs (int longbusy_rc)
@@ -118,8 +122,7 @@ static long ehca_plpar_hcall_norets(unsigned long opcode,long ret;int i, sleep_msecs; -ehca_gen_dbg ("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx " -"arg5=%lx arg6=%lx arg7=%lx" , +ehca_gen_dbg ("opcode=%lx " HCALL7_REGS_FORMAT , opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7);for (i =0 ; i <5 ; i++) {
@@ -133,16 +136,13 @@ static long ehca_plpar_hcall_norets(unsigned long opcode, }if (ret <H_SUCCESS ) -ehca_gen_err ("opcode=%lx ret=%lx" -" arg1=%lx arg2=%lx arg3=%lx arg4=%lx" -" arg5=%lx arg6=%lx arg7=%lx " , - opcode, ret, - arg1, arg2, arg3, arg4, arg5, - arg6, arg7); - -ehca_gen_dbg ("opcode=%lx ret=%lx" , opcode, ret); -return ret; +ehca_gen_err ("opcode=%lx ret=%li " HCALL7_REGS_FORMAT , + opcode, ret, arg1, arg2, arg3, + arg4, arg5, arg6, arg7); +else +ehca_gen_dbg ("opcode=%lx ret=%li" , opcode, ret); +return ret; }return H_BUSY ;
@@ -164,10 +164,8 @@ static long ehca_plpar_hcall9(unsigned long opcode,int i, sleep_msecs, lock_is_set =0 ;unsigned long flags =0 ; -ehca_gen_dbg ("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx " -"arg5=%lx arg6=%lx arg7=%lx arg8=%lx arg9=%lx" , - opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7, - arg8, arg9); +ehca_gen_dbg ("INPUT -- opcode=%lx " HCALL9_REGS_FORMAT , opcode, + arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);for (i =0 ; i <5 ; i++) {if ((opcode ==H_ALLOC_RESOURCE ) && (arg2 ==5 )) {
@@ -188,26 +186,19 @@ static long ehca_plpar_hcall9(unsigned long opcode,continue ; } -if (ret <H_SUCCESS ) -ehca_gen_err ("opcode=%lx ret=%lx" -" arg1=%lx arg2=%lx arg3=%lx arg4=%lx" -" arg5=%lx arg6=%lx arg7=%lx arg8=%lx" -" arg9=%lx" -" out1=%lx out2=%lx out3=%lx out4=%lx" -" out5=%lx out6=%lx out7=%lx out8=%lx" -" out9=%lx" , - opcode, ret, - arg1, arg2, arg3, arg4, arg5, - arg6, arg7, arg8, arg9, - outs[0 ], outs[1 ], outs[2 ], outs[3 ], +if (ret <H_SUCCESS ) { +ehca_gen_err ("INPUT -- opcode=%lx " HCALL9_REGS_FORMAT , + opcode, arg1, arg2, arg3, arg4, arg5, + arg6, arg7, arg8, arg9); +ehca_gen_err ("OUTPUT -- ret=%li " HCALL9_REGS_FORMAT , + ret, outs[0 ], outs[1 ], outs[2 ], outs[3 ], + outs[4 ], outs[5 ], outs[6 ], outs[7 ], + outs[8 ]); + }else +ehca_gen_dbg ("OUTPUT -- ret=%li " HCALL9_REGS_FORMAT , + ret, outs[0 ], outs[1 ], outs[2 ], outs[3 ], outs[4 ], outs[5 ], outs[6 ], outs[7 ], outs[8 ]); - -ehca_gen_dbg ("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx " -"out4=%lx out5=%lx out6=%lx out7=%lx out8=%lx " -"out9=%lx" , - opcode, ret, outs[0 ], outs[1 ], outs[2 ], outs[3 ], - outs[4 ], outs[5 ], outs[6 ], outs[7 ], outs[8 ]);return ret; }
Signature · 1 line
1.5.2
PATCH 6/12 IB/ehca: Print return codes as signed decimal integers
In reply to Joachim Fenkes...because -12 is easier to read than FFFFFFF4.
--- drivers/infiniband/hw/ehca/ehca_cq.c | 14 +++--- drivers/infiniband/hw/ehca/ehca_hca.c | 2 +- drivers/infiniband/hw/ehca/ehca_main.c | 24 +++++----- drivers/infiniband/hw/ehca/ehca_mcast.c | 4 +- drivers/infiniband/hw/ehca/ehca_mrmw.c | 75 +++++++++++++++--------------- drivers/infiniband/hw/ehca/ehca_qp.c | 46 +++++++++--------- drivers/infiniband/hw/ehca/ehca_reqs.c | 2 +- drivers/infiniband/hw/ehca/ehca_sqp.c | 2 +- drivers/infiniband/hw/ehca/ehca_uverbs.c | 18 ++++---- drivers/infiniband/hw/ehca/hcp_if.c | 20 ++++---- 10 files changed, 103 insertions(+), 104 deletions(-)
drivers/infiniband/hw/ehca/ehca_cq.c +7 -7
@@ -190,7 +190,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,if (h_ret !=H_SUCCESS ) {ehca_err (device,"hipz_h_alloc_resource_cq() failed " -"h_ret=%lx device=%p" , h_ret, device); +"h_ret=%li device=%p" , h_ret, device); cq =ERR_PTR (ehca2ib_return_code (h_ret)); goto create_cq_exit2; }
@@ -198,7 +198,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, ipz_rc =ipz_queue_ctor (NULL , &my_cq->ipz_queue, param.act_pages,EHCA_PAGESIZE ,sizeof (struct ehca_cqe ),0 ,0 );if (!ipz_rc) { -ehca_err (device,"ipz_queue_ctor() failed ipz_rc=%x device=%p" , +ehca_err (device,"ipz_queue_ctor() failed ipz_rc=%i device=%p" , ipz_rc, device); cq =ERR_PTR (-EINVAL ); goto create_cq_exit3;
@@ -226,7 +226,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,if (h_ret <H_SUCCESS ) {ehca_err (device,"hipz_h_register_rpage_cq() failed " -"ehca_cq=%p cq_num=%x h_ret=%lx counter=%i " +"ehca_cq=%p cq_num=%x h_ret=%li counter=%i " "act_pages=%i" , my_cq, my_cq->cq_number, h_ret, counter, param.act_pages); cq =ERR_PTR (-EINVAL );
@@ -238,7 +238,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,if ((h_ret !=H_SUCCESS ) || vpage) {ehca_err (device,"Registration of pages not " "complete ehca_cq=%p cq_num=%x " -"h_ret=%lx" , my_cq, my_cq->cq_number, +"h_ret=%li" , my_cq, my_cq->cq_number, h_ret); cq =ERR_PTR (-EAGAIN ); goto create_cq_exit4;
@@ -246,7 +246,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, }else {if (h_ret !=H_PAGE_REGISTERED ) {ehca_err (device,"Registration of page failed " -"ehca_cq=%p cq_num=%x h_ret=%lx" +"ehca_cq=%p cq_num=%x h_ret=%li" "counter=%i act_pages=%i" , my_cq, my_cq->cq_number, h_ret, counter, param.act_pages);
@@ -298,7 +298,7 @@ create_cq_exit3: h_ret =hipz_h_destroy_cq (adapter_handle, my_cq,1 );if (h_ret !=H_SUCCESS )ehca_err (device,"hipz_h_destroy_cq() failed ehca_cq=%p " -"cq_num=%x h_ret=%lx" , my_cq, my_cq->cq_number, h_ret); +"cq_num=%x h_ret=%li" , my_cq, my_cq->cq_number, h_ret); create_cq_exit2:write_lock_irqsave (&ehca_cq_idr_lock, flags);
@@ -362,7 +362,7 @@ int ehca_destroy_cq(struct ib_cq *cq) cq_num); }if (h_ret !=H_SUCCESS ) { -ehca_err (device,"hipz_h_destroy_cq() failed h_ret=%lx " +ehca_err (device,"hipz_h_destroy_cq() failed h_ret=%li " "ehca_cq=%p cq_num=%x" , h_ret, my_cq, cq_num);return ehca2ib_return_code (h_ret); }
drivers/infiniband/hw/ehca/ehca_hca.c +1 -1
@@ -352,7 +352,7 @@ int ehca_modify_port(struct ib_device *ibdev, hret =hipz_h_modify_port (shca->ipz_hca_handle, port, cap, props->init_type, port_modify_mask);if (hret !=H_SUCCESS ) { -ehca_err (&shca->ib_device,"Modify port failed hret=%lx" , +ehca_err (&shca->ib_device,"Modify port failed h_ret=%li" , hret); ret = -EINVAL ; }
drivers/infiniband/hw/ehca/ehca_main.c +12 -12
@@ -273,7 +273,7 @@ int ehca_sense_attributes(struct ehca_shca *shca) h_ret =hipz_h_query_hca (shca->ipz_hca_handle, rblock);if (h_ret !=H_SUCCESS ) { -ehca_gen_err ("Cannot query device properties. h_ret=%lx" , +ehca_gen_err ("Cannot query device properties. h_ret=%li" , h_ret); ret = -EPERM ; goto sense_attributes1;
@@ -332,7 +332,7 @@ int ehca_sense_attributes(struct ehca_shca *shca) port = (struct hipz_query_port *)rblock; h_ret =hipz_h_query_port (shca->ipz_hca_handle,1 , port);if (h_ret !=H_SUCCESS ) { -ehca_gen_err ("Cannot query port properties. h_ret=%lx" , +ehca_gen_err ("Cannot query port properties. h_ret=%li" , h_ret); ret = -EPERM ; goto sense_attributes1;
@@ -526,13 +526,13 @@ static int ehca_destroy_aqp1(struct ehca_sport *sport) ret =ib_destroy_qp (sport->ibqp_aqp1);if (ret) { -ehca_gen_err ("Cannot destroy AQP1 QP. ret=%x" , ret); +ehca_gen_err ("Cannot destroy AQP1 QP. ret=%i" , ret);return ret; } ret =ib_destroy_cq (sport->ibcq_aqp1);if (ret) -ehca_gen_err ("Cannot destroy AQP1 CQ. ret=%x" , ret); +ehca_gen_err ("Cannot destroy AQP1 CQ. ret=%i" , ret);return ret; }
@@ -728,7 +728,7 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev, ret =ehca_reg_internal_maxmr (shca, shca->pd, &shca->maxmr);if (ret) { -ehca_err (&shca->ib_device,"Cannot create internal MR ret=%x" , +ehca_err (&shca->ib_device,"Cannot create internal MR ret=%i" , ret); goto probe5; }
@@ -736,7 +736,7 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev, ret =ib_register_device (&shca->ib_device);if (ret) {ehca_err (&shca->ib_device, -"ib_register_device() failed ret=%x" , ret); +"ib_register_device() failed ret=%i" , ret); goto probe6; }
@@ -777,7 +777,7 @@ probe8: ret =ehca_destroy_aqp1 (&shca->sport[0 ]);if (ret)ehca_err (&shca->ib_device, -"Cannot destroy AQP1 for port 1. ret=%x" , ret); +"Cannot destroy AQP1 for port 1. ret=%i" , ret); probe7:ib_unregister_device (&shca->ib_device);
@@ -826,7 +826,7 @@ static int __devexit ehca_remove(struct ibmebus_dev *dev)if (ret)ehca_err (&shca->ib_device,"Cannot destroy AQP1 for port %x " -"ret=%x" , ret, i); +"ret=%i" , ret, i); } }
@@ -835,20 +835,20 @@ static int __devexit ehca_remove(struct ibmebus_dev *dev) ret =ehca_dereg_internal_maxmr (shca);if (ret)ehca_err (&shca->ib_device, -"Cannot destroy internal MR. ret=%x" , ret); +"Cannot destroy internal MR. ret=%i" , ret); ret =ehca_dealloc_pd (&shca->pd->ib_pd);if (ret)ehca_err (&shca->ib_device, -"Cannot destroy internal PD. ret=%x" , ret); +"Cannot destroy internal PD. ret=%i" , ret); ret =ehca_destroy_eq (shca, &shca->eq);if (ret) -ehca_err (&shca->ib_device,"Cannot destroy EQ. ret=%x" , ret); +ehca_err (&shca->ib_device,"Cannot destroy EQ. ret=%i" , ret); ret =ehca_destroy_eq (shca, &shca->neq);if (ret) -ehca_err (&shca->ib_device,"Canot destroy NEQ. ret=%x" , ret); +ehca_err (&shca->ib_device,"Canot destroy NEQ. ret=%i" , ret);ib_dealloc_device (&shca->ib_device);
drivers/infiniband/hw/ehca/ehca_mcast.c +2 -2
@@ -88,7 +88,7 @@ int ehca_attach_mcast(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)if (h_ret !=H_SUCCESS )ehca_err (ibqp->device,"ehca_qp=%p qp_num=%x hipz_h_attach_mcqp() failed " -"h_ret=%lx" , my_qp, ibqp->qp_num, h_ret); +"h_ret=%li" , my_qp, ibqp->qp_num, h_ret);return ehca2ib_return_code (h_ret); }
@@ -125,7 +125,7 @@ int ehca_detach_mcast(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)if (h_ret !=H_SUCCESS )ehca_err (ibqp->device,"ehca_qp=%p qp_num=%x hipz_h_detach_mcqp() failed " -"h_ret=%lx" , my_qp, ibqp->qp_num, h_ret); +"h_ret=%li" , my_qp, ibqp->qp_num, h_ret);return ehca2ib_return_code (h_ret); }
drivers/infiniband/hw/ehca/ehca_mrmw.c +37 -38
292 lines not on this page · raw message
drivers/infiniband/hw/ehca/ehca_qp.c +23 -23
178 lines not on this page · raw message
drivers/infiniband/hw/ehca/ehca_reqs.c +1 -1
@@ -526,7 +526,7 @@ poll_cq_one_read_cqe:if (!cqe) { ret = -EAGAIN ;ehca_dbg (cq->device,"Completion queue is empty ehca_cq=%p " -"cq_num=%x ret=%x" , my_cq, my_cq->cq_number, ret); +"cq_num=%x ret=%i" , my_cq, my_cq->cq_number, ret); goto poll_cq_one_exit0; }
drivers/infiniband/hw/ehca/ehca_sqp.c +1 -1
@@ -82,7 +82,7 @@ u64 ehca_define_sqp(struct ehca_shca *shca,if (ret !=H_SUCCESS ) {ehca_err (&shca->ib_device, -"Can't define AQP1 for port %x. rc=%lx" , +"Can't define AQP1 for port %x. h_ret=%li" , port, ret);return ret; }
drivers/infiniband/hw/ehca/ehca_uverbs.c +9 -9
@@ -121,7 +121,7 @@ static int ehca_mmap_fw(struct vm_area_struct *vma, struct h_galpas *galpas, ret =remap_4k_pfn (vma, vma->vm_start, physical >>EHCA_PAGESHIFT , vma->vm_page_prot);if (unlikely (ret)) { -ehca_gen_err ("remap_pfn_range() failed ret=%x" , ret); +ehca_gen_err ("remap_pfn_range() failed ret=%i" , ret);return -ENOMEM ; }
@@ -146,7 +146,7 @@ static int ehca_mmap_queue(struct vm_area_struct *vma, struct ipz_queue *queue, page =virt_to_page (virt_addr); ret =vm_insert_page (vma, start, page);if (unlikely (ret)) { -ehca_gen_err ("vm_insert_page() failed rc=%x" , ret); +ehca_gen_err ("vm_insert_page() failed rc=%i" , ret);return ret; } start +=PAGE_SIZE ;
@@ -169,7 +169,7 @@ static int ehca_mmap_cq(struct vm_area_struct *vma, struct ehca_cq *cq, ret =ehca_mmap_fw (vma, &cq->galpas, &cq->mm_count_galpa);if (unlikely (ret)) {ehca_err (cq->ib_cq.device, -"ehca_mmap_fw() failed rc=%x cq_num=%x" , +"ehca_mmap_fw() failed rc=%i cq_num=%x" , ret, cq->cq_number);return ret; }
@@ -180,7 +180,7 @@ static int ehca_mmap_cq(struct vm_area_struct *vma, struct ehca_cq *cq, ret =ehca_mmap_queue (vma, &cq->ipz_queue, &cq->mm_count_queue);if (unlikely (ret)) {ehca_err (cq->ib_cq.device, -"ehca_mmap_queue() failed rc=%x cq_num=%x" , +"ehca_mmap_queue() failed rc=%i cq_num=%x" , ret, cq->cq_number);return ret; }
@@ -206,7 +206,7 @@ static int ehca_mmap_qp(struct vm_area_struct *vma, struct ehca_qp *qp, ret =ehca_mmap_fw (vma, &qp->galpas, &qp->mm_count_galpa);if (unlikely (ret)) {ehca_err (qp->ib_qp.device, -"remap_pfn_range() failed ret=%x qp_num=%x" , +"remap_pfn_range() failed ret=%i qp_num=%x" , ret, qp->ib_qp.qp_num);return -ENOMEM ; }
@@ -219,7 +219,7 @@ static int ehca_mmap_qp(struct vm_area_struct *vma, struct ehca_qp *qp, &qp->mm_count_rqueue);if (unlikely (ret)) {ehca_err (qp->ib_qp.device, -"ehca_mmap_queue(rq) failed rc=%x qp_num=%x" , +"ehca_mmap_queue(rq) failed rc=%i qp_num=%x" , ret, qp->ib_qp.qp_num);return ret; }
@@ -232,7 +232,7 @@ static int ehca_mmap_qp(struct vm_area_struct *vma, struct ehca_qp *qp, &qp->mm_count_squeue);if (unlikely (ret)) {ehca_err (qp->ib_qp.device, -"ehca_mmap_queue(sq) failed rc=%x qp_num=%x" , +"ehca_mmap_queue(sq) failed rc=%i qp_num=%x" , ret, qp->ib_qp.qp_num);return ret; }
@@ -283,7 +283,7 @@ int ehca_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) ret =ehca_mmap_cq (vma, cq, rsrc_type);if (unlikely (ret)) {ehca_err (cq->ib_cq.device, -"ehca_mmap_cq() failed rc=%x cq_num=%x" , +"ehca_mmap_cq() failed rc=%i cq_num=%x" , ret, cq->cq_number);return ret; }
@@ -313,7 +313,7 @@ int ehca_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) ret =ehca_mmap_qp (vma, qp, rsrc_type);if (unlikely (ret)) {ehca_err (qp->ib_qp.device, -"ehca_mmap_qp() failed rc=%x qp_num=%x" , +"ehca_mmap_qp() failed rc=%i qp_num=%x" , ret, qp->ib_qp.qp_num);return ret; }
drivers/infiniband/hw/ehca/hcp_if.c +10 -10
@@ -238,7 +238,7 @@ u64 hipz_h_alloc_resource_eq(const struct ipz_adapter_handle adapter_handle, *eq_ist = (u32 )outs[5 ];if (ret ==H_NOT_ENOUGH_RESOURCES ) -ehca_gen_err ("Not enough resource - ret=%lx " , ret); +ehca_gen_err ("Not enough resource - ret=%li " , ret);return ret; }
@@ -276,7 +276,7 @@ u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle,hcp_galpas_ctor (&cq->galpas, outs[5 ], outs[6 ]);if (ret ==H_NOT_ENOUGH_RESOURCES ) -ehca_gen_err ("Not enough resources. ret=%lx" , ret); +ehca_gen_err ("Not enough resources. ret=%li" , ret);return ret; }
@@ -351,7 +351,7 @@ u64 hipz_h_alloc_resource_qp(const struct ipz_adapter_handle adapter_handle,hcp_galpas_ctor (&parms->galpas, outs[6 ], outs[6 ]);if (ret ==H_NOT_ENOUGH_RESOURCES ) -ehca_gen_err ("Not enough resources. ret=%lx" , ret); +ehca_gen_err ("Not enough resources. ret=%li" , ret);return ret; }
@@ -546,7 +546,7 @@ u64 hipz_h_modify_qp(const struct ipz_adapter_handle adapter_handle, 0, 0, 0, 0, 0);if (ret ==H_NOT_ENOUGH_RESOURCES ) -ehca_gen_err ("Insufficient resources ret=%lx" , ret); +ehca_gen_err ("Insufficient resources ret=%li" , ret);return ret; }
@@ -582,7 +582,7 @@ u64 hipz_h_destroy_qp(const struct ipz_adapter_handle adapter_handle, qp->ipz_qp_handle.handle,/* r6 */ 0, 0, 0, 0, 0, 0);if (ret ==H_HARDWARE ) -ehca_gen_err ("HCA not operational. ret=%lx" , ret); +ehca_gen_err ("HCA not operational. ret=%li" , ret); ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE, adapter_handle.handle, /* r4 */
@@ -590,7 +590,7 @@ u64 hipz_h_destroy_qp(const struct ipz_adapter_handle adapter_handle, 0, 0, 0, 0, 0);if (ret ==H_RESOURCE ) -ehca_gen_err ("Resource still in use. ret=%lx" , ret); +ehca_gen_err ("Resource still in use. ret=%li" , ret);return ret; }
@@ -625,7 +625,7 @@ u64 hipz_h_define_aqp1(const struct ipz_adapter_handle adapter_handle, *bma_qp_nr = (u32 )outs[1 ];if (ret ==H_ALIAS_EXIST ) -ehca_gen_err ("AQP1 already exists. ret=%lx" , ret); +ehca_gen_err ("AQP1 already exists. ret=%li" , ret);return ret; }
@@ -647,7 +647,7 @@ u64 hipz_h_attach_mcqp(const struct ipz_adapter_handle adapter_handle, 0, 0);if (ret ==H_NOT_ENOUGH_RESOURCES ) -ehca_gen_err ("Not enough resources. ret=%lx" , ret); +ehca_gen_err ("Not enough resources. ret=%li" , ret);return ret; }
@@ -686,7 +686,7 @@ u64 hipz_h_destroy_cq(const struct ipz_adapter_handle adapter_handle, 0, 0, 0, 0);if (ret ==H_RESOURCE ) -ehca_gen_err ("H_FREE_RESOURCE failed ret=%lx " , ret); +ehca_gen_err ("H_FREE_RESOURCE failed ret=%li " , ret);return ret; }
@@ -708,7 +708,7 @@ u64 hipz_h_destroy_eq(const struct ipz_adapter_handle adapter_handle, 0, 0, 0, 0, 0);if (ret ==H_RESOURCE ) -ehca_gen_err ("Resource in use. ret=%lx " , ret); +ehca_gen_err ("Resource in use. ret=%li " , ret);return ret; }
Signature · 1 line
1.5.2
PATCH 7/12 IB/ehca: ehca_gen_warn() should always print
In reply to Joachim Fenkes--- drivers/infiniband/hw/ehca/ehca_tools.h | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-)
drivers/infiniband/hw/ehca/ehca_tools.h +3 -6
@@ -98,15 +98,12 @@ extern int ehca_debug_level; } while (0) #define ehca_gen_warn(format, arg...) \ - do { \ - if (unlikely(ehca_debug_level)) \ - printk(KERN_INFO "PU%04x EHCA_WARN:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg); \ - } while (0) + printk(KERN_INFO "PU%04x EHCA_WARN:%s " format "\n", \ + get_paca()->paca_index, __FUNCTION__, ## arg) #define ehca_gen_err(format, arg...) \ printk(KERN_ERR "PU%04x EHCA_ERR:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + get_paca()->paca_index, __FUNCTION__, ## arg)/** * ehca_dmp - printk a memory block, whose length is n*8 bytes.
Signature · 1 line
1.5.2
PATCH 8/12 IB/ehca: Replace get_paca()->paca_index by the more portable smp_processor_id()
In reply to Joachim Fenkes--- drivers/infiniband/hw/ehca/ehca_tools.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)
drivers/infiniband/hw/ehca/ehca_tools.h +7 -7
@@ -73,37 +73,37 @@ extern int ehca_debug_level; if (unlikely(ehca_debug_level)) \ dev_printk(KERN_DEBUG, (ib_dev)->dma_device, \ "PU%04x EHCA_DBG:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, \ + smp_processor_id(), __FUNCTION__, \ ## arg); \ } while (0) #define ehca_info(ib_dev, format, arg...) \ dev_info((ib_dev)->dma_device, "PU%04x EHCA_INFO:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg) #define ehca_warn(ib_dev, format, arg...) \ dev_warn((ib_dev)->dma_device, "PU%04x EHCA_WARN:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg) #define ehca_err(ib_dev, format, arg...) \ dev_err((ib_dev)->dma_device, "PU%04x EHCA_ERR:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg) /* use this one only if no ib_dev available */ #define ehca_gen_dbg(format, arg...) \ do { \ if (unlikely(ehca_debug_level)) \ printk(KERN_DEBUG "PU%04x EHCA_DBG:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg); \ + smp_processor_id(), __FUNCTION__, ## arg); \ } while (0) #define ehca_gen_warn(format, arg...) \ printk(KERN_INFO "PU%04x EHCA_WARN:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg) #define ehca_gen_err(format, arg...) \ printk(KERN_ERR "PU%04x EHCA_ERR:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg) /** * ehca_dmp - printk a memory block, whose length is n*8 bytes.
Signature · 1 line
1.5.2
Re: [PATCH 08/12] IB/ehca: Replace get_paca()->paca_index by the more portable smp_processor_id()
Hi,
Quoted 22 lines · Joachim Fenkes
Signed-off-by Joachim Fenkes <[email protected]>--- drivers/infiniband/hw/ehca/ehca_tools.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)drivers/infiniband/hw/ehca/ehca_tools.h +2
-2@@ -73,37 +73,37 @@ extern int ehca_debug_level;if (unlikely (ehca_debug_level)) \dev_printk (KERN_DEBUG , (ib_dev)->dma_device, \"PU%04x EHCA_DBG:%s " format"\n" , \ - get_paca()->paca_index, __FUNCTION__, \ + smp_processor_id(), __FUNCTION__, \ ## arg); \ }while (0 ) #define ehca_info(ib_dev, format, arg...) \dev_info ((ib_dev)->dma_device,"PU%04x EHCA_INFO:%s " format"\n" , \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg)
drivers/infiniband/hw/ehca/ehca_tools.h extern int ehca_debug_level; · line 90
Quoted 10 lines
drivers/infiniband/hw/ehca/ehca_tools.h +2
-2#define ehca_warn(ib_dev, format, arg...) \ dev_warn((ib_dev)->dma_device, "PU%04x EHCA_WARN:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg) #define ehca_err(ib_dev, format, arg...) \ dev_err((ib_dev)->dma_device, "PU%04x EHCA_ERR:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + smp_processor_id(), __FUNCTION__, ## arg)
I think I see these macros used in preemptible code (e.g. ehca_probe), where smp_processor_id() will print a warning when CONFIG_DEBUG_PREEMPT=y. Probably better to use raw_smp_processor_id.
Re: [PATCH 08/12] IB/ehca: Replace get_paca()->paca_index by the more portable smp_processor_id()
Quoted 6 lines · Nathan Lynch
drivers/infiniband/hw/ehca/ehca_tools.h extern int ehca_debug_level; · line 76
Quoted 2 lines
drivers/infiniband/hw/ehca/ehca_tools.h +1
-1- get_paca()->paca_index, __FUNCTION__, \ + smp_processor_id(), __FUNCTION__, \I think I see these macros used in preemptible code (e.g.
ehca_probe), wheresmp_processor_id()will print a warning whenCONFIG_DEBUG_PREEMPT=y. Probably better to useraw_smp_processor_id.
You're right, man. The processor id doesn't need to be preemption-safe in this context, so that would be a bogus warning. Thanks for pointing this out. I'll post a new version of this patch.
Joachim
PATCH 8/12 IB/ehca: Replace get_paca()->paca_index by the more portable raw_smp_processor_id()
In reply to Joachim FenkesWe can use raw_smp_processor_id() here because the processor ID is only used for debug output and may therefore be preemption-unsafe.
---
This is the same patch, but with smp_processor_id() replaced by raw_smp_processor_id(), as kindly pointed out to me by Nathan. Thanks!
drivers/infiniband/hw/ehca/ehca_tools.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)
drivers/infiniband/hw/ehca/ehca_tools.h +7 -7
@@ -73,37 +73,37 @@ extern int ehca_debug_level; if (unlikely(ehca_debug_level)) \ dev_printk(KERN_DEBUG, (ib_dev)->dma_device, \ "PU%04x EHCA_DBG:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, \ + raw_smp_processor_id(), __FUNCTION__, \ ## arg); \ } while (0) #define ehca_info(ib_dev, format, arg...) \ dev_info((ib_dev)->dma_device, "PU%04x EHCA_INFO:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + raw_smp_processor_id(), __FUNCTION__, ## arg) #define ehca_warn(ib_dev, format, arg...) \ dev_warn((ib_dev)->dma_device, "PU%04x EHCA_WARN:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + raw_smp_processor_id(), __FUNCTION__, ## arg) #define ehca_err(ib_dev, format, arg...) \ dev_err((ib_dev)->dma_device, "PU%04x EHCA_ERR:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + raw_smp_processor_id(), __FUNCTION__, ## arg) /* use this one only if no ib_dev available */ #define ehca_gen_dbg(format, arg...) \ do { \ if (unlikely(ehca_debug_level)) \ printk(KERN_DEBUG "PU%04x EHCA_DBG:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg); \ + raw_smp_processor_id(), __FUNCTION__, ## arg); \ } while (0) #define ehca_gen_warn(format, arg...) \ printk(KERN_INFO "PU%04x EHCA_WARN:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + raw_smp_processor_id(), __FUNCTION__, ## arg) #define ehca_gen_err(format, arg...) \ printk(KERN_ERR "PU%04x EHCA_ERR:%s " format "\n", \ - get_paca()->paca_index, __FUNCTION__, ## arg) + raw_smp_processor_id(), __FUNCTION__, ## arg) /** * ehca_dmp - printk a memory block, whose length is n*8 bytes.
Signature · 1 line
1.5.2
PATCH 9/12 IB/ehca: Add check for max #SGE to create_qp()
In reply to Joachim Fenkes--- drivers/infiniband/hw/ehca/ehca_qp.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-)
drivers/infiniband/hw/ehca/ehca_qp.c +13 -1
@@ -513,7 +513,7 @@ static struct ehca_qp *internal_create_qp( }else if (init_attr->cap.max_send_wr >255 ) {ehca_err (pd->device,"Invalid Number of " -"ax_send_wr=%x for UD QP_TYPE=%x" , +"max_send_wr=%x for UD QP_TYPE=%x" , init_attr->cap.max_send_wr, qp_type);return ERR_PTR (-EINVAL ); }
@@ -524,6 +524,18 @@ static struct ehca_qp *internal_create_qp(return ERR_PTR (-EINVAL );break ; } + }else { +int max_sge = (qp_type ==IB_QPT_UD || qp_type ==IB_QPT_SMI + || qp_type ==IB_QPT_GSI ) ?250 :252 ; + +if (init_attr->cap.max_send_sge > max_sge + || init_attr->cap.max_recv_sge > max_sge) { +ehca_err (pd->device,"Invalid number of SGEs requested " +"send_sge=%x recv_sge=%x max_sge=%x" , + init_attr->cap.max_send_sge, + init_attr->cap.max_recv_sge, max_sge); +return ERR_PTR (-EINVAL ); + } }if (pd->uobject && udata)
Signature · 1 line
1.5.2
PATCH 10/12 IB/ehca: Path migration support
In reply to Joachim FenkesRectify some modify_qp() issues related to path migration.
--- drivers/infiniband/hw/ehca/ehca_irq.c | 4 +- drivers/infiniband/hw/ehca/ehca_qp.c | 90 ++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 26 deletions(-)
drivers/infiniband/hw/ehca/ehca_irq.c +2 -2
@@ -294,8 +294,8 @@ static void parse_identifier(struct ehca_shca *shca, u64 eqe)case 0x11 :/* unaffiliated access error */ ehca_err (&shca->ib_device,"Unaffiliated access error." );break ; -case 0x12 :/* path migrating error */ -ehca_err (&shca->ib_device,"Path migration error." ); +case 0x12 :/* path migrating */ +ehca_err (&shca->ib_device,"Path migrating." );break ;case 0x13 :/* interface trace stopped */ ehca_err (&shca->ib_device,"Interface trace stopped." );
drivers/infiniband/hw/ehca/ehca_qp.c +66 -24
136 lines not on this page · raw message
Signature · 1 line
1.5.2
PATCH 11/12 IB/ehca: Serialize MR alloc and MR free hvCalls
In reply to Joachim FenkesSome firmware levels exhibit a race condition between H_ALLOC_RESOURCE(MR) and H_FREE_RESOURCE(MR). Work around this problem by locking these hvCalls against each other.
--- drivers/infiniband/hw/ehca/hcp_if.c | 28 +++++++++++++++++++++------- 1 files changed, 21 insertions(+), 7 deletions(-)
drivers/infiniband/hw/ehca/hcp_if.c +21 -7
@@ -120,15 +120,28 @@ static long ehca_plpar_hcall_norets(unsigned long opcode, unsigned long arg7) {long ret; -int i, sleep_msecs; +int i, sleep_msecs, do_lock; +unsigned long flags;ehca_gen_dbg ("opcode=%lx " HCALL7_REGS_FORMAT , opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7); +/* lock H_FREE_RESOURCE(MR) against itself and H_ALLOC_RESOURCE(MR) */ +if ((opcode ==H_FREE_RESOURCE ) && (arg7 ==5 )) { + arg7 =0 ;/* better not upset firmware */ + do_lock =1 ; + } +for (i =0 ; i <5 ; i++) { +if (do_lock) +spin_lock_irqsave (&hcall_lock, flags); + ret =plpar_hcall_norets (opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7); +if (do_lock) +spin_unlock_irqrestore (&hcall_lock, flags); +if (H_IS_LONG_BUSY (ret)) { sleep_msecs =get_longbusy_msecs (ret);msleep_interruptible (sleep_msecs);
@@ -161,23 +174,24 @@ static long ehca_plpar_hcall9(unsigned long opcode, unsigned long arg9) {long ret; -int i, sleep_msecs, lock_is_set =0 ; +int i, sleep_msecs, do_lock;unsigned long flags =0 ;ehca_gen_dbg ("INPUT -- opcode=%lx " HCALL9_REGS_FORMAT , opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); +/* lock H_ALLOC_RESOURCE(MR) against itself and H_FREE_RESOURCE(MR) */ + do_lock = ((opcode ==H_ALLOC_RESOURCE ) && (arg2 ==5 )); +for (i =0 ; i <5 ; i++) { -if ((opcode ==H_ALLOC_RESOURCE ) && (arg2 ==5 )) { +if (do_lock)spin_lock_irqsave (&hcall_lock, flags); - lock_is_set =1 ; - } ret =plpar_hcall9 (opcode, outs, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); -if (lock_is_set) +if (do_lock)spin_unlock_irqrestore (&hcall_lock, flags);if (H_IS_LONG_BUSY (ret)) {
@@ -807,7 +821,7 @@ u64 hipz_h_free_resource_mr(const struct ipz_adapter_handle adapter_handle,return ehca_plpar_hcall_norets (H_FREE_RESOURCE , adapter_handle.handle,/* r4 */ mr->ipz_mr_handle.handle,/* r5 */ -0 ,0 ,0 ,0 ,0 ); +0 ,0 ,0 ,0 ,5 ); } u64 hipz_h_reregister_pmr(const struct ipz_adapter_handle adapter_handle,
Signature · 1 line
1.5.2
PATCH 12/12 IB/ehca: Bump version number and change its format
In reply to Joachim FenkesNobody needed the SVNEHCA_ prefix anyway.
--- drivers/infiniband/hw/ehca/ehca_main.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-)
drivers/infiniband/hw/ehca/ehca_main.c +4 -2
@@ -49,10 +49,12 @@#include "ehca_tools.h" #include "hcp_if.h" +#define HCAD_VERSION "0024" +MODULE_LICENSE ("Dual BSD/GPL" );MODULE_AUTHOR ("Christoph Raisch <[email protected]>" );MODULE_DESCRIPTION ("IBM eServer HCA InfiniBand Device Driver" ); -MODULE_VERSION ("SVNEHCA_0023" ); +MODULE_VERSION (HCAD_VERSION );int ehca_open_aqp1 =0 ;int ehca_debug_level =0 ;
@@ -909,7 +911,7 @@ int __init ehca_module_init(void)int ret;printk (KERN_INFO "eHCA Infiniband Device Driver " -"(Rel.: SVNEHCA_0023)\n" ); +"(Version " HCAD_VERSION ")\n" ); ret =ehca_create_comp_pool ();if (ret) {
Signature · 1 line
1.5.2