[ofw] partial review of mlx4 branch
Fab Tillier
ftillier at microsoft.com
Tue Oct 18 07:27:17 PDT 2011
Leonid Keller wrote on Tue, 18 Oct 2011 at 06:26:13
> PSB
>
> -----Original Message-----
> From: Fab Tillier [mailto:ftillier at microsoft.com]
> Sent: Monday, October 17, 2011 3:05 AM
>
> Hi Leonid,
>
> You can use driver verifier to track memory allocations (including
> dereference after free and IRQL enforcement) for kernel driver, and app
> verifier for user-mode DLLs and applications.
>
> [LK] It started from that that Verifier didn't print anything in Win8 - seems like
> out of some bug.
> In Win7 it printed the pools that have unreleased buffers, but it doesn't help,
> because all our allocation we do via one function.
Right, because you abstract the memory allocation calls, rather than using the built-in tools. That's my point - eliminate the allocations. This also allows you to use different pool tags.
> Added mechanism prints the callers of unreleased buffers.
> We found several leakages with its help.
>
> For IBAT, I believe all IPHelper calls should be done in the kernel, so that path
> records don't need to be sent to user-mode unless the user needs to
> inspect/modify the contents. To that end, I think connection establishment
> IOCTLs should take as input the source and destination IP address and be
> able to figure out the rest. This would allow the kernel drivers to react
> appropriately to such requests as needed for their transport, be it IB or RoCE.
> An IOCTL interface for this is much better, really - think of WinVerbs exactly
> as you do of IBAL. Both have a connect IOCTL.
>
> [LK] The best place for IBAT service is bus driver - it is always working.
> But I'm not sure it can use IPHelper.
IPHelper is available to kernel callers, it can't be called at DISPATCH_LEVEL.
> All other drivers can be present or not.
> I'd suggest to use IBAT_EX so far till someone has time to develop it in kernel.
I'll work on this and submit a patch at some point. I have something rudimentary prototyped but need to polish it up. How strongly do people feel about manipulating path records in user-mode? My current direction has the paths entirely managed in the kernel (including caching), since path records are IB-specific and don't apply to RoCE or iWARP (yes, I'm still hoping some iWARP vendors join the project, <sigh>).
-Fab
> Cheers,
> -Fab
>
> Leonid Keller wrote on Sun, 16 Oct 2011 at 15:24:10
>
>> Hi Sean,
>>
>> Thank you for the comments.
>> I'm going to answer them one-by-one in another mail.
>> For now - some general notes.
>>
>> 1. Winverbs I don't think I broke IBA. Please, show me where, if I
>> missed something. Increasing of the version is needed to tell about new
>> field 'Transport'. As to dependency on IBAL/COMPLIB dlls: It's really
>> IBAT_EX is dependent on them, while Winverbs is dependent on IBAT_EX.
>> The latter is needed to add a seamless support to RoCE. Winverbs.dll is
>> supplied as a part of OFED suit; it was dependent on kernel IBAT service
>> anyway and I don't think it is too bad if it will be dependent on other
>> dlls of the suit. From the other side, it's not good when different user
>> space components use IBAT service as they want. Because the
>> implementation of the service can change. We really came to the idea of
>> IBAT_EX.dll, which hides the implementation of IBAT service, because of
>> the problems of current implementation. In OFED stack it is implemented
>> inside IPoIB driver, supports only IB transport and is present once per
>> machine. We need it to support two transports today - IB and RoCE - and
>> more in the future. We need to deal with situation when there is no
>> IPoIB driver loaded. We need to support configurations where several HCA
>> cards with several transports are working simultaneously. That's why we
>> developed IBAT_EX and changed applications to use it. You may change
>> WinVerbs.dll back and implement RoCE support inside of it. You may
>> remove complib dependency from IBAT_EX, but it will still need IBAL.
>> (One can also replace calling ibal.dll functions by sending ioctls, but
>> I personally do not like the idea).
>>
>> 2.Complib
>> I extended complib memory tracking mechanism to be able see memory
>> leakage printed.
>> Could you suggest, how can I do it using standard system functions ?
>>
>> 3. IBA
>> What IBAs were broken ?
>> How do you suggest to extend functionality while keeping IBA intact ?
>> Or I misunderstood your idea ?
>>
>>
>>
>> -----Original Message-----
>> From: ofw-bounces at lists.openfabrics.org [mailto:ofw-
>> bounces at lists.openfabrics.org] On Behalf Of Hefty, Sean
>> Sent: Tuesday, October 11, 2011 8:38 PM
>> To: ofw_list
>> Subject: [ofw] partial review of mlx4 branch
>>
>> See below for comments on the changes in branches/mlx4 compared to the
>> trunk. Hopefully all of my comments are marked with 'SH:'. I did not
>> review the hw subdirectories. The changes there are extensive.
>>
>> The biggest concerns from my personal perspective were:
>>
>> * winverbs cannot depend on the ibal or complib libraries
>> * ibverbs must maintain binary compatibility with existing applications
>> * we must support a mix of old and new libraries
>>
>> The biggest concern that I believe OFA should have is:
>>
>> * Binary compatibility with existing applications must be maintained.
>> This includes all library interfaces as well as the user to kernel ABI.
>> - Sean
>>
>>
>>
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/al/kernel/al_cm_cep.c
>> branches\mlx4/core/al/kernel/al_cm_cep.c ---
>> trunk/core/al/kernel/al_cm_cep.c 2011-09-13 09:15:33.785667700 -0700
>> +++ branches\mlx4/core/al/kernel/al_cm_cep.c 2011-10-10
>> 16:59:00.857865300 -0700 @@ -677,6 +677,16 @@ __reject_req(
>> p_mad->timeout_ms = 0;
>> p_mad->resp_expected = FALSE;
>> + /* Switch src and dst in GRH */
>> + if(p_mad->grh_valid)
>> + {
>> + ib_gid_t dest_gid = {0};
>>
>> SH: no need to initialize
>>
>> + memcpy(&dest_gid, &p_mad->p_grh->src_gid,
>> sizeof(ib_gid_t));
>> + memcpy(&p_mad->p_grh->src_gid, &p_mad->p_grh-
>>> dest_gid, sizeof(ib_gid_t));
>> + memcpy(&p_mad->p_grh->dest_gid, &dest_gid,
>> sizeof(ib_gid_t));
>> + }
>> +
>> __cep_send_mad( p_port_cep, p_mad );
>>
>> AL_EXIT( AL_DBG_CM ); @@ -3390,7 +3400,7 @@ __cep_queue_mad( //
>> TODO: Remove - manage above core kernel CM code /* NDI connection
>> request case */ if ( p_cep->state == CEP_STATE_LISTEN &&
>> - (p_cep->sid & ~0x0ffffffI64) ==
>> IB_REQ_CM_RDMA_SID_PREFIX )
>> + (p_cep->sid & IB_REQ_CM_RDMA_SID_PREFIX_MASK) ==
>> IB_REQ_CM_RDMA_SID_PREFIX )
>> { /* Try to complete pending IRP, if any */ mad_cm_req_t* p_req =
>> (mad_cm_req_t*)ib_get_mad_buf( p_mad ); ib_cm_rdma_req_t *p_rdma_req
>> = (ib_cm_rdma_req_t
>> *)p_req->pdata;
>> @@ -3401,7 +3411,7 @@ __cep_queue_mad(
>> (p_rdma_req->ipv != 0x40 && p_rdma_req->ipv != 0x60) ) {
>> AL_PRINT_EXIT( TRACE_LEVEL_ERROR,
>> AL_DBG_ERROR,
>> - ("NDI connection req is rejected:
>> maj_min_ver %d, ipv %#x \n",
>> + ("RDMA CM connection req is rejected:
>> maj_min_ver %d, ipv %#x \n",
>> p_rdma_req->maj_min_ver, p_rdma_req-
>> ipv ) );
>> return IB_UNSUPPORTED;
>> }
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/al/kernel/al_ndi_cm.c
>> branches\mlx4/core/al/kernel/al_ndi_cm.c ---
>> trunk/core/al/kernel/al_ndi_cm.c 2011-09-13 09:15:33.836672800 -0700
>> +++ branches\mlx4/core/al/kernel/al_ndi_cm.c 2011-10-10
>> 16:59:00.909870500 -0700 @@ -461,7 +461,8 @@ static VOID
>> __ndi_acquire_lock(
>> nd_csq_t *p_ndi_csq = (nd_csq_t*)Csq;
>>
>> KeAcquireSpinLock( &p_ndi_csq->lock, pIrql );
>> -} +}
>> +
>>
>> #ifdef NTDDI_WIN8
>> static IO_CSQ_RELEASE_LOCK __ndi_release_lock;
>> @@ -1111,7 +1112,7 @@ __ndi_fill_cm_req(
>>
>> memset( p_cm_req, 0, sizeof(*p_cm_req) ); - p_cm_req->service_id =
>> IB_REQ_CM_RDMA_SID_PREFIX | (p_req- prot << 16) | p_req->dst_port;
>> + p_cm_req->service_id = ib_cm_rdma_sid( p_req->prot, p_req- dst_port
>> ); p_cm_req->p_primary_path = p_path_rec;
>>
>> p_cm_req->qpn = qpn; @@ -1964,9 +1965,12 @@ ndi_listen_cm(
>> p_csq->state = NDI_CM_LISTEN; __ndi_release_lock( &p_csq-
>> csq, irql );
>> - if( (p_listen->svc_id & 0xFFFF) == 0 )
>> + if( ib_cm_rdma_sid_port( p_listen->svc_id ) == 0 )
>> {
>> - p_listen->svc_id |= (USHORT)cid | (USHORT)(cid >> 16);
>> + p_listen->svc_id = ib_cm_rdma_sid(
>> + ib_cm_rdma_sid_protocol( p_listen->svc_id ),
>> + (USHORT)cid | (USHORT)(cid >> 16)
>> + );
>> }
>>
>> ib_status = al_cep_listen( h_al, cid, p_listen );
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/al/kernel/al_pnp.c
>> branches\mlx4/core/al/kernel/al_pnp.c ---
>> trunk/core/al/kernel/al_pnp.c 2011-09-13 09:15:33.881677300 -0700 +++
>> branches\mlx4/core/al/kernel/al_pnp.c 2011-10-10 16:59:00.957875300
>> -0700 @@ -1438,6 +1438,10 @@ __pnp_check_ports(
>> ( (p_new_port_attr->link_state == IB_LINK_ARMED) ||
>> (p_new_port_attr->link_state == IB_LINK_ACTIVE) )
> ) {
>> +
>> + AL_PRINT( TRACE_LEVEL_INFORMATION,
>> AL_DBG_PNP,
>> + ("pkey or gid changes\n") );
>> +
>> /* A different number of P_Keys indicates a change.*/ if(
>> p_old_port_attr->num_pkeys != p_new_port_attr->num_pkeys ) { @@
>> -1486,6 +1490,8 @@ __pnp_check_ports( if( (p_old_port_attr- lid !=
>> p_new_port_attr->lid) || (p_old_port_attr->lmc !=
>> p_new_port_attr->lmc) ) {
>> + AL_PRINT( TRACE_LEVEL_INFORMATION,
>> AL_DBG_PNP,
>> + ("lid/lmc changed \n") );
>> event_rec.pnp_event = IB_PNP_LID_CHANGE;
>> __pnp_process_port_forward( &event_rec ); } @@ -1493,6 +1499,8 @@
>> __pnp_check_ports( if( (p_old_port_attr->sm_lid !=
>> p_new_port_attr->sm_lid) || (p_old_port_attr- sm_sl !=
>> p_new_port_attr- sm_sl) ) {
>> + AL_PRINT( TRACE_LEVEL_INFORMATION,
>> AL_DBG_PNP,
>> + ("sm_lid/sm_sl changed \n") );
>> event_rec.pnp_event = IB_PNP_SM_CHANGE;
>> __pnp_process_port_forward( &event_rec ); } @@ -1500,6 +1508,8 @@
>> __pnp_check_ports( if( p_old_port_attr->subnet_timeout !=
>> p_new_port_attr->subnet_timeout ) {
>> + AL_PRINT( TRACE_LEVEL_INFORMATION,
>> AL_DBG_PNP,
>> + ("subnet_timeout changed \n") );
>> event_rec.pnp_event = IB_PNP_SUBNET_TIMEOUT_CHANGE;
>> __pnp_process_port_forward( &event_rec );
> }
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/al/kernel/al_proxy.c
>> branches\mlx4/core/al/kernel/al_proxy.c ---
>> trunk/core/al/kernel/al_proxy.c 2011-09-13 09:15:34.109700100 -0700 +++
>> branches\mlx4/core/al/kernel/al_proxy.c 2011-10-10 16:59:01.211900700
>> -0700 @@ -424,6 +424,10 @@ proxy_pnp_port_cb(
>>
>> AL_ENTER( AL_DBG_PROXY_CB );
>> + AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_PNP,
>> + ("p_pnp_rec->pnp_event = 0x%x (%s)\n",
>> + p_pnp_rec->pnp_event, ib_get_pnp_event_str( p_pnp_rec-
>> pnp_event )) ); + p_context = p_pnp_rec->pnp_context;
>>
>> /*
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/al/kernel/al_sa_req.c
>> branches\mlx4/core/al/kernel/al_sa_req.c ---
>> trunk/core/al/kernel/al_sa_req.c 2011-09-13 09:15:33.980687200 -0700
>> +++ branches\mlx4/core/al/kernel/al_sa_req.c 2011-10-10
>> 16:59:01.096889200 -0700 @@ -234,26 +234,42 @@ sa_req_mgr_pnp_cb(
>> sa_req_svc_t *p_sa_req_svc;
>> ib_av_attr_t av_attr;
>> ib_pd_handle_t h_pd;
>> - ib_api_status_t status; + ib_api_status_t status = IB_SUCCESS;
>> + ib_pnp_port_rec_t *p_port_rec = (ib_pnp_port_rec_t*)p_pnp_rec;
>>
>> AL_ENTER( AL_DBG_SA_REQ );
>> CL_ASSERT( p_pnp_rec );
>> CL_ASSERT( p_pnp_rec->pnp_context == &gp_sa_req_mgr->obj );
>> + AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_PNP,
>> + ("p_pnp_rec->pnp_event = 0x%x (%s)\n",
>> + p_pnp_rec->pnp_event, ib_get_pnp_event_str( p_pnp_rec-
>> pnp_event )) ); + /* Dispatch based on the PnP event type. */
>> switch( p_pnp_rec->pnp_event ) { case IB_PNP_PORT_ADD:
>> - status = create_sa_req_svc(
>> (ib_pnp_port_rec_t*)p_pnp_rec );
>> + if ( p_port_rec->p_port_attr->transport ==
>> RDMA_TRANSPORT_RDMAOE )
>> + { // RoCE port
>> + AL_PRINT( TRACE_LEVEL_WARNING,
>> AL_DBG_ERROR,
>> + ("create_sa_req_svc is not called for RoCE
>> port %d\n", p_port_rec->p_port_attr->port_num ) );
>>
>> SH: Please change the print from warning / error to indicate that this is the
>> normal behavior.
>>
>> + }
>> + else
>> + {
>> + status = create_sa_req_svc( p_port_rec );
>> if( status != IB_SUCCESS )
>> {
>> AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
>> - ("create_sa_req_svc failed: %s\n",
>> ib_get_err_str(status)) );
>> + ("create_sa_req_svc for port %d
>> failed: %s\n",
>> + p_port_rec->p_port_attr-
>> port_num, ib_get_err_str(status)) ); + } } break;
>>
>> case IB_PNP_PORT_REMOVE:
>> - CL_ASSERT( p_pnp_rec->context );
>> + // context will be NULL for RoCE port
>> + if ( !p_pnp_rec->context )
>> + break;
>>
>> SH: Move this check to the top of the function to avoid duplicating it. If the
>> context is set by IB_PNP_PORT_ADD, just add that to the check.
>>
>> p_sa_req_svc = p_pnp_rec->context;
>> ref_al_obj( &p_sa_req_svc->obj );
>> p_sa_req_svc->obj.pfn_destroy( &p_sa_req_svc->obj, NULL
>> );
>> @@ -263,15 +279,15 @@ sa_req_mgr_pnp_cb(
>>
>> case IB_PNP_PORT_ACTIVE:
>> case IB_PNP_SM_CHANGE:
>> - CL_ASSERT( p_pnp_rec->context );
>> + // context will be NULL for RoCE port
>> + if ( !p_pnp_rec->context )
>> + break;
>> AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_SA_REQ,
>> ("updating SM information\n") );
>>
>> p_sa_req_svc = p_pnp_rec->context;
>> - p_sa_req_svc->sm_lid =
>> - ((ib_pnp_port_rec_t*)p_pnp_rec)->p_port_attr-
>>> sm_lid;
>> - p_sa_req_svc->sm_sl =
>> - ((ib_pnp_port_rec_t*)p_pnp_rec)->p_port_attr-
>>> sm_sl;
>> + p_sa_req_svc->sm_lid = p_port_rec->p_port_attr->sm_lid;
>> + p_sa_req_svc->sm_sl = p_port_rec->p_port_attr->sm_sl;
>>
>> /* Update the address vector. */
>> status = ib_query_av( p_sa_req_svc->h_av, &av_attr, &h_pd
>> );
>> @@ -298,7 +314,9 @@ sa_req_mgr_pnp_cb(
>> case IB_PNP_PORT_INIT:
>> case IB_PNP_PORT_ARMED:
>> case IB_PNP_PORT_DOWN:
>> - CL_ASSERT( p_pnp_rec->context );
>> + // context will be NULL for RoCE port
>> + if ( !p_pnp_rec->context )
>> + break;
>> p_sa_req_svc = p_pnp_rec->context;
>> p_sa_req_svc->sm_lid = 0;
>> p_sa_req_svc->sm_sl = 0;
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/al/kernel/al_smi.c
>> branches\mlx4/core/al/kernel/al_smi.c ---
>> trunk/core/al/kernel/al_smi.c 2011-09-13 09:15:33.822671400 -0700 +++
>> branches\mlx4/core/al/kernel/al_smi.c 2011-10-10 16:59:00.895869100
>> -0700 @@ -905,7 +905,10 @@ __complete_send_mad(
>>
>> /* Construct a send work completion. */
>> cl_memclr( &wc, sizeof( ib_wc_t ) );
>> - wc.wr_id = p_mad_wr->send_wr.wr_id;
>> + if (p_mad_wr) {
>> + // Handling the special race where p_mad_wr that comes
>> from spl_qp can be NULL
>> + wc.wr_id = p_mad_wr->send_wr.wr_id;
>> + }
>>
>> SH: Please provide more details on why this can happen. I'm not asking
>> for a code comment, just a response. It may make sense to apply this
>> change separate, so someone can find the details in the change log.
>>
>> wc.wc_type = IB_WC_SEND;
>> wc.status = wc_status;
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/bus/kernel/bus_pnp.c
>> branches\mlx4/core/bus/kernel/bus_pnp.c ---
>> trunk/core/bus/kernel/bus_pnp.c 2011-09-13 09:15:31.623451500 -0700 +++
>> branches\mlx4/core/bus/kernel/bus_pnp.c 2011-10-10 16:58:57.978577400
>> -0700 @@ -44,7 +44,6 @@
>> #include "bus_port_mgr.h" #include "bus_iou_mgr.h" #include
>> "complib/cl_memory.h" -#include "al_cm_cep.h" #include "al_mgr.h"
>> #include "bus_ev_log.h" @@ -52,7 +51,6 @@ #include "rdma/verbs.h"
>> #include "iba/ib_al_ifc.h" #include "iba/ib_ci_ifc.h" -#include
>> "iba/ib_cm_ifc.h" #include "al_cm_cep.h" #include "al_mgr.h" #include
>> "bus_ev_log.h"
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/bus/kernel/bus_port_mgr.c
>> branches\mlx4/core/bus/kernel/bus_port_mgr.c ---
>> trunk/core/bus/kernel/bus_port_mgr.c 2011-09-13 09:15:31.580447200
>> -0700 +++ branches\mlx4/core/bus/kernel/bus_port_mgr.c 2011-10-10
>> 16:58:57.922571800 -0700 @@ -772,6 +772,15 @@ port_mgr_port_add(
>> }
>>
>> /*
>> + * Don't create PDO for IPoIB (and start IPoIB) while over a RoCE port.
>> + */
>> + if ( p_pnp_rec->p_port_attr->transport != RDMA_TRANSPORT_IB ){
>> + BUS_TRACE_EXIT( BUS_DBG_PNP,("IPoIb is not started for
>> RoCE port. %s ca_guid %I64x port(%d)\n",
>> + p_bfi-
>>> whoami, p_bfi->ca_guid, p_pnp_rec->p_port_attr->port_num));
>> + return IB_SUCCESS;
>> + }
>> +
>> + /*
>> * Allocate a PNP context for this object. pnp_rec.context is obj
>> unique. */ if ( !p_ctx ) {
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/bus/kernel/SOURCES
>> branches\mlx4/core/bus/kernel/SOURCES ---
>> trunk/core/bus/kernel/SOURCES 2011-09-13 09:15:31.567445900 -0700 +++
>> branches\mlx4/core/bus/kernel/SOURCES 2011-10-10 16:58:57.908570400
>> -0700 @@ -17,7 +17,7 @@ SOURCES= ibbus.rc \
>> bus_iou_mgr.c \
>> bus_stat.c
>> -
>> INCLUDES=..\..\..\inc;..\..\..\inc\kernel;..\..\al;..\..\al\kernel;..\..\
>> bus\kernel\ $O;
>> +INCLUDES=..\..\..\inc;..\..\..\inc\kernel;..\..\al;..\..\al\kernel;..\..
>> \bus\kerne l\$O;..\..\..\hw\mlx4\inc;..\..\..\inc\kernel\iba;
>>
>> C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -
>> DNEED_CL_OBJ
>>
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/complib/cl_memory.c
>> branches\mlx4/core/complib/cl_memory.c ---
>> trunk/core/complib/cl_memory.c 2011-09-13 09:15:30.739363100 -0700 +++
>> branches\mlx4/core/complib/cl_memory.c 2011-10-10 16:58:57.086488200
>> -0700 @@ -92,6 +92,7 @@ __cl_mem_track_start( void )
>> if( status != CL_SUCCESS ) { __cl_free_priv( gp_mem_tracker );
>> + gp_mem_tracker = NULL; return; } } @@ -179,8 +180,15 @@
>> cl_mem_display( void ) */ p_hdr = PARENT_STRUCT( p_map_item,
>> cl_malloc_hdr_t,
>> map_item );
>>
>> - cl_msg_out( "\tMemory block at %p allocated in file %s line %d\n",
>> - p_hdr->p_mem, p_hdr->file_name, p_hdr-
>>> line_num );
>> +#ifdef CL_KERNEL
>> + DbgPrintEx(DPFLTR_IHVNETWORK_ID,
>> DPFLTR_ERROR_LEVEL,
>> + "\tMemory block for '%s' at %p of size %#x allocated
>> in file %s line %d\n",
>> + (p_hdr->tag == NULL) ? "Unknown" : p_hdr->tag,
>> + p_hdr->p_mem, p_hdr->size, p_hdr->file_name,
>> p_hdr->line_num );
>> +#else
>> + cl_msg_out( "\tMemory block at %p of size %#x allocated in
>> file %s line %d\n",
>> + p_hdr->p_mem, p_hdr->size, p_hdr->file_name,
>> p_hdr->line_num );
>> +#endif
>>
>> p_map_item = cl_qmap_next( p_map_item ); } @@ -189,18 +197,21 @@
>> cl_mem_display( void ) }
>> +
>> /*
>> * Allocates memory and stores information about the allocation in a list.
>> * The contents of the list can be printed out by calling the function
>> * "MemoryReportUsage". Memory allocation will succeed even if the list
>> * cannot be created.
>> */
>> +static
>> void*
>> -__cl_malloc_trk(
>> +__cl_malloc_trk_internal(
>> IN const char* const p_file_name,
>> IN const int32_t line_num,
>> IN const size_t size,
>> - IN const boolean_t pageable )
>> + IN const boolean_t pageable,
>> + IN const char* tag )
>> { cl_malloc_hdr_t *p_hdr; cl_list_item_t *p_list_item; @@ -264,6
>> +275,8 @@ __cl_malloc_trk( * not in the list without dereferencing
>> memory we do not own. */ p_hdr->p_mem = p_mem;
>> + p_hdr->size = (uint32_t)size;
>> + p_hdr->tag = (char*)tag;
>>
>> /* Insert the header structure into our allocation list. */
>> cl_qmap_insert( &gp_mem_tracker->alloc_map, (uintptr_t)p_mem,
>> &p_hdr->map_item );
>> @@ -272,6 +285,34 @@ __cl_malloc_trk(
>> return( p_mem );
>> }
>> +/*
>> + * Allocates memory and stores information about the allocation in a list.
>> + * The contents of the list can be printed out by calling the function
>> + * "MemoryReportUsage". Memory allocation will succeed even if the list
>> + * cannot be created.
>> + */
>> +void*
>> +__cl_malloc_trk(
>> + IN const char* const p_file_name,
>> + IN const int32_t line_num,
>> + IN const size_t size,
>> + IN const boolean_t pageable )
>> +{
>> + return __cl_malloc_trk_internal( p_file_name,
>> + line_num, size, pageable, NULL );
>> +}
>> +
>> +void*
>> +__cl_malloc_trk_ex(
>> + IN const char* const p_file_name,
>> + IN const int32_t line_num,
>> + IN const size_t size,
>> + IN const boolean_t pageable,
>> + IN const char* tag )
>> +{
>> + return __cl_malloc_trk_internal( p_file_name,
>> + line_num, size, pageable, tag );
>> +}
>>
>> /*
>> * Allocate non-tracked memory.
>> @@ -301,6 +342,22 @@ __cl_zalloc_trk(
>> return( p_buffer );
>> }
>> +void*
>> +__cl_zalloc_trk_ex(
>> + IN const char* const p_file_name,
>> + IN const int32_t line_num,
>> + IN const size_t size,
>> + IN const boolean_t pageable,
>> + IN const char* tag )
>> +{
>> + void *p_buffer;
>> +
>> + p_buffer = __cl_malloc_trk_ex( p_file_name, line_num, size,
>> pageable, tag );
>> + if( p_buffer )
>> + cl_memclr( p_buffer, size );
>> +
>> + return( p_buffer );
>> +}
>>
>> SH: We need to stop abstracting memory allocations. There are already
>> tools available for tracking memory allocations, especially for the
>> kernel.
>>
>> void*
>> __cl_zalloc_ntrk(
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/complib/cl_memtrack.h
>> branches\mlx4/core/complib/cl_memtrack.h ---
>> trunk/core/complib/cl_memtrack.h 2011-09-13 09:15:30.757364900 -0700
>> +++ branches\mlx4/core/complib/cl_memtrack.h 2011-10-10
>> 16:58:57.108490400 -0700 @@ -76,6 +76,8 @@ typedef struct _cl_malloc_hdr
>> void *p_mem;
>> char file_name[FILE_NAME_LENGTH];
>> int32_t line_num;
>> + int32_t size;
>> + char *tag;
>>
>> } cl_malloc_hdr_t;
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/dirs branches\mlx4/core/dirs ---
>> trunk/core/dirs 2011-09-13 09:15:40.866375700 -0700 +++
>> branches\mlx4/core/dirs 2011-10-10 16:59:07.969576400 -0700 @@ -4,5
>> +4,6 @@ DIRS=\
>> bus \ iou \ ibat
> \ + ibat_ex \ winverbs \ winmad
>> Only in branches\mlx4/core: ibat_ex diff -up -r -X
>> \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I '\$Id'
>> trunk/core/winverbs/kernel/wv_device.c
>> branches\mlx4/core/winverbs/kernel/wv_device.c ---
>> trunk/core/winverbs/kernel/wv_device.c 2011-09-13 09:15:26.752964500
>> -0700 +++ branches\mlx4/core/winverbs/kernel/wv_device.c 2011- 10-10
>> 16:58:53.501129700 -0700 @@ -135,10 +135,12 @@ static void
>> WvDeviceEventHandler(ib_even
>>> WvDeviceCompleteRequests(&dev->pPorts[i], STATUS_SUCCESS, event);
>>> } } else { + if(pEvent->port_number <= dev->PortCount) {
>>> WvDeviceCompleteRequests(&dev->pPorts[pEvent-
> port_number - 1],
>>
>> STATUS_SUCCESS, event);
>> }
>> }
>> +}
>>
>> SH: This check is not needed. Upper level drivers must be able to trust that
>> the lower drivers will not give them completely bogus data.
>>
>> static WV_DEVICE *WvDeviceAlloc(WV_PROVIDER *pProvider) { @@ - 216,6
>> +218,8 @@ static NTSTATUS WvDeviceCreatePorts(WV_D return
>> STATUS_NO_MEMORY; }
>> + ASSERT(ControlDevice != NULL);
>> +
>> WDF_IO_QUEUE_CONFIG_INIT(&config, WdfIoQueueDispatchManual); for (i
>> = 0; i < pDevice->PortCount; i++) { pDevice->pPorts[i].Flags = 0; @@
>> -537,8 +541,8 @@ static void WvConvertPortAttr(WV_IO_PORT
>> pAttributes->ActiveWidth = pPortAttr->active_width;
>> pAttributes->ActiveSpeed = pPortAttr->active_speed;
>> pAttributes->PhysicalState = pPortAttr->phys_state;
>> + pAttributes->Transport = (UINT8) pPortAttr->transport;
>> pAttributes->Reserved[0] = 0;
>> - pAttributes->Reserved[1] = 0;
>>
>> SH: This is fine, but user space must still support older kernels which set this
>> field to 0.
>>
>> }
>>
>> void WvDeviceQuery(WV_PROVIDER *pProvider, WDFREQUEST Request)
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/winverbs/kernel/wv_driver.c
>> branches\mlx4/core/winverbs/kernel/wv_driver.c ---
>> trunk/core/winverbs/kernel/wv_driver.c 2011-09-13 09:15:26.724961700
>> -0700 +++ branches\mlx4/core/winverbs/kernel/wv_driver.c 2011- 10-10
>> 16:58:53.417121300 -0700 @@ -31,8 +31,10 @@
>> #include <wdf.h>
>> #include <wdmsec.h>
>> #include <ntstatus.h>
>> +#include <initguid.h>
>>
>> #include "index_list.c" +#include <rdma/verbs.h> #include "wv_driver.h"
>> #include "wv_ioctl.h" #include "wv_provider.h" @@ -44,10 +46,6 @@
>> #include "wv_qp.h" #include "wv_ep.h"
>> -#include <initguid.h>
>> -#include <rdma/verbs.h>
>> -#include <iba/ib_cm_ifc.h>
>> -
>>
>> SH: These changes are not necessary, and we need ib_cm_ifc.h, so it
>> should explicitly be included.
>>
>> WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WV_RDMA_DEVICE,
>> WvRdmaDeviceGetContext)
>>
>> WDFDEVICE ControlDevice = NULL;
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/winverbs/user/SOURCES
>> branches\mlx4/core/winverbs/user/SOURCES ---
>> trunk/core/winverbs/user/SOURCES 2011-09-13 09:15:27.658055000 -0700
>> +++ branches\mlx4/core/winverbs/user/SOURCES 2011-10-10
>> 16:58:54.372216800 -0700 @@ -29,7 +29,15 @@ INCLUDES =
>> ..;..\..\..\inc;..\..\..\inc\
>>
>> USER_C_FLAGS = $(USER_C_FLAGS) -DEXPORT_WV_SYMBOLS
>> +!if !$(FREEBUILD)
>> +C_DEFINES=$(C_DEFINES) -D_DEBUG -DDEBUG -DDBG
>> +!endif
>> +
>> TARGETLIBS = \
>> $(SDK_LIB_PATH)\kernel32.lib \
>> $(SDK_LIB_PATH)\uuid.lib \
>> - $(SDK_LIB_PATH)\ws2_32.lib
>> + $(SDK_LIB_PATH)\ws2_32.lib \
>> + $(SDK_LIB_PATH)\iphlpapi.lib \
>> + $(TARGETPATH)\*\ibat_ex.lib \
>> + $(TARGETPATH)\*\ibal.lib \
>> + $(TARGETPATH)\*\complib.lib
>>
>> SH: No. Winverbs should not depend on ibal or complib. It shouldn't
>> even depend on ibat_ex if that can be helped. It should be as
>> stand-alone as possible to make it easier to use. This is why winverbs
>> sent IOCTLs directly to the kernel for translations.
>>
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/winverbs/user/wv_provider.cpp
>> branches\mlx4/core/winverbs/user/wv_provider.cpp ---
>> trunk/core/winverbs/user/wv_provider.cpp 2011-09-13 09:15:27.769066100
>> -0700 +++ branches\mlx4/core/winverbs/user/wv_provider.cpp 2011- 10-10
>> 16:58:54.380217600 -0700 @@ -35,6 +35,7 @@
>> #include "wv_device.h"
>> #include "wv_ep.h"
>> #include "wv_ioctl.h"
>> +#include <iba/ibat_ex.h>
>>
>> CWVProvider::CWVProvider() { @@ -136,42 +137,14 @@ out: STDMETHODIMP
>> CWVProvider:: TranslateAddress(const SOCKADDR* pAddress,
>> WV_DEVICE_ADDRESS* pDeviceAddress) {
>> - HANDLE hIbat;
>> - IOCTL_IBAT_IP_TO_PORT_IN addr;
>> IBAT_PORT_RECORD port;
>> - DWORD bytes; - HRESULT hr; - - hIbat = CreateFileW(IBAT_WIN32_NAME,
>> GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE,
>> NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hIbat
>> == INVALID_HANDLE_VALUE) { - return
>> HRESULT_FROM_WIN32(GetLastError()); - } - - addr.Version =
>> IBAT_IOCTL_VERSION; - if (pAddress- sa_family == AF_INET) {
>> - addr.Address.IpVersion = 4; - RtlCopyMemory(addr.Address.Address +
>> 12, - &((SOCKADDR_IN *)pAddress)-
>>> sin_addr, 4);
>> - } else { - addr.Address.IpVersion = 6;
>> - RtlCopyMemory(addr.Address.Address, - &((SOCKADDR_IN6
>> *)pAddress)-
>>> sin6_addr, 16);
>> - }
>> -
>> - if (DeviceIoControl(hIbat, IOCTL_IBAT_IP_TO_PORT,
>> - &addr, sizeof addr, &port,
>> sizeof port, &bytes, NULL)) {
>> - hr = WV_SUCCESS;
>> + HRESULT hr = IBAT_EX::IpToPort( pAddress, &port );
>> + if ( FAILED( hr ) )
>> + return hr;
>> pDeviceAddress->DeviceGuid = port.CaGuid;
>> pDeviceAddress->Pkey = port.PKey;
>> pDeviceAddress->PortNumber = port.PortNum;
>> - } else {
>> - hr = HRESULT_FROM_WIN32(GetLastError());
>> - }
>> -
>> - CloseHandle(hIbat);
>> - return hr;
>> + return WV_SUCCESS;
>> }
>>
>> STDMETHODIMP CWVProvider::
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/core/winverbs/wv_ioctl.h
>> branches\mlx4/core/winverbs/wv_ioctl.h ---
>> trunk/core/winverbs/wv_ioctl.h 2011-09-13 09:15:28.105099700 -0700 +++
>> branches\mlx4/core/winverbs/wv_ioctl.h 2011-10-10 16:58:54.643243900
>> -0700 @@ -436,7 +436,8 @@ typedef struct _WV_IO_PORT_ATTRIBUTES
>> UINT8 ActiveWidth;
>> UINT8 ActiveSpeed;
>> UINT8 PhysicalState;
>> - UINT8 Reserved[2];
>> + UINT8 Transport;
>> + UINT8 Reserved[1];
>>
>> } WV_IO_PORT_ATTRIBUTES;
>> SH: Again, fine, but we need to handle the case where it is not set by
>> an older driver. (I'm writing this as I'm reviewing the code, so it may
>> be handled below.)
>>
>>
>> <snip hw/mlx4 diffs>
>>
>>
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/kernel/hca_pnp.c
>> branches\mlx4/hw/mthca/kernel/hca_pnp.c ---
>> trunk/hw/mthca/kernel/hca_pnp.c 2011-09-13 09:16:17.408029500 -0700 +++
>> branches\mlx4/hw/mthca/kernel/hca_pnp.c 2011-10-10 16:59:46.774456500
>> -0700 @@ -12,6 +12,7 @@
>>
>> #include "hca_driver.h"
>> #include "mthca_dev.h"
>> +#include <rdma\verbs.h>
>>
>> #if defined(EVENT_TRACING) #ifdef offsetof @@ -21,7 +22,6 @@ #endif
>> #include "mthca.h" #include <initguid.h> -#include <rdma\verbs.h>
>> #include <wdmguid.h>
>>
>> extern const char *mthca_version;
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/kernel/hca_verbs.c
>> branches\mlx4/hw/mthca/kernel/hca_verbs.c ---
>> trunk/hw/mthca/kernel/hca_verbs.c 2011-09-13 09:16:17.298018500 -0700
>> +++ branches\mlx4/hw/mthca/kernel/hca_verbs.c 2011-10-10
>> 16:59:46.656444700 -0700 @@ -1093,7 +1093,7 @@ mlnx_create_spl_qp (
>> IN const uint8_t port_num, IN const void *qp_context,
>> IN ci_async_event_cb_t
>> event_handler,
>> - IN const ib_qp_create_t
>> *p_create_attr,
>> + IN OUT ib_qp_create_t
>> *p_create_attr,
>> OUT ib_qp_attr_t *p_qp_attr, OUT ib_qp_handle_t *ph_qp ) {
>> @@ -1118,7 +1118,7 @@ mlnx_create_qp ( IN const ib_pd_handle_t
>> h_pd, IN const void *qp_context, IN
> ci_async_event_cb_t
>> event_handler,
>> - IN const ib_qp_create_t
>> *p_create_attr,
>> + IN OUT ib_qp_create_t
>> *p_create_attr,
>> OUT ib_qp_attr_t *p_qp_attr, OUT ib_qp_handle_t *ph_qp,
>> IN OUT ci_umv_buf_t
>> *p_umv_buf )
>> @@ -1641,6 +1641,19 @@ mlnx_port_get_transport (
>> UNREFERENCED_PARAMETER(port_num);
>> return RDMA_TRANSPORT_IB;
>> }
>> + +uint8_t +mlnx_get_sl_for_ip_port ( + IN const ib_ca_handle_t h_ca,
>> + IN const uint8_t ca_port_num, + IN const uint16_t ip_port_num)
>> +{ + UNREFERENCED_PARAMETER(h_ca);
>> + UNREFERENCED_PARAMETER(ca_port_num);
>> + UNREFERENCED_PARAMETER(ip_port_num); + return 0xff; +}
> +
>> void
>> setup_ci_interface(
>> IN const ib_net64_t
>> ca_guid,
>> @@ -1697,7 +1710,7 @@ setup_ci_interface(
>>
>> p_interface->local_mad = mlnx_local_mad;
>> p_interface->rdma_port_get_transport = mlnx_port_get_transport;
>> -
>> + p_interface->get_sl_for_ip_port = mlnx_get_sl_for_ip_port;
>>
>> mlnx_memory_if(p_interface);
>> mlnx_direct_if(p_interface);
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/kernel/mthca_provider.c
>> branches\mlx4/hw/mthca/kernel/mthca_provider.c ---
>> trunk/hw/mthca/kernel/mthca_provider.c 2011-09-13 09:16:17.761064800
>> -0700 +++ branches\mlx4/hw/mthca/kernel/mthca_provider.c 2011- 10-10
>> 16:59:47.018480900 -0700 @@ -766,7 +766,7 @@ static struct ib_cq
>> *mthca_create_cq(str
>> cq->set_ci_db_index = ucmd.set_db_index;
>> cq->arm_db_index = ucmd.arm_db_index;
>> cq->u_arm_db_index = ucmd.u_arm_db_index;
>> - cq->p_u_arm_sn = (int*)((char*)u_arm_db_page +
>> BYTE_OFFSET(ucmd.u_arm_db_page)); + cq->p_u_arm_sn = (volatile u32
>> *)((char*)u_arm_db_page + BYTE_OFFSET(ucmd.u_arm_db_page));
>> }
>>
>> for (nent = 1; nent <= entries; nent <<= 1)
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/kernel/mthca_provider.h
>> branches\mlx4/hw/mthca/kernel/mthca_provider.h ---
>> trunk/hw/mthca/kernel/mthca_provider.h 2011-09-13 09:16:17.850073700
>> -0700 +++ branches\mlx4/hw/mthca/kernel/mthca_provider.h 2011- 10-10
>> 16:59:47.110490100 -0700 @@ -203,7 +203,7 @@ struct mthca_cq {
>> __be32 *arm_db;
>> int arm_sn;
>> int u_arm_db_index;
>> - int *p_u_arm_sn;
>> + volatile u32 *p_u_arm_sn;
>>
>> union mthca_buf queue;
>> struct mthca_mr mr;
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/kernel/mthca_qp.c
>> branches\mlx4/hw/mthca/kernel/mthca_qp.c ---
>> trunk/hw/mthca/kernel/mthca_qp.c 2011-09-13 09:16:18.478136500 -0700
>> +++ branches\mlx4/hw/mthca/kernel/mthca_qp.c 2011-10-10
>> 16:59:47.636542700 -0700 @@ -10,18 +10,18 @@
>> * COPYING in the main directory of this source tree, or the
>> * OpenIB.org BSD license below:
>> *
>> - * Redistribution and use in source and binary forms, with or
>> - * without modification, are permitted provided that the following
>> - * conditions are met:
>> + * Redistribution and use in source and binary forms, with or
>> + * without modification, are permitted provided that the following
>> + * conditions are met:
>> *
>> - * - Redistributions of source code must retain the above
>> - * copyright notice, this list of conditions and the following
>> - * disclaimer.
>> + * - Redistributions of source code must retain the above
>> + * copyright notice, this list of conditions and the following
>> + * disclaimer.
>> *
>> - * - Redistributions in binary form must reproduce the above
>> - * copyright notice, this list of conditions and the following
>> - * disclaimer in the documentation and/or other materials
>> - * provided with the distribution.
>> + * - Redistributions in binary form must reproduce the above
>> + * copyright notice, this list of conditions and the following
>> + * disclaimer in the documentation and/or other materials
>> + * provided with the distribution.
>> * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
>> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
> WARRANTIES
>> OF
>> @@ -53,36 +53,36 @@
>>
>> enum {
>> MTHCA_MAX_DIRECT_QP_SIZE = 4 * PAGE_SIZE,
>> - MTHCA_ACK_REQ_FREQ = 10,
>> - MTHCA_FLIGHT_LIMIT = 9,
>> - MTHCA_UD_HEADER_SIZE = 72, /* largest UD header possible */
>> + MTHCA_ACK_REQ_FREQ = 10,
>> + MTHCA_FLIGHT_LIMIT = 9,
>> + MTHCA_UD_HEADER_SIZE = 72, /* largest UD header possible
>> */
>> MTHCA_INLINE_HEADER_SIZE = 4, /* data segment overhead for inline */
>> MTHCA_INLINE_CHUNK_SIZE = 16 /* inline data segment chunk */
> };
>>
>> enum {
>> - MTHCA_QP_STATE_RST = 0,
>> + MTHCA_QP_STATE_RST = 0,
>> MTHCA_QP_STATE_INIT = 1,
>> - MTHCA_QP_STATE_RTR = 2,
>> - MTHCA_QP_STATE_RTS = 3,
>> - MTHCA_QP_STATE_SQE = 4,
>> - MTHCA_QP_STATE_SQD = 5,
>> - MTHCA_QP_STATE_ERR = 6,
>> + MTHCA_QP_STATE_RTR = 2,
>> + MTHCA_QP_STATE_RTS = 3,
>> + MTHCA_QP_STATE_SQE = 4,
>> + MTHCA_QP_STATE_SQD = 5,
>> + MTHCA_QP_STATE_ERR = 6,
>> MTHCA_QP_STATE_DRAINING = 7
>> };
>>
>> enum {
>> - MTHCA_QP_ST_RC = 0x0,
>> - MTHCA_QP_ST_UC = 0x1,
>> - MTHCA_QP_ST_RD = 0x2,
>> - MTHCA_QP_ST_UD = 0x3,
>> + MTHCA_QP_ST_RC = 0x0,
>> + MTHCA_QP_ST_UC = 0x1,
>> + MTHCA_QP_ST_RD = 0x2,
>> + MTHCA_QP_ST_UD = 0x3,
>> MTHCA_QP_ST_MLX = 0x7
>> };
>>
>> enum {
>> MTHCA_QP_PM_MIGRATED = 0x3,
>> - MTHCA_QP_PM_ARMED = 0x0,
>> - MTHCA_QP_PM_REARM = 0x1
>> + MTHCA_QP_PM_ARMED = 0x0,
>> + MTHCA_QP_PM_REARM = 0x1
>> };
>>
>> enum { @@ -105,24 +105,24 @@ enum { #pragma pack(push,1) struct
>> mthca_qp_path { __be32 port_pkey;
>> - u8 rnr_retry;
>> - u8 g_mylmc;
>> + u8 rnr_retry;
>> + u8 g_mylmc;
>> __be16 rlid;
>> - u8 ackto;
>> - u8 mgid_index;
>> - u8 static_rate;
>> - u8 hop_limit;
>> + u8 ackto;
>> + u8 mgid_index;
>> + u8 static_rate;
>> + u8 hop_limit;
>> __be32 sl_tclass_flowlabel;
>> - u8 rgid[16];
>> + u8 rgid[16];
>> } ;
>>
>> struct mthca_qp_context {
>> __be32 flags;
>> __be32 tavor_sched_queue; /* Reserved on Arbel */
>> - u8 mtu_msgmax;
>> - u8 rq_size_stride; /* Reserved on Tavor */
>> - u8 sq_size_stride; /* Reserved on Tavor */
>> - u8 rlkey_arbel_sched_queue; /* Reserved on Tavor */
>> + u8 mtu_msgmax;
>> + u8 rq_size_stride; /* Reserved on Tavor */
>> + u8 sq_size_stride; /* Reserved on Tavor */
>> + u8 rlkey_arbel_sched_queue; /* Reserved on Tavor */
>> __be32 usr_page; __be32 local_qpn; __be32 remote_qpn; @@ -164,23
>> +164,23 @@ struct mthca_qp_param { #pragma pack(pop)
>>
>> enum {
>> - MTHCA_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0,
>> - MTHCA_QP_OPTPAR_RRE = 1 << 1,
>> - MTHCA_QP_OPTPAR_RAE = 1 << 2,
>> - MTHCA_QP_OPTPAR_RWE = 1 << 3,
>> - MTHCA_QP_OPTPAR_PKEY_INDEX = 1 << 4,
>> - MTHCA_QP_OPTPAR_Q_KEY = 1 << 5,
>> - MTHCA_QP_OPTPAR_RNR_TIMEOUT = 1 << 6,
>> + MTHCA_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0,
>> + MTHCA_QP_OPTPAR_RRE = 1 << 1,
>> + MTHCA_QP_OPTPAR_RAE = 1 << 2,
>> + MTHCA_QP_OPTPAR_RWE = 1 << 3,
>> + MTHCA_QP_OPTPAR_PKEY_INDEX = 1 << 4,
>> + MTHCA_QP_OPTPAR_Q_KEY = 1 << 5,
>> + MTHCA_QP_OPTPAR_RNR_TIMEOUT = 1 << 6,
>> MTHCA_QP_OPTPAR_PRIMARY_ADDR_PATH = 1 << 7,
>> - MTHCA_QP_OPTPAR_SRA_MAX = 1 << 8,
>> - MTHCA_QP_OPTPAR_RRA_MAX = 1 << 9,
>> - MTHCA_QP_OPTPAR_PM_STATE = 1 << 10,
>> - MTHCA_QP_OPTPAR_PORT_NUM = 1 << 11,
>> - MTHCA_QP_OPTPAR_RETRY_COUNT = 1 << 12,
>> - MTHCA_QP_OPTPAR_ALT_RNR_RETRY = 1 << 13,
>> - MTHCA_QP_OPTPAR_ACK_TIMEOUT = 1 << 14,
>> - MTHCA_QP_OPTPAR_RNR_RETRY = 1 << 15,
>> - MTHCA_QP_OPTPAR_SCHED_QUEUE = 1 << 16
>> + MTHCA_QP_OPTPAR_SRA_MAX = 1 << 8,
>> + MTHCA_QP_OPTPAR_RRA_MAX = 1 << 9,
>> + MTHCA_QP_OPTPAR_PM_STATE = 1 << 10,
>> + MTHCA_QP_OPTPAR_PORT_NUM = 1 << 11,
>> + MTHCA_QP_OPTPAR_RETRY_COUNT = 1 << 12,
>> + MTHCA_QP_OPTPAR_ALT_RNR_RETRY = 1 << 13,
>> + MTHCA_QP_OPTPAR_ACK_TIMEOUT = 1 << 14,
>> + MTHCA_QP_OPTPAR_RNR_RETRY = 1 << 15,
>> + MTHCA_QP_OPTPAR_SCHED_QUEUE = 1 << 16
>> };
>>
>> static const u8 mthca_opcode[] = {
>> @@ -209,110 +209,110 @@ static void fill_state_table()
>>
>> /* IBQPS_RESET */
>> t = &state_table[IBQPS_RESET][0];
>> - t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> - t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>> + t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> + t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>>
>> t[IBQPS_INIT].trans =
>> MTHCA_TRANS_RST2INIT; - t[IBQPS_INIT].req_param[UD] =
>> IB_QP_PKEY_INDEX |IB_QP_PORT |IB_QP_QKEY; - t[IBQPS_INIT].req_param[UC]
>> = IB_QP_PKEY_INDEX |IB_QP_PORT |IB_QP_ACCESS_FLAGS;
>> - t[IBQPS_INIT].req_param[RC] = IB_QP_PKEY_INDEX |IB_QP_PORT
>> |IB_QP_ACCESS_FLAGS; - t[IBQPS_INIT].req_param[MLX] =
>> IB_QP_PKEY_INDEX |IB_QP_QKEY; - t[IBQPS_INIT].opt_param[MLX] =
>> IB_QP_PORT; + t[IBQPS_INIT].req_param[UD] = IB_QP_PKEY_INDEX
>> |IB_QP_PORT |IB_QP_QKEY; + t[IBQPS_INIT].req_param[UC] =
>> IB_QP_PKEY_INDEX |IB_QP_PORT |IB_QP_ACCESS_FLAGS; +
>> t[IBQPS_INIT].req_param[RC] = IB_QP_PKEY_INDEX |IB_QP_PORT
>> |IB_QP_ACCESS_FLAGS; + t[IBQPS_INIT].req_param[MLX] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY; + t[IBQPS_INIT].opt_param[MLX] = IB_QP_PORT;
>>
>> /* IBQPS_INIT */
>> t = &state_table[IBQPS_INIT][0];
>> - t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> - t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>> + t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> + t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>>
>> t[IBQPS_INIT].trans =
>> MTHCA_TRANS_INIT2INIT; - t[IBQPS_INIT].opt_param[UD] =
>> IB_QP_PKEY_INDEX |IB_QP_PORT |IB_QP_QKEY; -
>> t[IBQPS_INIT].opt_param[UC] = IB_QP_PKEY_INDEX |IB_QP_PORT
>> |IB_QP_ACCESS_FLAGS; - t[IBQPS_INIT].opt_param[RC] = IB_QP_PKEY_INDEX
>> |IB_QP_PORT |IB_QP_ACCESS_FLAGS; - t[IBQPS_INIT].opt_param[MLX] =
>> IB_QP_PKEY_INDEX |IB_QP_QKEY; + t[IBQPS_INIT].opt_param[UD] =
>> IB_QP_PKEY_INDEX |IB_QP_PORT |IB_QP_QKEY; + t[IBQPS_INIT].opt_param[UC]
>> = IB_QP_PKEY_INDEX |IB_QP_PORT |IB_QP_ACCESS_FLAGS;
>> + t[IBQPS_INIT].opt_param[RC] = IB_QP_PKEY_INDEX |IB_QP_PORT
>> |IB_QP_ACCESS_FLAGS; + t[IBQPS_INIT].opt_param[MLX] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>>
>> - t[IBQPS_RTR].trans =
>> MTHCA_TRANS_INIT2RTR;
>> - t[IBQPS_RTR].req_param[UC] =
>> + t[IBQPS_RTR].trans =
>> MTHCA_TRANS_INIT2RTR;
>> + t[IBQPS_RTR].req_param[UC] =
>> IB_QP_AV |IB_QP_PATH_MTU |IB_QP_DEST_QPN
>> |IB_QP_RQ_PSN;
>> - t[IBQPS_RTR].req_param[RC] =
>> + t[IBQPS_RTR].req_param[RC] =
>> IB_QP_AV |IB_QP_PATH_MTU |IB_QP_DEST_QPN
>> |IB_QP_RQ_PSN |IB_QP_MAX_DEST_RD_ATOMIC
>> |IB_QP_MIN_RNR_TIMER;
>> - t[IBQPS_RTR].opt_param[UD] = IB_QP_PKEY_INDEX |IB_QP_QKEY;
>> - t[IBQPS_RTR].opt_param[UC] = IB_QP_PKEY_INDEX
>> |IB_QP_ALT_PATH |IB_QP_ACCESS_FLAGS;
>> - t[IBQPS_RTR].opt_param[RC] = IB_QP_PKEY_INDEX
>> |IB_QP_ALT_PATH |IB_QP_ACCESS_FLAGS;
>> - t[IBQPS_RTR].opt_param[MLX] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>> + t[IBQPS_RTR].opt_param[UD] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>> + t[IBQPS_RTR].opt_param[UC] = IB_QP_PKEY_INDEX
>> |IB_QP_ALT_PATH |IB_QP_ACCESS_FLAGS;
>> + t[IBQPS_RTR].opt_param[RC] = IB_QP_PKEY_INDEX
>> |IB_QP_ALT_PATH |IB_QP_ACCESS_FLAGS;
>> + t[IBQPS_RTR].opt_param[MLX] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>>
>> -/* IBQPS_RTR */
>> +/* IBQPS_RTR */
>> t = &state_table[IBQPS_RTR][0];
>> - t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> - t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>> + t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> + t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>>
>> - t[IBQPS_RTS].trans =
>> MTHCA_TRANS_RTR2RTS;
>> - t[IBQPS_RTS].req_param[UD] = IB_QP_SQ_PSN;
>> - t[IBQPS_RTS].req_param[UC] = IB_QP_SQ_PSN;
>> - t[IBQPS_RTS].req_param[RC] =
>> + t[IBQPS_RTS].trans =
>> MTHCA_TRANS_RTR2RTS;
>> + t[IBQPS_RTS].req_param[UD] = IB_QP_SQ_PSN;
>> + t[IBQPS_RTS].req_param[UC] = IB_QP_SQ_PSN;
>> + t[IBQPS_RTS].req_param[RC] =
>> IB_QP_TIMEOUT |IB_QP_RETRY_CNT |IB_QP_RNR_RETRY
>> |IB_QP_SQ_PSN |IB_QP_MAX_QP_RD_ATOMIC;
>> - t[IBQPS_RTS].req_param[MLX] = IB_QP_SQ_PSN;
>> - t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE |IB_QP_QKEY;
>> - t[IBQPS_RTS].opt_param[UC] =
>> + t[IBQPS_RTS].req_param[MLX] = IB_QP_SQ_PSN;
>> + t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE
>> |IB_QP_QKEY;
>> + t[IBQPS_RTS].opt_param[UC] =
>> IB_QP_CUR_STATE |IB_QP_ALT_PATH
>> |IB_QP_ACCESS_FLAGS |IB_QP_PATH_MIG_STATE; -
>> t[IBQPS_RTS].opt_param[RC] = IB_QP_CUR_STATE |IB_QP_ALT_PATH |
>> + t[IBQPS_RTS].opt_param[RC] = IB_QP_CUR_STATE
> |IB_QP_ALT_PATH |
>> IB_QP_ACCESS_FLAGS |IB_QP_MIN_RNR_TIMER
>> |IB_QP_PATH_MIG_STATE;
>> - t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE
>> |IB_QP_QKEY;
>> + t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE
>> |IB_QP_QKEY;
>>
>> - /* IBQPS_RTS */
>> + /* IBQPS_RTS */
>> t = &state_table[IBQPS_RTS][0];
>> - t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> - t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>> + t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> + t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>>
>> - t[IBQPS_RTS].trans = MTHCA_TRANS_RTS2RTS;
>> - t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE |IB_QP_QKEY;
>> - t[IBQPS_RTS].opt_param[UC] = IB_QP_ACCESS_FLAGS |IB_QP_ALT_PATH
>> |IB_QP_PATH_MIG_STATE; - t[IBQPS_RTS].opt_param[RC] =
>> IB_QP_ACCESS_FLAGS | + t[IBQPS_RTS].trans = MTHCA_TRANS_RTS2RTS;
>> + t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE |IB_QP_QKEY;
>> + t[IBQPS_RTS].opt_param[UC] = IB_QP_ACCESS_FLAGS |IB_QP_ALT_PATH
>> |IB_QP_PATH_MIG_STATE; + t[IBQPS_RTS].opt_param[RC] =
>> IB_QP_ACCESS_FLAGS |
>> IB_QP_ALT_PATH |IB_QP_PATH_MIG_STATE
>> |IB_QP_MIN_RNR_TIMER;
>> - t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE
>> |IB_QP_QKEY;
>> + t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE
>> |IB_QP_QKEY;
>>
>> - t[IBQPS_SQD].trans =
>> MTHCA_TRANS_RTS2SQD;
>> - t[IBQPS_SQD].opt_param[UD] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>> - t[IBQPS_SQD].opt_param[UC] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>> - t[IBQPS_SQD].opt_param[RC] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>> - t[IBQPS_SQD].opt_param[MLX] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>> + t[IBQPS_SQD].trans =
>> MTHCA_TRANS_RTS2SQD;
>> + t[IBQPS_SQD].opt_param[UD] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>> + t[IBQPS_SQD].opt_param[UC] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>> + t[IBQPS_SQD].opt_param[RC] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>> + t[IBQPS_SQD].opt_param[MLX] =
>> IB_QP_EN_SQD_ASYNC_NOTIFY;
>>
>> - /* IBQPS_SQD */
>> + /* IBQPS_SQD */
>> t = &state_table[IBQPS_SQD][0];
>> - t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> - t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>> + t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> + t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>>
>> - t[IBQPS_RTS].trans = MTHCA_TRANS_SQD2RTS;
>> - t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE |IB_QP_QKEY;
>> - t[IBQPS_RTS].opt_param[UC] = IB_QP_CUR_STATE |
>> + t[IBQPS_RTS].trans = MTHCA_TRANS_SQD2RTS;
>> + t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE |IB_QP_QKEY;
>> + t[IBQPS_RTS].opt_param[UC] = IB_QP_CUR_STATE |
>> IB_QP_ALT_PATH |IB_QP_ACCESS_FLAGS
>> |IB_QP_PATH_MIG_STATE; - t[IBQPS_RTS].opt_param[RC] =
>> IB_QP_CUR_STATE |IB_QP_ALT_PATH | + t[IBQPS_RTS].opt_param[RC] =
>> IB_QP_CUR_STATE |IB_QP_ALT_PATH |
>> IB_QP_ACCESS_FLAGS |IB_QP_MIN_RNR_TIMER
>> |IB_QP_PATH_MIG_STATE;
>> - t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE
>> |IB_QP_QKEY;
>> + t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE
>> |IB_QP_QKEY;
>>
>> - t[IBQPS_SQD].trans =
>> MTHCA_TRANS_SQD2SQD;
>> - t[IBQPS_SQD].opt_param[UD] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>> - t[IBQPS_SQD].opt_param[UC] = IB_QP_AV |
>> IB_QP_CUR_STATE |
>> + t[IBQPS_SQD].trans =
>> MTHCA_TRANS_SQD2SQD;
>> + t[IBQPS_SQD].opt_param[UD] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>> + t[IBQPS_SQD].opt_param[UC] = IB_QP_AV |
>> IB_QP_CUR_STATE |
>> IB_QP_ALT_PATH |IB_QP_ACCESS_FLAGS
>> |IB_QP_PKEY_INDEX |IB_QP_PATH_MIG_STATE; - t[IBQPS_SQD].opt_param[RC]
>> = IB_QP_AV |IB_QP_TIMEOUT |IB_QP_RETRY_CNT |IB_QP_RNR_RETRY |
>> + t[IBQPS_SQD].opt_param[RC] = IB_QP_AV |IB_QP_TIMEOUT
>> |IB_QP_RETRY_CNT |IB_QP_RNR_RETRY |
>> IB_QP_MAX_QP_RD_ATOMIC |IB_QP_MAX_DEST_RD_ATOMIC |IB_QP_CUR_STATE
>> |IB_QP_ALT_PATH | IB_QP_ACCESS_FLAGS
> |IB_QP_PKEY_INDEX
>> |IB_QP_MIN_RNR_TIMER |IB_QP_PATH_MIG_STATE;
>> - t[IBQPS_SQD].opt_param[MLX] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>> + t[IBQPS_SQD].opt_param[MLX] = IB_QP_PKEY_INDEX
>> |IB_QP_QKEY;
>>
>> - /* IBQPS_SQE */
>> + /* IBQPS_SQE */
>> t = &state_table[IBQPS_SQE][0];
>> - t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> - t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>> + t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> + t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>>
>> - t[IBQPS_RTS].trans = MTHCA_TRANS_SQERR2RTS;
>> - t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE |IB_QP_QKEY;
>> - t[IBQPS_RTS].opt_param[UC] = IB_QP_CUR_STATE | IB_QP_ACCESS_FLAGS;
>> -// t[IBQPS_RTS].opt_param[RC] = IB_QP_CUR_STATE
>> |IB_QP_MIN_RNR_TIMER; - t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE
>> |IB_QP_QKEY; + t[IBQPS_RTS].trans = MTHCA_TRANS_SQERR2RTS;
>> + t[IBQPS_RTS].opt_param[UD] = IB_QP_CUR_STATE |IB_QP_QKEY;
>> + t[IBQPS_RTS].opt_param[UC] = IB_QP_CUR_STATE | IB_QP_ACCESS_FLAGS;
>> +// t[IBQPS_RTS].opt_param[RC] = IB_QP_CUR_STATE |IB_QP_MIN_RNR_TIMER;
>> + t[IBQPS_RTS].opt_param[MLX] = IB_QP_CUR_STATE |IB_QP_QKEY;
>>
>> - /* IBQPS_ERR */
>> + /* IBQPS_ERR */
>> t = &state_table[IBQPS_ERR][0];
>> - t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> - t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>> + t[IBQPS_RESET].trans =
>> MTHCA_TRANS_ANY2RST;
>> + t[IBQPS_ERR].trans =
>> MTHCA_TRANS_ANY2ERR;
>>
>> }; @@ -337,7 +337,7 @@ static void dump_wqe(u32 print_lvl, u32
>> UNUSED_PARAM_WOWPP(qp_ptr); UNUSED_PARAM_WOWPP(print_lvl);
>> - (void) wqe; /* avoid warning if mthca_dbg compiled away... */
>> + (void) wqe; /* avoid warning if mthca_dbg compiled away... */
>> HCA_PRINT(print_lvl,HCA_DBG_QP,("WQE contents QPN 0x%06x
>> \n",qp_ptr->qpn)); HCA_PRINT(print_lvl,HCA_DBG_QP,("WQE contents
>> [%02x] %08x %08x %08x %08x \n",0 , cl_ntoh32(wqe[0]),
>> cl_ntoh32(wqe[1]), cl_ntoh32(wqe[2]),
>> cl_ntoh32(wqe[3])));
>> @@ -367,7 +367,7 @@ static void *get_send_wqe(struct mthca_q
>> (n << qp->sq.wqe_shift);
>> else
>> return (u8*)qp->queue.page_list[(qp->send_wqe_offset +
>> - (n << qp->sq.wqe_shift)) >>
>> + (n << qp->sq.wqe_shift)) >>
>> PAGE_SHIFT].page + ((qp->send_wqe_offset + (n <<
>> qp->sq.wqe_shift)) & (PAGE_SIZE - 1)); @@ - 378,12 +378,12 @@
>> static void mthca_wq_init(struct mthca_w spin_lock_init(&wq->lock);
>> wq->next_ind = 0; wq->last_comp = wq->max - 1;
>> - wq->head = 0;
>> - wq->tail = 0;
>> + wq->head = 0;
>> + wq->tail = 0;
>> }
>>
>> void mthca_qp_event(struct mthca_dev *dev, u32 qpn,
>> - enum ib_event_type event_type, u8 vendor_code)
>> + enum ib_event_type event_type, u8 vendor_code)
>> { struct mthca_qp *qp; ib_event_rec_t event; @@ -403,7 +403,7 @@
>> void mthca_qp_event(struct mthca_dev *de event.type = event_type;
>> event.context = qp->ibqp.qp_context; event.vendor_specific =
>> vendor_code;
>> - HCA_PRINT(TRACE_LEVEL_WARNING,HCA_DBG_QP,("QP %06x
>> Async event event_type 0x%x vendor_code 0x%x\n",
>> + HCA_PRINT(TRACE_LEVEL_WARNING,HCA_DBG_QP,("QP %06x
>> Async event event_type 0x%x vendor_code 0x%x\n",
>> qpn,event_type,vendor_code)); qp->ibqp.event_handler(&event); @@
>> -421,7 +421,7 @@ static int to_mthca_state(enum ib_qp_sta case
>> IBQPS_SQD: return MTHCA_QP_STATE_SQD; case IBQPS_SQE: return
>> MTHCA_QP_STATE_SQE; case IBQPS_ERR: return MTHCA_QP_STATE_ERR;
>> - default: return -1;
>> + default: return -1;
>> } } @@ -445,10 +445,10 @@ static inline enum ib_qp_state to_ib_qp_
>> case MTHCA_QP_STATE_RTR: return IBQPS_RTR; case
>> MTHCA_QP_STATE_RTS: return IBQPS_RTS; case MTHCA_QP_STATE_SQD:
>> return IBQPS_SQD;
>> - case MTHCA_QP_STATE_DRAINING: return IBQPS_SQD;
>> + case MTHCA_QP_STATE_DRAINING: return IBQPS_SQD;
>> case MTHCA_QP_STATE_SQE: return IBQPS_SQE;
>> case MTHCA_QP_STATE_ERR: return IBQPS_ERR;
>> - default: return -1;
>> + default: return -1;
>> } } @@ -480,17 +480,17 @@ static void to_ib_ah_attr(struct mthca_d
>> struct mthca_qp_path *path) { memset(ib_ah_attr, 0, sizeof
>> *ib_ah_attr);
>> - ib_ah_attr->port_num = (u8)((cl_ntoh32(path->port_pkey) >> 24)
>> & 0x3);
>> + ib_ah_attr->port_num = (u8)((cl_ntoh32(path->port_pkey) >> 24)
>> & 0x3);
>>
>> if (ib_ah_attr->port_num == 0 || ib_ah_attr->port_num > dev-
>> limits.num_ports)
>> return;
>> - ib_ah_attr->dlid = cl_ntoh16(path->rlid);
>> - ib_ah_attr->sl = (u8)(cl_ntoh32(path->sl_tclass_flowlabel)
>>>> 28);
>> + ib_ah_attr->dlid = cl_ntoh16(path->rlid);
>> + ib_ah_attr->sl = (u8)(cl_ntoh32(path-
>> sl_tclass_flowlabel) >> 28); ib_ah_attr->src_path_bits =
>> path->g_mylmc & 0x7f; //TODO: work around: set always full speed -
>> really, it's much more complicate ib_ah_attr->static_rate = 0;
>> - ib_ah_attr->ah_flags = (path->g_mylmc & (1 << 7)) ? IB_AH_GRH :
>> 0; + ib_ah_attr->ah_flags = (path->g_mylmc & (1 << 7)) ? IB_AH_GRH :
> 0;
>> if (ib_ah_attr->ah_flags) { ib_ah_attr->grh.sgid_index =
>> (u8)(path->mgid_index & (dev- limits.gid_table_len - 1));
>> ib_ah_attr->grh.hop_limit = path->hop_limit; @@ -540,20 +540,20 @@
>> int mthca_query_qp(struct ib_qp *ibqp, s goto out_mailbox;
> }
>> - qp_param = mailbox->buf;
>> - context = &qp_param->context;
>> + qp_param = mailbox->buf;
>> + context = &qp_param->context;
>> mthca_state = cl_ntoh32(context->flags) >> 28;
>> - qp->state = to_ib_qp_state(mthca_state);
>> - qp_attr->qp_state = qp->state;
>> - qp_attr->path_mtu = context->mtu_msgmax >> 5;
>> - qp_attr->path_mig_state =
>> + qp->state = to_ib_qp_state(mthca_state);
>> + qp_attr->qp_state = qp->state;
>> + qp_attr->path_mtu = context->mtu_msgmax >> 5;
>> + qp_attr->path_mig_state =
>> to_ib_mig_state((cl_ntoh32(context->flags) >> 11) & 0x3);
>> - qp_attr->qkey = cl_ntoh32(context->qkey); -
> qp_attr->rq_psn
>> = cl_ntoh32(context->rnr_nextrecvpsn) & 0xffffff; - qp_attr->sq_psn
>
>> = cl_ntoh32(context->next_send_psn) & 0xffffff;
>> - qp_attr->dest_qp_num = cl_ntoh32(context-
>>> remote_qpn) & 0xffffff;
>> - qp_attr->qp_access_flags =
>> + qp_attr->qkey = cl_ntoh32(context->qkey);
>> + qp_attr->rq_psn = cl_ntoh32(context-
>> rnr_nextrecvpsn) & 0xffffff; + qp_attr->sq_psn = cl_ntoh32(context-
>> next_send_psn) & 0xffffff; + qp_attr->dest_qp_num =
>> cl_ntoh32(context- remote_qpn) & 0xffffff; + qp_attr- qp_access_flags
>> = to_ib_qp_access_flags(cl_ntoh32(context->params2));
>>
>> if (qp->transport == RC || qp->transport == UC) { @@ -561,11 +561,11
>> @@ int mthca_query_qp(struct ib_qp *ibqp, s to_ib_ah_attr(dev,
>> &qp_attr->alt_ah_attr, &context- alt_path); qp_attr- alt_pkey_index
>> = (u16)(cl_ntoh32(context->alt_path.port_pkey) &
>> 0x7f);
>> - qp_attr->alt_port_num = qp_attr-
>> alt_ah_attr.port_num; + qp_attr->alt_port_num = qp_attr-
>> alt_ah_attr.port_num; }
>>
>> qp_attr->pkey_index = (u16)(cl_ntoh32(context-
>> pri_path.port_pkey) & 0x7f);
>> - qp_attr->port_num =
>> + qp_attr->port_num =
>> (u8)((cl_ntoh32(context->pri_path.port_pkey) >> 24) & 0x3);
>>
>> /* qp_attr->en_sqd_async_notify is only applicable in modify qp */
>> @@ -575,22 +575,23 @@ int mthca_query_qp(struct ib_qp *ibqp, s
>>
>> qp_attr->max_dest_rd_atomic =
>> (u8)(1 << ((cl_ntoh32(context->params2) >> 21) & 0x7));
>> - qp_attr->min_rnr_timer =
>> + qp_attr->min_rnr_timer =
>> (u8)((cl_ntoh32(context->rnr_nextrecvpsn) >> 24) & 0x1f);
>> - qp_attr->timeout = context->pri_path.ackto >> 3;
>> - qp_attr->retry_cnt = (u8)((cl_ntoh32(context->params1) >>
>> 16) & 0x7);
>> - qp_attr->rnr_retry = context->pri_path.rnr_retry >> 5;
>> - qp_attr->alt_timeout = context->alt_path.ackto >> 3;
>> + qp_attr->timeout = context->pri_path.ackto >> 3;
>> + qp_attr->retry_cnt = (u8)((cl_ntoh32(context->params1)
>>>> 16) & 0x7);
>> + qp_attr->rnr_retry = context->pri_path.rnr_retry >> 5;
>> + qp_attr->alt_timeout = context->alt_path.ackto >> 3;
>>
>> done:
>> - qp_attr->cur_qp_state = qp_attr->qp_state;
>> - qp_attr->cap.max_send_wr = qp->sq.max;
>> - qp_attr->cap.max_recv_wr = qp->rq.max;
>> - qp_attr->cap.max_send_sge = qp->sq.max_gs;
>> - qp_attr->cap.max_recv_sge = qp->rq.max_gs;
>> + qp_attr->cur_qp_state = qp_attr->qp_state;
>> + qp_attr->cap.max_send_wr = qp->sq.max;
>> + qp_attr->cap.max_recv_wr = qp->rq.max;
>> + qp_attr->cap.max_send_sge = qp->sq.max_gs;
>> + qp_attr->cap.max_recv_sge = qp->rq.max_gs;
>> qp_attr->cap.max_inline_data = qp->max_inline_data;
>> - qp_init_attr->cap = qp_attr->cap;
>> + qp_init_attr->cap = qp_attr->cap;
>> + qp_init_attr->sq_sig_type = qp->sq_policy;
>>
>> out_mailbox:
>> mthca_free_mailbox(dev, mailbox);
>> @@ -619,11 +620,11 @@ static void init_port(struct mthca_dev *
>>
>> RtlZeroMemory(¶m, sizeof param);
>> - param.port_width = dev->limits.port_width_cap;
>> - param.vl_cap = dev->limits.vl_cap;
>> - param.mtu_cap = dev->limits.mtu_cap;
>> - param.gid_cap = (u16)dev->limits.gid_table_len;
>> - param.pkey_cap = (u16)dev->limits.pkey_table_len;
>> + param.port_width = dev->limits.port_width_cap;
>> + param.vl_cap = dev->limits.vl_cap;
>> + param.mtu_cap = dev->limits.mtu_cap;
>> + param.gid_cap = (u16)dev->limits.gid_table_len;
>> + param.pkey_cap = (u16)dev->limits.pkey_table_len;
>>
>> err = mthca_INIT_IB(dev, ¶m, port, &status); if (err) @@ - 753,7
>> +754,7 @@ int mthca_modify_qp(struct ib_qp *ibqp, }
>>
>> if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC &&
>> - attr->max_dest_rd_atomic > 1 << dev->qp_table.rdb_shift) {
>> + attr->max_dest_rd_atomic > 1 << dev->qp_table.rdb_shift) {
>> HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_QP,("Max rdma_atomic as
>> responder %u too large (max %d)\n", attr- max_dest_rd_atomic, 1
>> << dev- qp_table.rdb_shift)); goto out; @@ -768,9 +769,9 @@ int
>> mthca_modify_qp(struct ib_qp *ibqp, qp_context = &qp_param- context;
>> RtlZeroMemory(qp_param, sizeof *qp_param);
>> - qp_context->flags = cl_hton32((to_mthca_state(new_state) <<
>> 28) |
>> - (to_mthca_st(qp->transport) <<
>> 16));
>> - qp_context->flags |= cl_hton32(MTHCA_QP_BIT_DE);
>> + qp_context->flags = cl_hton32((to_mthca_state(new_state)
>> << 28) |
>> + (to_mthca_st(qp->transport)
>> << 16));
>> + qp_context->flags |= cl_hton32(MTHCA_QP_BIT_DE);
>> if (!(attr_mask & IB_QP_PATH_MIG_STATE)) qp_context- flags |=
>> cl_hton32(MTHCA_QP_PM_MIGRATED << 11); else { @@ -846,20 +847,20 @@
>> int mthca_modify_qp(struct ib_qp *ibqp, }
>>
>>> if (attr_mask & IB_QP_AV) { - qp_context- pri_path.g_mylmc =
>>> attr- ah_attr.src_path_bits & 0x7f;
>> - qp_context->pri_path.rlid = cl_hton16(attr->ah_attr.dlid);
>> - //TODO: work around: set always full speed - really, it's much
>> more complicate
>> + qp_context->pri_path.g_mylmc = attr-
>>> ah_attr.src_path_bits & 0x7f; + qp_context->pri_path.rlid =
>>> cl_hton16(attr- ah_attr.dlid);
>> + //TODO: work around: set always full speed - really, it's
>> much more complicate
>> qp_context->pri_path.static_rate = 0;
>> if (attr->ah_attr.ah_flags & IB_AH_GRH) {
>> qp_context->pri_path.g_mylmc |= 1 << 7;
>> qp_context->pri_path.mgid_index = attr-
>> ah_attr.grh.sgid_index;
>> qp_context->pri_path.hop_limit = attr-
>> ah_attr.grh.hop_limit;
>> qp_context->pri_path.sl_tclass_flowlabel =
>> - cl_hton32((attr->ah_attr.sl << 28) |
>> - (attr->ah_attr.grh.traffic_class <<
>> 20) |
>> - (attr->ah_attr.grh.flow_label));
>> + cl_hton32((attr->ah_attr.sl << 28)
>> |
>> + (attr-
>> ah_attr.grh.traffic_class << 20) | + (attr- ah_attr.grh.flow_label));
>> memcpy(qp_context-
>> pri_path.rgid,
>> - attr->ah_attr.grh.dgid.raw, 16);
>> + attr->ah_attr.grh.dgid.raw, 16);
>> } else { qp_context- pri_path.sl_tclass_flowlabel =
>> cl_hton32(attr->ah_attr.sl << 28); @@ -875,7 +876,7 @@ int
>> mthca_modify_qp(struct ib_qp *ibqp, /* XXX alt_path */
>>
>> /* leave rdd as 0 */
>> - qp_context->pd = cl_hton32(to_mpd(ibqp->pd)->pd_num);
>> + qp_context->pd = cl_hton32(to_mpd(ibqp->pd)-
>> pd_num); /* leave wqe_base as 0 (we always create an MR based at 0
>> for WQs) */ qp_context->wqe_lkey = cl_hton32(qp->mr.ibmr.lkey);
>> qp_context->params1 = cl_hton32((unsigned long)( @@ -893,7 +894,7
>> @@ int mthca_modify_qp(struct ib_qp *ibqp, if (attr- max_rd_atomic)
>> { qp_context->params1 |=
> cl_hton32(MTHCA_QP_BIT_SRE |
>> - MTHCA_QP_BIT_SAE);
>> + MTHCA_QP_BIT_SAE);
>> qp_context->params1 |= cl_hton32(fls(attr->max_rd_atomic - 1) <<
>> 21); } @@ -920,7 +921,7 @@ int mthca_modify_qp(struct ib_qp
> *ibqp, }
>>
>> if (attr_mask & (IB_QP_ACCESS_FLAGS |
>> IB_QP_MAX_DEST_RD_ATOMIC)) { - qp_context->params2 |=
>> get_hw_access_flags(qp, attr, attr_mask); + qp_context-
>> params2 |=
>> get_hw_access_flags(qp, attr, attr_mask);
>> qp_param->opt_param_mask |=
>> cl_hton32(MTHCA_QP_OPTPAR_RWE |
>>
>> MTHCA_QP_OPTPAR_RRE |
>>
>> MTHCA_QP_OPTPAR_RAE);
>> @@ -940,8 +941,8 @@ int mthca_modify_qp(struct ib_qp *ibqp,
>>
>> qp_context->ra_buff_indx =
>> cl_hton32(dev->qp_table.rdb_base +
>> - ((qp->qpn & (dev->limits.num_qps - 1)) *
>> MTHCA_RDB_ENTRY_SIZE <<
>> - dev->qp_table.rdb_shift));
>> + ((qp->qpn & (dev->limits.num_qps - 1)) *
>> MTHCA_RDB_ENTRY_SIZE <<
>> + dev->qp_table.rdb_shift));
>>
>> qp_context->cqn_rcv = cl_hton32(to_mcq(ibqp->recv_cq)->cqn);
>> @@ -955,25 +956,25 @@ int mthca_modify_qp(struct ib_qp *ibqp,
>>
>> if (ibqp->srq)
>> qp_context->srqn = cl_hton32(1 << 24 |
>> - to_msrq(ibqp->srq)->srqn);
>> + to_msrq(ibqp->srq)->srqn);
>>
>> if (cur_state == IBQPS_RTS && new_state == IBQPS_SQD &&
>> - attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY &&
>> - attr->en_sqd_async_notify)
>> + attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY &&
>> + attr->en_sqd_async_notify)
>> sqd_event = (u32)(1 << 31);
>>
>> err = mthca_MODIFY_QP(dev,
>> state_table[cur_state][new_state].trans,
>> - qp->qpn, 0, mailbox, sqd_event, &status);
>> + qp->qpn, 0, mailbox, sqd_event, &status);
>> if (err) {
>> HCA_PRINT(TRACE_LEVEL_ERROR
>> ,HCA_DBG_QP,("mthca_MODIFY_QP returned error (qp-num = 0x%x)
>> returned status %02x "
>> - "cur_state = %d new_state = %d attr_mask = %d
>> req_param = %d opt_param = %d\n",
>> + "cur_state = %d new_state = %d attr_mask =
>> %d req_param = %d opt_param = %d\n",
>> ibqp->qp_num, status, cur_state, new_state,
>> - attr_mask, req_param, opt_param));
>> + attr_mask, req_param, opt_param));
>> goto out_mailbox;
>> }
>> if (status) {
>> HCA_PRINT(TRACE_LEVEL_ERROR
>> ,HCA_DBG_QP,("mthca_MODIFY_QP bad status(qp-num = 0x%x) returned
>> status %02x "
>> - "cur_state = %d new_state = %d attr_mask = %d
>> req_param = %d opt_param = %d\n",
>> + "cur_state = %d new_state = %d attr_mask =
>> %d req_param = %d opt_param = %d\n",
>>> ibqp->qp_num, status, cur_state, new_state, attr_mask, req_param,
>>> opt_param)); err = -EINVAL; @@ -1011,10 +1012,10 @@ int
>>> mthca_modify_qp(struct ib_qp *ibqp, */ if (new_state == IBQPS_RESET
>>> && !qp->ibqp.ucontext) { mthca_cq_clean(dev,
>>> to_mcq(qp->ibqp.send_cq)->cqn, qp- qpn,
>> - qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
>> + qp->ibqp.srq ? to_msrq(qp->ibqp.srq) :
>> NULL);
>> if (qp->ibqp.send_cq != qp->ibqp.recv_cq)
>> mthca_cq_clean(dev, to_mcq(qp->ibqp.recv_cq)-
>> cqn, qp->qpn,
>> - qp->ibqp.srq ? to_msrq(qp->ibqp.srq) :
>> NULL);
>> + qp->ibqp.srq ? to_msrq(qp-
>>> ibqp.srq) : NULL);
>>>
>> mthca_wq_init(&qp->sq); qp->sq.last = get_send_wqe(qp, qp->sq.max
>> - 1); @@ -1080,7 +1081,7 @@ static void mthca_adjust_qp_caps(struct
>> (int)(max_data_size / sizeof (struct mthca_data_seg)));
>> qp->rq.max_gs = min(dev->limits.max_sg,
>> (int)((min(dev->limits.max_desc_sz, 1 << qp->rq.wqe_shift)
>> - - sizeof (struct mthca_next_seg)) / sizeof (struct
>> mthca_data_seg))); + sizeof (struct mthca_next_seg)) / sizeof (struct
> mthca_data_seg)));
>> }
>>
>> /*
>> @@ -1091,8 +1092,8 @@ static void mthca_adjust_qp_caps(struct
>> * queue)
>> */
>> static int mthca_alloc_wqe_buf(struct mthca_dev *dev,
>> - struct mthca_pd *pd,
>> - struct mthca_qp *qp)
>> + struct mthca_pd *pd,
>> + struct mthca_qp *qp)
>> { int size; int err = -ENOMEM; @@ -1105,7 +1106,7 @@ static int
>> mthca_alloc_wqe_buf(struct mt return -EINVAL;
>>
>> for (qp->rq.wqe_shift = 6; 1 << qp->rq.wqe_shift < size;
>> - qp->rq.wqe_shift++)
>> + qp->rq.wqe_shift++)
>> ; /* nothing */
>>
>> size = qp->sq.max_gs * sizeof (struct mthca_data_seg); @@ -1149,11
>> +1150,11 @@ static int mthca_alloc_wqe_buf(struct mt
> return -EINVAL;
>>
>> for (qp->sq.wqe_shift = 6; 1 << qp->sq.wqe_shift < size;
>> - qp->sq.wqe_shift++)
>> + qp->sq.wqe_shift++)
>> ; /* nothing */
>>
>> qp->send_wqe_offset = ALIGN(qp->rq.max << qp->rq.wqe_shift,
>> - 1 << qp->sq.wqe_shift);
>> + 1 << qp->sq.wqe_shift);
>>
>> /* * If this is a userspace QP, we don't actually have to @@ -
>> 1172,7 +1173,7 @@ static int mthca_alloc_wqe_buf(struct mt goto
> err_out;
>>
>> err = mthca_buf_alloc(dev, size, MTHCA_MAX_DIRECT_QP_SIZE,
>> - &qp->queue, &qp->is_direct, pd, 0, &qp->mr);
>> + &qp->queue, &qp->is_direct, pd, 0, &qp-
>> mr); if (err) goto err_out; @@ -1185,16 +1186,16 @@ err_out: }
>>>
>> static void mthca_free_wqe_buf(struct mthca_dev *dev,
>> - struct mthca_qp *qp)
>> + struct mthca_qp *qp)
>> {
>> mthca_buf_free(dev, (int)(LONG_PTR)NEXT_PAGE_ALIGN(qp-
>> send_wqe_offset +
>> - (qp->sq.max << qp->sq.wqe_shift)),
>> - &qp->queue, qp->is_direct, &qp->mr);
>> + (qp->sq.max << qp-
>> sq.wqe_shift)), + &qp->queue, qp->is_direct, &qp- mr);
>> kfree(qp->wrid); }
>>
>> static int mthca_map_memfree(struct mthca_dev *dev,
>> - struct mthca_qp *qp)
>> + struct mthca_qp *qp)
>> { int ret; @@ -1207,10 +1208,10 @@ static int
>> mthca_map_memfree(struct mthc if (ret) goto err_qpc;
>> - ret = mthca_table_get(dev, dev->qp_table.rdb_table,
>> - qp->qpn << dev->qp_table.rdb_shift);
>> - if (ret)
>> - goto err_eqpc;
>> + ret = mthca_table_get(dev, dev->qp_table.rdb_table,
>> + qp->qpn << dev-
>>> qp_table.rdb_shift);
>> + if (ret)
>> + goto err_eqpc;
>>
>> } @@ -1235,7 +1236,7 @@ static void mthca_unmap_memfree(struct m }
>>
>> static int mthca_alloc_memfree(struct mthca_dev *dev,
>> - struct mthca_qp *qp)
>> + struct mthca_qp *qp)
>> { int ret = 0; @@ -1258,7 +1259,7 @@ static int
>> mthca_alloc_memfree(struct mt }
>>
>> static void mthca_free_memfree(struct mthca_dev *dev,
>> - struct mthca_qp *qp)
>> + struct mthca_qp *qp)
>> { if (mthca_is_memfree(dev)) { mthca_free_db(dev, MTHCA_DB_TYPE_SQ,
>> qp- sq.db_index); @@ -1280,10 +1281,10 @@ static int
>> mthca_alloc_qp_common(struct init_waitqueue_head(&qp->wait);
>> KeInitializeMutex(&qp->mutex, 0);
>> - qp->state = IBQPS_RESET;
>> + qp->state = IBQPS_RESET;
>> qp->atomic_rd_en = 0;
>> - qp->resp_depth = 0;
>> - qp->sq_policy = send_policy;
>> + qp->resp_depth = 0;
>> + qp->sq_policy = send_policy;
>> mthca_wq_init(&qp->sq); mthca_wq_init(&qp->rq); @@ -1321,7 +1322,7
>> @@ static int mthca_alloc_qp_common(struct struct mthca_next_seg
>> *next; struct mthca_data_seg *scatter; int size = (sizeof (struct
>> mthca_next_seg) +
>> - qp->rq.max_gs * sizeof (struct mthca_data_seg)) /
>> 16;
>> + qp->rq.max_gs * sizeof (struct
>> mthca_data_seg)) / 16;
>>
>> for (i = 0; i < qp->rq.max; ++i) { next = get_recv_wqe(qp, i); @@
>> -1330,15 +1331,15 @@ static int mthca_alloc_qp_common(struct
>> next->ee_nds = cl_hton32(size);
>>
>> for (scatter = (void *) (next + 1);
>> - (void *) scatter < (void *) ((u8*)next + (u32)(1 <<
>> qp->rq.wqe_shift)); - ++scatter) + (void *) scatter < (void *)
>> ((u8*)next + (u32)(1 << qp->rq.wqe_shift)); +
> ++scatter)
>> scatter->lkey =
> cl_hton32(MTHCA_INVAL_LKEY); }
>>
>> for (i = 0; i < qp->sq.max; ++i) {
>> next = get_send_wqe(qp, i);
>> next->nda_op = cl_hton32((((i + 1) & (qp->sq.max -
>> 1)) <<
>> - qp->sq.wqe_shift) +
>> + qp->sq.wqe_shift) +
>>> qp->send_wqe_offset); } } @@ -1355,11 +1356,11 @@ static
>>> int mthca_set_qp_size(struct mthc int max_data_size =
>>> mthca_max_data_size(dev, qp, dev- limits.max_desc_sz);
>>>
>> /* Sanity check QP size before proceeding */
>> - if (cap->max_send_wr > (u32)dev->limits.max_wqes || -
>>
>> cap->max_recv_wr > (u32)dev->limits.max_wqes || - cap->max_send_sge
>> > (u32)dev->limits.max_sg || - cap->max_recv_sge >
>> (u32)dev->limits.max_sg || - cap->max_inline_data >
>> (u32)mthca_max_inline_data(max_data_size)) + if (cap->max_send_wr >
>> (u32)dev->limits.max_wqes || + cap- max_recv_wr >
>> (u32)dev->limits.max_wqes || + cap->max_send_sge >
>> (u32)dev->limits.max_sg || + cap->max_recv_sge >
>> (u32)dev->limits.max_sg || + cap->max_inline_data >
>> (u32)mthca_max_inline_data(max_data_size))
>> return -EINVAL;
>>
>> /*
>> @@ -1387,9 +1388,9 @@ static int mthca_set_qp_size(struct mthc
>>
>> qp->rq.max_gs = cap->max_recv_sge;
>> qp->sq.max_gs = MAX(cap->max_send_sge,
>> - ALIGN(cap->max_inline_data +
>> MTHCA_INLINE_HEADER_SIZE,
>> - MTHCA_INLINE_CHUNK_SIZE) /
>> - (int)sizeof (struct mthca_data_seg));
>> + ALIGN(cap->max_inline_data +
>> MTHCA_INLINE_HEADER_SIZE,
>> + MTHCA_INLINE_CHUNK_SIZE) /
>> + (int)sizeof (struct mthca_data_seg));
>>
>> return 0; } @@ -1422,7 +1423,7 @@ int mthca_alloc_qp(struct mthca_dev
>> *dev return -ENOMEM;
>>
>> err = mthca_alloc_qp_common(dev, pd, send_cq, recv_cq,
>> - send_policy, qp);
>> + send_policy, qp);
>> if (err) { mthca_free(&dev->qp_table.alloc, qp->qpn); return err;
>> @@ -1437,14 +1438,14 @@ int mthca_alloc_qp(struct mthca_dev *dev }
>>
>> int mthca_alloc_sqp(struct mthca_dev *dev,
>> - struct mthca_pd *pd,
>> - struct mthca_cq *send_cq,
>> - struct mthca_cq *recv_cq,
>> - enum ib_sig_type send_policy,
>> - struct ib_qp_cap *cap,
>> - int qpn,
>> - int port,
>> - struct mthca_sqp *sqp)
>> + struct mthca_pd *pd,
>> + struct mthca_cq *send_cq,
>> + struct mthca_cq *recv_cq,
>> + enum ib_sig_type send_policy,
>> + struct ib_qp_cap *cap,
>> + int qpn,
>> + int port,
>> + struct mthca_sqp *sqp)
>> { u32 mqpn = qpn * 2 + dev->qp_table.sqp_start + port - 1; int err;
>> @@ -1474,11 +1475,11 @@ int mthca_alloc_sqp(struct mthca_dev *de
>> goto err_out;
>>
>> sqp->port = port;
>> - sqp->qp.qpn = mqpn;
>> + sqp->qp.qpn = mqpn;
>> sqp->qp.transport = MLX;
>>
>> err = mthca_alloc_qp_common(dev, pd, send_cq, recv_cq,
>> - send_policy, &sqp->qp);
>> + send_policy, &sqp->qp);
>> if (err) goto err_out_free; @@ -1558,10 +1559,10 @@ void
>> mthca_free_qp(struct mthca_dev *dev */ if (!qp->ibqp.ucontext) {
>> mthca_cq_clean(dev, to_mcq(qp->ibqp.send_cq)->cqn, qp- qpn,
>> - qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
>> + qp->ibqp.srq ? to_msrq(qp->ibqp.srq) :
>> NULL);
>> if (qp->ibqp.send_cq != qp->ibqp.recv_cq)
>> mthca_cq_clean(dev, to_mcq(qp->ibqp.recv_cq)-
>> cqn, qp->qpn,
>> - qp->ibqp.srq ? to_msrq(qp->ibqp.srq) :
>> NULL);
>> + qp->ibqp.srq ? to_msrq(qp-
>>> ibqp.srq) : NULL);
>>>
>> mthca_free_memfree(dev, qp); mthca_free_wqe_buf(dev, qp); @@
>> -1587,12 +1588,12 @@ static enum mthca_wr_opcode conv_ibal_wr case
>> WR_SEND: opcode = (wr->send_opt &
>> IB_SEND_OPT_IMMEDIATE) ? MTHCA_OPCODE_SEND_IMM :
>> MTHCA_OPCODE_SEND;
>> break;
>> - case WR_RDMA_WRITE:
>> + case WR_RDMA_WRITE:
>> opcode = (wr->send_opt &
>> IB_SEND_OPT_IMMEDIATE) ? MTHCA_OPCODE_RDMA_WRITE_IMM :
>> MTHCA_OPCODE_RDMA_WRITE;
>> break;
>> - case WR_RDMA_READ: opcode =
>> MTHCA_OPCODE_RDMA_READ; break;
>> - case WR_COMPARE_SWAP: opcode =
>> MTHCA_OPCODE_ATOMIC_CS; break;
>> - case WR_FETCH_ADD: opcode =
>> MTHCA_OPCODE_ATOMIC_FA; break;
>> + case WR_RDMA_READ: opcode =
>> MTHCA_OPCODE_RDMA_READ; break;
>> + case WR_COMPARE_SWAP: opcode =
>> MTHCA_OPCODE_ATOMIC_CS; break;
>> + case WR_FETCH_ADD: opcode =
>> MTHCA_OPCODE_ATOMIC_FA; break;
>> default: opcode = MTHCA_OPCODE_INVALID;break;
> } return opcode;
>> @@ -1600,9 +1601,9 @@ static enum mthca_wr_opcode conv_ibal_wr
>>
>> /* Create UD header for an MLX send and build a data segment for it */
>> static int build_mlx_header(struct mthca_dev *dev, struct mthca_sqp
> *sqp,
>> - int ind, struct _ib_send_wr *wr,
>> - struct mthca_mlx_seg *mlx,
>> - struct mthca_data_seg *data)
>> + int ind, struct _ib_send_wr *wr,
>> + struct mthca_mlx_seg *mlx,
>> + struct mthca_data_seg *data)
>> {
>> enum ib_wr_opcode opcode = conv_ibal_wr_opcode(wr);
>> int header_size;
>> @@ -1618,7 +1619,7 @@ static int build_mlx_header(struct mthca
>>
>> ib_ud_header_init(256, /* assume a MAD */
>> mthca_ah_grh_present(to_mah((struct ib_ah *)wr-
>> dgrm.ud.h_av)),
>> - &sqp->ud_header);
>> + &sqp->ud_header);
>>
>> err = mthca_read_ah(dev, to_mah((struct ib_ah *)wr- dgrm.ud.h_av),
>> &sqp->ud_header); if (err){ @@ -1662,7 +1663,7 @@ static int
>> build_mlx_header(struct mthca sqp- ud_header.bth.destination_qpn =
>> wr->dgrm.ud.remote_qp; sqp->ud_header.bth.psn =
>> cl_hton32((sqp->send_psn++) & ((1 << 24) - 1));
>> sqp->ud_header.deth.qkey = wr->dgrm.ud.remote_qkey &
>> 0x00000080 ?
>> - cl_hton32(sqp->qkey) : wr-
>>> dgrm.ud.remote_qkey; + cl_hton32(sqp->qkey) : wr- dgrm.ud.remote_qkey;
>>> sqp->ud_header.deth.source_qpn = cl_hton32(sqp- qp.ibqp.qp_num);
>>>
>> header_size = ib_ud_header_pack(&sqp->ud_header, @@ -1670,15 +1671,15
>> @@ static int build_mlx_header(struct mthca ind *
>> MTHCA_UD_HEADER_SIZE);
>>>
>>> data->byte_count = cl_hton32(header_size); - data->lkey =
>>> cl_hton32(to_mpd(sqp->qp.ibqp.pd)- ntmr.ibmr.lkey);
>> - data->addr = CPU_2_BE64(sqp->sg.dma_address +
>> - ind * MTHCA_UD_HEADER_SIZE);
>> + data->lkey = cl_hton32(to_mpd(sqp->qp.ibqp.pd)-
>>> ntmr.ibmr.lkey);
>> + data->addr = CPU_2_BE64(sqp->sg.dma_address +
>> + ind * MTHCA_UD_HEADER_SIZE);
>>
>> return 0;
>> }
>>
>> static inline int mthca_wq_overflow(struct mthca_wq *wq, int nreq,
>> - struct ib_cq *ib_cq)
>> + struct ib_cq *ib_cq)
>> { unsigned cur; struct mthca_cq *cq; @@ -1715,7 +1716,7 @@ int
>> mthca_tavor_post_send(struct ib_qp * SPIN_LOCK_PREP(lh);
>>
>> spin_lock_irqsave(&qp->sq.lock, &lh);
>> -
>> +
>> /* XXX check that state is OK to post send */
>>
>> ind = qp->sq.next_ind; @@ -1746,7 +1747,7 @@ int
>> mthca_tavor_post_send(struct ib_qp * cl_hton32(MTHCA_NEXT_SOLICIT) :
>> 0) | cl_hton32(1); if (opcode ==
> MTHCA_OPCODE_SEND_IMM||
>> - opcode == MTHCA_OPCODE_RDMA_WRITE_IMM)
>> + opcode == MTHCA_OPCODE_RDMA_WRITE_IMM)
>> ((struct mthca_next_seg *) wqe)->imm = wr-
>> immediate_data;
>>
>> wqe += sizeof (struct mthca_next_seg);
>> @@ -1834,8 +1835,8 @@ int mthca_tavor_post_send(struct ib_qp *
>>
>> case MLX:
>> err = build_mlx_header(dev, to_msqp(qp), ind, wr,
>> - (void*)(wqe - sizeof (struct
>> mthca_next_seg)),
>> - (void*)wqe);
>> + (void*)(wqe - sizeof (struct
>> mthca_next_seg)),
>> + (void*)wqe);
>> if (err) { if (bad_wr)
> *bad_wr = wr; @@ -1872,7 +1873,7
> @@
>> int mthca_tavor_post_send(struct ib_qp *
> }
>>
>> memcpy(wqe, (void *) (ULONG_PTR)
>> sge->vaddr,
>> - sge->length);
>> + sge->length);
>> wqe += sge->length; } @@ -1880,20 +1881,20 @@ int
>> mthca_tavor_post_send(struct ib_qp * size += align(s + sizeof
>> *seg, 16) / 16; } } else {
>> -
>> - for (i = 0; i < (int)wr->num_ds; ++i) {
>> - ((struct mthca_data_seg *) wqe)->byte_count =
>> - cl_hton32(wr->ds_array[i].length);
>> - ((struct mthca_data_seg *) wqe)->lkey =
>> - cl_hton32(wr->ds_array[i].lkey);
>> - ((struct mthca_data_seg *) wqe)->addr =
>> - cl_hton64(wr->ds_array[i].vaddr);
>> - wqe += sizeof (struct mthca_data_seg);
>> - size += sizeof (struct mthca_data_seg) / 16;
>> - HCA_PRINT(TRACE_LEVEL_VERBOSE ,HCA_DBG_QP
>> ,("SQ %06x [%02x] lkey 0x%08x vaddr 0x%I64x 0x%x\n",qp->qpn,i,
>> - (wr->ds_array[i].lkey),(wr-
>>> ds_array[i].vaddr),wr->ds_array[i].length));
>> - }
>> - }
>> +
>> + for (i = 0; i < (int)wr->num_ds; ++i) {
>> + ((struct mthca_data_seg *) wqe)-
>>> byte_count =
>> + cl_hton32(wr->ds_array[i].length); + ((struct mthca_data_seg
>> *) wqe)->lkey = + cl_hton32(wr- ds_array[i].lkey); + ((struct
>> mthca_data_seg *) wqe)->addr = + cl_hton64(wr->ds_array[i].vaddr);
>> + wqe += sizeof (struct mthca_data_seg); + size += sizeof
>> (struct mthca_data_seg) / 16; + HCA_PRINT(TRACE_LEVEL_VERBOSE
>> ,HCA_DBG_QP ,("SQ %06x [%02x] lkey 0x%08x vaddr 0x%I64x 0x%x\n",qp-
>>> qpn,i, + (wr->ds_array[i].lkey),(wr-
>>> ds_array[i].vaddr),wr->ds_array[i].length));
>> + }
>> + }
>>
>> /* Add one more inline data segment for ICRC */ if (qp->transport
>> == MLX) { @@ -1946,19 +1947,19 @@ out: wmb();
>>
>> mthca_write64(doorbell,
>> - dev->kar + MTHCA_SEND_DOORBELL,
>> - MTHCA_GET_DOORBELL_LOCK(&dev-
>>> doorbell_lock));
>> + dev->kar + MTHCA_SEND_DOORBELL,
>> + MTHCA_GET_DOORBELL_LOCK(&dev-
>>> doorbell_lock));
>>> }
>>>
>>> qp->sq.next_ind = ind;
>>> qp->sq.head += nreq;
>> - spin_unlock_irqrestore(&lh);
>> + spin_unlock_irqrestore(&lh);
>> return err;
>> }
>>
>> int mthca_tavor_post_recv(struct ib_qp *ibqp, struct _ib_recv_wr *wr,
>> - struct _ib_recv_wr **bad_wr)
>> + struct _ib_recv_wr **bad_wr)
>> { struct mthca_dev *dev = to_mdev(ibqp->device); struct mthca_qp *qp
>> = to_mqp(ibqp); @@ -1989,7 +1990,7 @@ int mthca_tavor_post_recv(struct
>> ib_qp * wmb();
>>
>> mthca_write64(doorbell, dev->kar +
>> MTHCA_RECV_DOORBELL,
>> - MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
>> + MTHCA_GET_DOORBELL_LOCK(&dev-
>>> doorbell_lock));
>>>
>> qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB; size0 = 0; @@
>> -2034,7 +2035,7 @@ int mthca_tavor_post_recv(struct ib_qp *
>> cl_hton64(wr->ds_array[i].vaddr); wqe += sizeof (struct
>> mthca_data_seg); size += sizeof (struct
> mthca_data_seg) / 16;
>> -// HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_QP
>> ,("RQ %06x [%02x] lkey 0x%08x vaddr 0x%I64x 0x %x 0x%08x\n",i,qp->qpn,
>> +// HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_QP
>> ,("RQ %06x [%02x] lkey 0x%08x vaddr 0x%I64x 0x %x 0x%08x\n",i,qp-
>> qpn, // (wr->ds_array[i].lkey),(wr-
>> ds_array[i].vaddr),wr->ds_array[i].length, wr->wr_id)); } @@ -2064,7
>> +2065,7 @@ out: wmb();
>>>
>> mthca_write64(doorbell, dev->kar +
>> MTHCA_RECV_DOORBELL,
>> - MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
>> + MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
>> }
>>
>> qp->rq.next_ind = ind;
>> @@ -2228,7 +2229,7 @@ int mthca_arbel_post_send(struct ib_qp *
>>
>> case UD:
>> memcpy(((struct mthca_arbel_ud_seg *) wqe)->av,
>> - to_mah((struct ib_ah *)wr->dgrm.ud.h_av)->av,
>> MTHCA_AV_SIZE); + to_mah((struct ib_ah *)wr-
>>> dgrm.ud.h_av)->av, MTHCA_AV_SIZE);
>>> ((struct mthca_arbel_ud_seg *) wqe)->dqpn = wr-
>>> dgrm.ud.remote_qp;
>>> ((struct mthca_arbel_ud_seg *) wqe)->qkey = wr-
>>> dgrm.ud.remote_qkey;
>>
>> @@ -2238,8 +2239,8 @@ int mthca_arbel_post_send(struct ib_qp *
>>
>> case MLX:
>> err = build_mlx_header(dev, to_msqp(qp), ind, wr,
>> - (void*)(wqe - sizeof (struct
>> mthca_next_seg)),
>> - (void*)wqe);
>> + (void*)(wqe - sizeof (struct
>> mthca_next_seg)),
>> + (void*)wqe);
>> if (err) { if (bad_wr)
> *bad_wr = wr; @@ -2257,7 +2258,7
> @@
>> int mthca_arbel_post_send(struct ib_qp * *bad_wr = wr; goto out;
>> }
>> - if (wr->send_opt & IB_SEND_OPT_INLINE) {
>> + if (wr->send_opt & IB_SEND_OPT_INLINE) {
>> if (wr->num_ds) { struct mthca_inline_seg *seg = (struct
>> mthca_inline_seg *)wqe; uint32_t s = 0; @@ - 2276,7 +2277,7 @@ int
>> mthca_arbel_post_send(struct ib_qp *
> }
>>
>> memcpy(wqe, (void *) (uintptr_t)
>> sge->vaddr,
>> - sge->length);
>> + sge->length);
>> wqe += sge->length; } @@ -2284,17 +2285,17 @@ int
>> mthca_arbel_post_send(struct ib_qp * size += align(s + sizeof
>> *seg, 16) / 16; } } else {
>> - for (i = 0; i < (int)wr->num_ds; ++i) {
>> - ((struct mthca_data_seg *) wqe)->byte_count =
>> - cl_hton32(wr->ds_array[i].length);
>> - ((struct mthca_data_seg *) wqe)->lkey =
>> - cl_hton32(wr->ds_array[i].lkey);
>> - ((struct mthca_data_seg *) wqe)->addr =
>> - cl_hton64(wr->ds_array[i].vaddr);
>> - wqe += sizeof (struct mthca_data_seg);
>> - size += sizeof (struct mthca_data_seg) / 16;
>> - }
>> - }
>> + for (i = 0; i < (int)wr->num_ds; ++i) {
>> + ((struct mthca_data_seg *) wqe)-
>>> byte_count =
>> + cl_hton32(wr->ds_array[i].length); + ((struct mthca_data_seg
>> *) wqe)->lkey = + cl_hton32(wr- ds_array[i].lkey); + ((struct
>> mthca_data_seg *) wqe)->addr = + cl_hton64(wr->ds_array[i].vaddr);
>> + wqe += sizeof (struct mthca_data_seg); + size += sizeof
>> (struct mthca_data_seg) / 16; + } + }
>>
>> /* Add one more inline data segment for ICRC */ if (qp->transport
>> == MLX) { @@ -2354,8 +2355,8 @@ out: */ wmb();
>> mthca_write64(doorbell,
>> - dev->kar + MTHCA_SEND_DOORBELL,
>> - MTHCA_GET_DOORBELL_LOCK(&dev-
>>> doorbell_lock));
>> + dev->kar + MTHCA_SEND_DOORBELL,
>> + MTHCA_GET_DOORBELL_LOCK(&dev-
>>> doorbell_lock));
>>> }
>>>
>>> spin_unlock_irqrestore(&lh); @@ -2363,7 +2364,7 @@ out: }
>>>
>> int mthca_arbel_post_recv(struct ib_qp *ibqp, struct _ib_recv_wr *wr,
>> - struct _ib_recv_wr **bad_wr)
>> + struct _ib_recv_wr **bad_wr)
>> { struct mthca_qp *qp = to_mqp(ibqp); int err = 0; @@ -2373,7
>> +2374,7 @@ int mthca_arbel_post_recv(struct ib_qp * u8 *wqe;
>> SPIN_LOCK_PREP(lh);
>> - spin_lock_irqsave(&qp->rq.lock, &lh);
>> + spin_lock_irqsave(&qp->rq.lock, &lh);
>>
>> /* XXX check that state is OK to post receive */ @@ -2444,7 +2445,7
>> @@ out: }
>>
>> void mthca_free_err_wqe(struct mthca_dev *dev, struct mthca_qp *qp,
> int
>> is_send,
>> - int index, int *dbd, __be32 *new_wqe)
>> + int index, int *dbd, __be32 *new_wqe)
>> { struct mthca_next_seg *next; @@ -2487,15 +2488,15 @@ int
>> mthca_init_qp_table(struct mthca_dev */ dev->qp_table.sqp_start =
>> (dev->limits.reserved_qps + 1) & ~1UL; err =
>> mthca_alloc_init(&dev->qp_table.alloc,
>> - dev->limits.num_qps,
>> - (1 << 24) - 1,
>> - dev->qp_table.sqp_start +
>> - MTHCA_MAX_PORTS * 2);
>> + dev->limits.num_qps,
>> + (1 << 24) - 1,
>> + dev->qp_table.sqp_start +
>> + MTHCA_MAX_PORTS * 2);
>> if (err)
>> return err;
>>
>> err = mthca_array_init(&dev->qp_table.qp,
>> - dev->limits.num_qps);
>> + dev->limits.num_qps);
>> if (err) {
>> mthca_alloc_cleanup(&dev->qp_table.alloc);
>> return err;
>> @@ -2503,8 +2504,8 @@ int mthca_init_qp_table(struct mthca_dev
>>
>> for (i = 0; i < 2; ++i) {
>> err = mthca_CONF_SPECIAL_QP(dev, i ? IB_QPT_QP1 :
>> IB_QPT_QP0,
>> - dev->qp_table.sqp_start + i * 2,
>> - &status);
>> + dev->qp_table.sqp_start + i *
>> 2,
>> + &status);
>> if (err)
>> goto err_out;
>> if (status) {
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/mt_utils.h branches\mlx4/hw/mthca/mt_utils.h ---
>> trunk/hw/mthca/mt_utils.h 2011-09-13 09:16:20.549343600 -0700 +++
>> branches\mlx4/hw/mthca/mt_utils.h 2011-10-10 16:59:49.555734600 -0700
>> @@ -111,7 +111,7 @@ static __inline int _ffs(const unsigned
>> }
>> -#define ffs(val) _ffs((const unsigned long *)&val)
>> +#define ffs(val) _ffs((const unsigned long *)&(val))
>>
>> /** * _ffz_raw - find the first zero bit in a word @@ -202,21 +202,22
>> @@ static __inline int find_first_zero_bit( static __inline int
>> find_next_zero_bit(const unsigned long *addr, int bits_size, int
>> offset) { int res;
>> - int ix = offset % BITS_PER_LONG;
>> - int w_offset = offset / BITS_PER_LONG;
>> + int ix = offset & 31;
>> + int set = offset & ~31;
>> + const unsigned long *p = addr + (set >> 5);
>>
>> // search in the first word while we are in the middle
>> if (ix) {
>> - res = _ffz_raw(addr + w_offset, ix);
>> + res = _ffz_raw(p, ix);
>> if (res)
>> - return res - 1;
>> - ++addr;
>> - bits_size -= BITS_PER_LONG;
>> - ix = BITS_PER_LONG;
>> + return set + res - 1;
>> + ++p;
>> + set += BITS_PER_LONG;
>> }
>> - res = find_first_zero_bit( addr, bits_size );
>> - return res + ix;
>> + // search the rest of the bitmap
>> + res = find_first_zero_bit(p, bits_size - (unsigned)(32 * (p - addr)));
>> + return res + set;
>> }
>>
>> void fill_bit_tbls();
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/user/mlnx_ual_main.c
>> branches\mlx4/hw/mthca/user/mlnx_ual_main.c ---
>> trunk/hw/mthca/user/mlnx_ual_main.c 2011-09-13 09:16:20.315320200 -0700
>> +++ branches\mlx4/hw/mthca/user/mlnx_ual_main.c 2011-10-10
>> 16:59:49.172696300 -0700 @@ -44,13 +44,6 @@ uint32_t mlnx_dbg_lvl = 0;
>> // MLNX_TRACE
>>
>> static void uvp_init();
>> -extern BOOL APIENTRY
>> -_DllMainCRTStartupForGS(
>> - IN HINSTANCE
>> h_module,
>> - IN DWORD
>> ul_reason_for_call,
>> - IN LPVOID
>> lp_reserved );
>> -
>> -
>> BOOL APIENTRY
>> DllMain(
>> IN HINSTANCE
>> h_module,
>> @@ -61,14 +54,8 @@ DllMain(
>> {
>> case DLL_PROCESS_ATTACH:
>> #if defined(EVENT_TRACING)
>> - WPP_INIT_TRACING(L"mthcau.dll");
>> + WPP_INIT_TRACING(L"mthcau.dll");
>> #endif
>> - if( !_DllMainCRTStartupForGS(
>> - h_module, ul_reason_for_call, lp_reserved ) )
>> - {
>> - return FALSE;
>> - }
>> -
>> fill_bit_tbls(); uvp_init(); break; @@ - 86,8 +73,7 @@ DllMain(
>> #endif
>>
>> default:
>> - return _DllMainCRTStartupForGS(
>> - h_module, ul_reason_for_call, lp_reserved );
>> + return TRUE;
>> }
>> return TRUE;
>> }
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/user/mlnx_uvp.h
>> branches\mlx4/hw/mthca/user/mlnx_uvp.h ---
>> trunk/hw/mthca/user/mlnx_uvp.h 2011-09-13 09:16:20.144303100 -0700 +++
>> branches\mlx4/hw/mthca/user/mlnx_uvp.h 2011-10-10 16:59:49.049684000
>> -0700 @@ -131,7 +131,7 @@ struct mthca_cq {
>> int arm_db_index;
>> uint32_t *arm_db;
>> int u_arm_db_index;
>> - uint32_t *p_u_arm_sn;
>> + volatile uint32_t *p_u_arm_sn;
>> };
>>
>> struct mthca_srq { @@ -257,7 +257,7 @@ static inline int
>> mthca_is_memfree(struc }
>>
>> int mthca_alloc_db(struct mthca_db_table *db_tab, enum
> mthca_db_type
>> type,
>> - uint32_t **db);
>> + volatile uint32_t **db);
>> void mthca_set_db_qn(uint32_t *db, enum mthca_db_type type, uint32_t
>> qn); void mthca_free_db(struct mthca_db_table *db_tab, enum
>> mthca_db_type type, int db_index); struct mthca_db_table
>> *mthca_alloc_db_tab(int uarc_size);
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/user/mlnx_uvp.rc
>> branches\mlx4/hw/mthca/user/mlnx_uvp.rc ---
>> trunk/hw/mthca/user/mlnx_uvp.rc 2011-09-13 09:16:20.414330100 -0700 +++
>> branches\mlx4/hw/mthca/user/mlnx_uvp.rc 2011-10-10 16:59:49.198698900
>> -0700 @@ -37,8 +37,8 @@
>>
>> #ifdef DBG
>> #define VER_FILEDESCRIPTION_STR "HCA User Mode Verb Provider
>> (checked)"
>> -#define VER_INTERNALNAME_STR "mthcaud.dll"
>> -#define VER_ORIGINALFILENAME_STR "mthcaud.dll"
>> +#define VER_INTERNALNAME_STR "mthcau.dll"
>> +#define VER_ORIGINALFILENAME_STR "mthcau.dll"
>> #else
>> #define VER_FILEDESCRIPTION_STR "HCA User Mode Verb Provider"
>> #define VER_INTERNALNAME_STR "mthcau.dll"
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/user/mlnx_uvp_memfree.c
>> branches\mlx4/hw/mthca/user/mlnx_uvp_memfree.c ---
>> trunk/hw/mthca/user/mlnx_uvp_memfree.c 2011-09-13 09:16:20.088297500
>> -0700 +++ branches\mlx4/hw/mthca/user/mlnx_uvp_memfree.c 2011- 10-10
>> 16:59:49.368715900 -0700 @@ -52,7 +52,7 @@ struct mthca_db_table {
>> };
>>
>> int mthca_alloc_db(struct mthca_db_table *db_tab, enum
> mthca_db_type
>> type,
>> - uint32_t **db)
>> + volatile uint32_t **db)
>> { int i, j, k; int group, start, end, dir; @@ -128,7 +128,7 @@
>> found: j = MTHCA_DB_REC_PER_PAGE - 1 - j;
>>
>> ret = i * MTHCA_DB_REC_PER_PAGE + j;
>> - *db = (uint32_t *) &db_tab->page[i].db_rec[j];
>> + *db = (volatile uint32_t *) &db_tab->page[i].db_rec[j];
>>
>> out:
>> ReleaseMutex( db_tab->mutex );
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/hw/mthca/user/SOURCES branches\mlx4/hw/mthca/user/SOURCES
>> --- trunk/hw/mthca/user/SOURCES 2011-09-13 09:16:19.951283800 -0700 +++
>> branches\mlx4/hw/mthca/user/SOURCES 2011-10-10 16:59:49.282707300 -0700
>> @@ -2,15 +2,20 @@ TRUNK=..\..\..
>>
>> TARGETNAME=mthcau + TARGETPATH=$(TRUNK)\bin\user\obj$(BUILD_ALT_DIR)
>> TARGETTYPE=DYNLINK
>> -
>> +!if $(_NT_TOOLS_VERSION) == 0x700
>> +# DDK
>> +DLLDEF=$O\mlnx_uvp.def
>> +!else
>> # WDK
>> DLLDEF=$(OBJ_PATH)\$O\mlnx_uvp.def
>> -
>> +!endif
>> #USE_NTDLL=1
>> USE_MSVCRT=1
>> DLLENTRY=DllMain
>> +NTTARGETFILES=Custom_target
>>
>> !if $(FREEBUILD) ENABLE_EVENT_TRACING=1 @@ -56,8 +61,13 @@
>> TARGETLIBS=\ $(SDK_LIB_PATH)\user32.lib \
>> $(SDK_LIB_PATH)\kernel32.lib \ $(SDK_LIB_PATH)\Advapi32.lib \
>> - $(TARGETPATH)\*\complib.lib \
>> - $(TARGETPATH)\*\ibal.lib
>> + $(TARGETPATH)\*\complib.lib \
>> + $(TARGETPATH)\*\ibal.lib
>> +
>> +
>> +!if !$(FREEBUILD)
>> +C_DEFINES=$(C_DEFINES) -D_DEBUG -DDEBUG -DDBG
>> +!endif
>>
>> #LINKER_FLAGS=/MAP /MAPINFO:LINES
>> SH: That's a huge number of changes to a driver that does NOT support
>> IBoE. Are all of those really needed?
>>
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/inc/complib/cl_memory.h
>> branches\mlx4/inc/complib/cl_memory.h ---
>> trunk/inc/complib/cl_memory.h 2011-09-13 09:15:47.799068900 -0700 +++
>> branches\mlx4/inc/complib/cl_memory.h 2011-10-10 16:59:17.406520000
>> -0700 @@ -189,6 +189,55 @@ __cl_malloc_trk(
>> * Memory Management, __cl_malloc_ntrk, __cl_zalloc_trk, __cl_free_trk
>> **********/
>> +/****i* Component Library: Memory Management/__cl_malloc_trk_ex +*
>> NAME +* __cl_malloc_trk_ex +* +* DESCRIPTION +* The __cl_malloc_trk_ex
>> function allocates and tracks a block of memory +* initialized to zero.
>> +* +* SYNOPSIS +*/ +CL_EXPORT void* CL_API +__cl_malloc_trk_ex(
>> + IN const char* const p_file_name, + IN const int32_t line_num,
>> + IN const size_t size, + IN const boolean_t pageable, + IN const
>> char* tag ); +/* +* PARAMETERS +* p_file_name +* [in] Name of the
>> source file initiating the allocation. +* +* line_num +* [in] Line
>> number in the specified file where the allocation is +* initiated +*
>> +* size +* [in] Size of the requested allocation. +* +* pageable
>> +* [in] On operating systems that support pageable vs. non pageable
>> +* memory in the kernel, set to TRUE to allocate memory from paged
>> pool. +* tag +* [in] An optional ASCII string, describing the name
>> of memory block (or the owner) +* +* RETURN VALUES +* Pointer to
>> allocated memory if successful. +* +* NULL otherwise. +* +* NOTES
>> +* Allocated memory follows alignment rules specific to the different
>> +* environments. +* This function should not be called directly. The
>> cl_zalloc macro will +* redirect users to this function when memory
>> tracking is enabled. +* +* SEE ALSO +* Memory Management,
>> __cl_zalloc_ntrk, __cl_malloc_trk, __cl_free_trk +**********/
>>
>> /****i* Component Library: Memory Management/__cl_zalloc_trk * NAME @@
>> -237,6 +286,57 @@ __cl_zalloc_trk( * Memory Management,
>> __cl_zalloc_ntrk, __cl_malloc_trk, __cl_free_trk **********/
>> +/****i* Component Library: Memory Management/__cl_zalloc_trk_ex +*
>> NAME +* __cl_zalloc_trk_ex +* +* DESCRIPTION +* The __cl_zalloc_trk_ex
>> function allocates and tracks a block of memory +* initialized to zero.
>> +* +* SYNOPSIS +*/ +CL_EXPORT void* CL_API +__cl_zalloc_trk_ex(
>> + IN const char* const p_file_name, + IN const int32_t line_num,
>> + IN const size_t size, + IN const boolean_t pageable, + IN const
>> char* tag ); +/* +* PARAMETERS +* p_file_name +* [in] Name of the
>> source file initiating the allocation. +* +* line_num +* [in] Line
>> number in the specified file where the allocation is +* initiated +*
>> +* size +* [in] Size of the requested allocation. +* +* pageable
>> +* [in] On operating systems that support pageable vs. non pageable
>> +* memory in the kernel, set to TRUE to allocate memory from paged
>> pool. +* tag +* [in] An optional ASCII string, describing the name
>> of memory block (or the owner) +* +* RETURN VALUES +* Pointer to
>> allocated memory if successful. +* +* NULL otherwise. +* +* NOTES
>> +* Allocated memory follows alignment rules specific to the different
>> +* environments. +* This function should not be called directly. The
>> cl_zalloc macro will +* redirect users to this function when memory
>> tracking is enabled. +* +* SEE ALSO +* Memory Management,
>> __cl_zalloc_ntrk, __cl_malloc_trk, __cl_free_trk +**********/ + +
>>
>> /****i* Component Library: Memory Management/__cl_malloc_ntrk * NAME
>> @@ -933,6 +1033,18 @@ cl_copy_from_user( #define cl_pzalloc( a ) \
>> __cl_zalloc_trk( __FILE__, __LINE__, a, TRUE )
>> +#define cl_malloc_ex( a, tag ) \
>> + __cl_malloc_trk_ex( __FILE__, __LINE__, a, FALSE, tag )
>> +
>> +#define cl_zalloc_ex( a, tag ) \
>> + __cl_zalloc_trk_ex( __FILE__, __LINE__, a, FALSE, tag )
>> +
>> +#define cl_palloc_ex( a, tag ) \
>> + __cl_malloc_trk_ex( __FILE__, __LINE__, a, TRUE, tag )
>> +
>> +#define cl_pzalloc_ex( a, tag ) \
>> + __cl_zalloc_trk_ex( __FILE__, __LINE__, a, TRUE, tag )
>> +
>> #define cl_free( a ) \
>> __cl_free_trk( a )
>> @@ -949,6 +1061,14 @@ cl_copy_from_user(
>>
>> #define cl_pzalloc( a ) \
>> __cl_zalloc_ntrk( a, TRUE )
>> +
>> +#define cl_malloc_ex( a, tag ) cl_malloc( a )
>> +
>> +#define cl_zalloc_ex( a, tag ) cl_zalloc( a )
>> +
>> +#define cl_palloc_ex( a, tag ) cl_palloc( a )
>> +
>> +#define cl_pzalloc_ex( a, tag ) cl_pzalloc( a )
>>
>> #define cl_free( a ) \
>> __cl_free_ntrk( a )
>> SH: Do not extend complib even more. It needs to go away and be
>> replaced with native calls (which any Windows developer would
>> recognize), not added to.
>>
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/inc/iba/ib_al_ioctl.h branches\mlx4/inc/iba/ib_al_ioctl.h
>> --- trunk/inc/iba/ib_al_ioctl.h 2011-09-13 09:15:48.686157600 -0700 +++
>> branches\mlx4/inc/iba/ib_al_ioctl.h 2011-10-10 16:59:19.579737300 -0700
>> @@ -3479,7 +3479,7 @@ typedef struct _ual_ndi_req_cm_ioctl_in
>> uint64_t h_qp;
>> net64_t guid;
>> net32_t cid;
>> - uint16_t dst_port;
>> + net16_t dst_port;
>> uint8_t resp_res;
>> uint8_t init_depth;
>> uint8_t prot;
>> diff -up -r -X \users\mshefty\scm\ofw\gen1\trunk\docs\dontdiff.txt -I
>> '\$Id' trunk/inc/iba/ib_ci.h branches\mlx4/inc/iba/ib_ci.h ---
>> trunk/inc/iba/ib_ci.h 2011-09-13 09:15:48.704159400 -0700 +++
>> branches\mlx4/inc/iba/ib_ci.h 2011-10-10 16:59:19.596739000 -0700 @@
>> -74,7 +74,9 @@ extern "C"
>> * definition.
>> */
>> #define VERBS_MAJOR_VER (0x0002)
>> -#define VERBS_MINOR_VER (0x0002)
>> +#define VERBS_MINOR_VER (0x0004)
>> +#define VERBS_EX_MAJOR_VER (0x0001)
>> +#define VERBS_EX_MINOR_VER (0x0000)
>>
>> #define VERBS_VERSION (((VERBS_MAJOR_VER) << 16) |
>> (VERBS_MINOR_VER)) #define MK_VERBS_VERSION(maj,min) ((((maj) &
>> 0xFFFF) << 16) | \
>> SH: Can't this be done without breaking every application? What is the plan
>> for supporting existing applications?
>>
>> @@ -164,7 +166,7 @@ typedef void
>> * NOTES
>> * The consumer only gets the cq_context. It is the client
>> * responsibility to store the cq_handle in the context after the creation
>> -* time. So it can call ci_poll_cq() after the arrival of the notification.
>> +* time. So it can call ci_poll_cq() or ci_poll_cq_array() after the arrival
>> of the notification.
>> * SEE ALSO * ci_create_cq ****** @@ -916,7 +918,7 @@ typedef
>> ib_api_status_t IN const ib_pd_handle_t h_pd, IN const void
>> *qp_context, IN const ci_async_event_cb_t
>> pfn_async_event_cb,
>> - IN const ib_qp_create_t
>> *p_create_attr,
>> + IN OUT ib_qp_create_t
>> *p_create_attr,
>> OUT ib_qp_attr_t *p_qp_attr, OUT ib_qp_handle_t *ph_qp,
>> IN OUT ci_umv_buf_t
>> *p_umv_buf OPTIONAL );
>> @@ -934,7 +936,7 @@ typedef ib_api_status_t
>> * pfn_async_event_cb
>> * [in] Asynchronous event handler.
>> * p_create_attr
>> -* [in] Initial attributes with which the qp must be created.
>> +* [in,out] Initial attributes with which the qp must be created.
>> * p_qp_attr * [out] Attributes of the newly created queue pair.
>> * ph_qp @@ -961,6 +963,7 @@ typedef ib_api_status_t * Unreliable
>> datagram not supported * IB_INVALID_PARAMETER * The parameter
>> p_create_attr is invalid. +* erroneous value p_create_attr fixed to
>> the max possible * NOTES * If any of the initial parameters is not
>> valid, the queue pair is not * created. If the routine call is not
>> successful then the contents of @@ -982,7 +985,7 @@ typedef
>> ib_api_status_t IN const uint8_t port_num,
>> IN const void *qp_context,
> IN const ci_async_event_cb_t
>> pfn_async_event_cb,
>> - IN const ib_qp_create_t
>> *p_create_attr,
>> + IN OUT ib_qp_create_t
>> *p_create_attr,
>> OUT ib_qp_attr_t *p_qp_attr, OUT ib_qp_handle_t *ph_qp ); /*
>> @@ -1001,8 +1004,9 @@ typedef ib_api_status_t * pfn_async_event_cb
>> * [in] Asynchronous event handler. * p_create_attr
>> -* [in] Initial set of attributes with which the queue pair is to be
>> -* created. +* [in,out] Initial set of attributes with which the
>> queue pair is to be created. +* Upon invalid parameter function
>> will return IB_INVALID_SETTING +* and change the parameter by
>> max allowable value.
>> * p_qp_attr * [out] QP attributes after the qp is successfully
>> created. * @@ -1230,7 +1234,7 @@ typedef ib_api_status_t * pending
>> callbacks returning back to the verbs provider driver. * * If the CQ
>> associated with this QP is still not destroyed, the
>> completions
>> -* on behalf of this QP can still be pulled via the ci_poll_cq() call. Any
>> +* on behalf of this QP can still be pulled via the ci_poll_cq() or
>> ci_poll_cq_array() call. Any
>> * resources allocated by the Channel Interface must be deallocated as
>> part * of this call. * SEE ALSO @@ -1289,7 +1293,83 @@ typedef
>> ib_api_status_t * one of the parameters was NULL. * NOTES * The
>> consumer would need a way to retrieve the cq_handle
>> associated with -* context being returned, so it can perform
>> ci_poll_cq() to retrieve +* context being returned, so it can perform
>> ci_poll_cq() or ci_poll_cq_array() to retrieve +* completion queue
>> entries. The handle as such is not being passed, since +* there is no
>> information in the handle that is visible to the consumer. +* Passing a
>> context directly would help avoid any reverse lookup that the
>> +* consumer would need to perform in order to identify it's own
>> internal +* data-structures needed to process this completion
>> completely. +* SEE ALSO +* ci_destroy_cq, ci_query_cq, ci_resize_cq
>> +****** +*/ + + +/****** struct ci_group_affinity_t +* mask - Specifies
>> the affinity mask. The bits in the affinity mask identify a set of
>> processors within the group identified by 'group' field. +* group -
>> Specifies the group number. +*/ +typedef struct _ib_group_affinity +{
>> + uint64_t mask; + uint16_t group; +} ib_group_affinity_t; +
>> +/****f* Verbs/ci_create_cq +* NAME +* ci_create_cq_ex -- Create a
>> completion queue (CQ) on the specified HCA with specified affinity. +*
>> SYNOPSIS +*/ + +typedef ib_api_status_t +(*ci_create_cq_ex) (
>> + IN const ib_ca_handle_t h_ca, + IN const void *cq_context,
>> + IN const ci_async_event_cb_t pfn_async_event_cb,
>> + IN ci_completion_cb_t
> completion_cb, + IN
> ib_group_affinity_t
>> *affinity, + IN OUT uint32_t* const
> p_size,
>> + OUT ib_cq_handle_t
> *ph_cq, + IN OUT ci_umv_buf_t
> *p_umv_buf
>> OPTIONAL );
>>
>> SH: If we need a new call to create CQs, we should just pass in a
>> structure, so that it can be more easily extended later.
>>
>> +/* +* DESCRIPTION +* The consumer must specify the minimum number of
>> entries in the CQ. The +* exact number of entries the Channel Interface
>> created is returned to the +* client. If the requested number of
>> entries is larger than what this +* HCA can support, an error is
>> returned. +* PARAMETERS +* h_ca +* [in] A handle to the open HCA
>> +* cq_context +* [in] The context that is passed during the completion
>> callbacks. +* pfn_async_event_cb +* [in] Asynchronous event handler.
>> +* completion_cb +* [in] Callback for completion events +* affinity
>> +* [in] CQ affinity +* p_size +* [in out] Points to a variable
>> containing the number of CQ entries +* requested by the consumer. On
>> completion points to the size of the +* CQ that was created by the
>> provider. +* ph_cq +* [out] Handle to the newly created CQ on
>> successful creation. +* p_umv_buf +* [in out] Vendor specific
>> parameter to support user mode IO. +* RETURN VALUE +* IB_SUCCESS +*
>> The operation was successful. +* IB_INVALID_CA_HANDLE +* The h_ca
>> passed is invalid. +* IB_INSUFFICIENT_RESOURCES +* Insufficient
>> resources to complete request. +* IB_INVALID_CQ_SIZE +* Requested CQ
>> Size is not supported. +* IB_INVALID_PARAMETER +* one of the
>> parameters was NULL. +* NOTES +* The consumer would need a way to
>> retrieve the cq_handle associated with +* context being returned, so it
>> can perform ci_poll_cq() or ci_poll_cq_array() to retrieve
>> * completion queue entries. The handle as such is not being passed,
>> since * there is no information in the handle that is visible to the
>> consumer. * Passing a context directly would help avoid any reverse
>> lookup that
>> the
>> @@ -1353,6 +1433,41 @@ typedef ib_api_status_t
>> ******
>> */
>> +typedef ib_api_status_t
>> +(*ci_modify_cq) (
>> + IN const ib_cq_handle_t
>> h_cq,
>> + IN uint16_t
>> moder_cnt,
>> + IN uint16_t
>> moder_time,
>> + IN OUT ci_umv_buf_t
>> *p_umv_buf OPTIONAL );
>>
>> SH: This needs a difference name than 'modify CQ', but I really
>> question whether this functionality is something that should be exposed
>> above verbs. This seems more like a feature of how the CQ is armed,
>> versus its existence.
>>
>> +/* +* DESCRIPTION +* This routine allows the caller to modify CQ
>> interrupt moderation. +* PARAMETERS +* h_cq +* [in] Completion Queue
>> handle +* moder_cnt +* [in] This parameter indicates the requested
>> interrupt moderation count. +* moder_time +* [in] This parameter
>> indicates the requested time interval between indicated interrupts.
>> +* p_umv_buf +* [in out] Vendor specific parameter to support user
>> mode IO. +* RETURN VALUE +* IB_SUCCESS +* The modify operation was
>> successful. +* IB_INVALID_CQ_HANDLE +* The CQ handle is invalid.
>> +* IB_INSUFFICIENT_RESOURCES +* Insufficient resources to complete
>> request. +* IB_INVALID_PARAMETER +* one of the parameters was NULL. +*
>> +* NOTES +* +* SEE ALSO +* ci_create_cq +****** +*/ +
>> /****f* Verbs/ci_query_cq * NAME * ci_query_cq -- Query the number of
>> entries configured for the CQ. @@ -2273,7 +2388,7 @@ typedef
>> ib_api_status_t * on different types of queue pairs, and the different
>> modifiers * acceptable for the work request for different QP service
>> types. * SEE ALSO
>> -* ci_post_recv, ci_poll_cq
>> +* ci_post_recv, ci_poll_cq, ci_poll_cq_array
>> ****** */ @@ -2365,7 +2480,7 @@ typedef ib_api_status_t * QP was in
>> reset or init state. * (TBD: there may be an errata that allows
>> posting in init state) * SEE ALSO
>> -* ci_post_send, ci_poll_cq.
>> +* ci_post_send, ci_poll_cq, ci_poll_cq_array
>> ****** */ @@ -2406,7 +2521,7 @@ typedef ib_api_status_t * is optional
>> by a channel adapter vendor. * * SEE ALSO
>> -* ci_create_cq, ci_poll_cq, ci_enable_cq_notify,
>> ci_enable_ncomp_cq_notify +* ci_create_cq, ci_poll_cq,
>> ci_poll_cq_array, ci_enable_cq_notify, ci_enable_ncomp_cq_notify
>> *****/
>>
>> /****f* Verbs/ci_poll_cq @@ -2450,6 +2565,57 @@ typedef
>> ib_api_status_t ****** */
>> + +/****f* Verbs/ci_poll_cq_array +* NAME +* ci_poll_cq_array --
>> Retrieve a work completion record from a completion queue +* SYNOPSIS
>> +*/ + +typedef ib_api_status_t +(*ci_poll_cq_array) (
>> + IN const ib_cq_handle_t h_cq, + IN OUT int* p_num_entries,
>> + OUT ib_wc_t* const wc ); +/* +* DESCRIPTION +* This routine
>> retrieves a work completion entry from the specified +* completion
>> queue. The contents of the data returned in a work completion +* is
>> specified in ib_wc_t. +* +* PARAMETERS +* h_cq +* [in] Handle to the
>> completion queue being polled. +* p_num_entries +* [in out] Pointer to
>> a variable, containing the number of entries in the array. +* On
>> succeful return it will contain the number of filled entries of the
>> array. +* wc +* [out] An array of workcompletions retrieved from the
>> completion queue +* and successfully processed. +* +* RETURN VALUE
>> +* IB_SUCCESS +* Poll completed successfully and found N>0 entries.
>> +* The wc array then contains N entries filled and *p_num_entries is
>> equal to N. +* IB_INVALID_CQ_HANDLE +* The cq_handle supplied is not
>> valid. +* IB_NOT_FOUND +* There were no completion entries found in
>> the specified CQ. +* +* NOTES +* This function returns qp_context in
>> the first field of WC structure. +* This first field (p_next) is
>> intended to link WCs in a list and is not supposed +* to be used in an
>> array of WCs. +* qp_context is a value, defined by user upon create_qp.
>> +* This function is intended for use with SRQ when the new qp_context
>> +* returned value will to the QP, related to the completion. +* +* SEE
>> ALSO +* ci_create_cq, ci_post_send, ci_post_recv, ci_bind_mw +******
>> +*/ + +
>> /****f* Verbs/ci_enable_cq_notify
>> * NAME
>> * ci_enable_cq_notify -- Invoke the Completion handler, on next entry
>> added.
>> @@ -2482,12 +2648,12 @@ typedef ib_api_status_t
>> * The consumer cannot call a request for notification without emptying
>> * entries from the CQ. i.e if a consumer registers for a notification
>> * request in the completion callback before pulling entries from the
>> -* CQ via ci_poll_cq, the notification is not generated for completions
>> +* CQ via ci_poll_cq or ci_poll_cq_array, the notification is not
>> generated for completions
>> * already in the CQ. For e.g. in the example below, if there are no calls
>> -* to ci_poll_cq() after the ci_enable_cq_notify(). For any CQ entries
>> added +* to ci_poll_cq() or ci_poll_cq_array() after the
>> ci_enable_cq_notify(). For any CQ entries added
>> * before calling this ci_enable_cq_notify() call, the consumer does not
>> * get a completion notification callback. In order to comply with the
>> verb
>> -* spec, consumer is supposed to perform a ci_poll_cq() after the
>> +* spec, consumer is supposed to perform a ci_poll_cq() or
>> ci_poll_cq_array() after the
>> * ci_enable_cq_notify() is made to retrive any entries that might have
>> * been added to the CQ before the CI registers the notification enable.
>> * @@ -2548,7 +2714,7 @@ typedef ib_api_status_t * vendor. * *
> SEE ALSO
>> -* ci_create_cq, ci_peek_cq, ci_poll_cq, ci_enable_cq_notify
>> +* ci_create_cq, ci_peek_cq, ci_poll_cq, ci_poll_cq_array,
>> ci_enable_cq_notify
>> ****** */ @@ -2774,6 +2940,116 @@ typedef ib_api_status_t
>> * ci_register_smr, ci_create_mw, ib_ci_op_t *****/
>> + +/****f* Verbs/ci_alloc_fast_reg_mr +* NAME +* ci_alloc_fast_reg_mr
More information about the ofw
mailing list