[ofw] [PATCH] Use the CM protocol to exchange initiator depth and responder resources
Fab Tillier
ftillier at windows.microsoft.com
Tue Jul 1 15:06:06 PDT 2008
Update the NetworkDirect CM related calls to exchange the initiator depth and responder resources using the CM protocol fields rather than out-of-band.
This involves also surfacing these values to the client.
Signed-off-by: Fab Tillier <ftillier at microsoft.com>
diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\al_cm_cep.h trunk\core\al\al_cm_cep.h
--- old\core\al\al_cm_cep.h Tue Jul 01 14:55:29 2008
+++ trunk\core\al\al_cm_cep.h Tue Jul 01 14:54:53 2008
@@ -284,6 +284,8 @@ NTSTATUS
al_cep_get_pdata(
IN ib_al_handle_t h_al,
IN net32_t cid,
+ OUT uint8_t *p_init_depth,
+ OUT uint8_t *p_resp_res,
IN OUT uint8_t *p_psize,
OUT uint8_t* pdata );
diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\al_dev.h trunk\core\al\al_dev.h
--- old\core\al\al_dev.h Tue Jul 01 14:55:29 2008
+++ trunk\core\al\al_dev.h Tue Jul 01 14:54:53 2008
@@ -55,7 +55,7 @@
#define AL_DEVICE_NAME L"\\Device\\ibal"
#define ALDEV_KEY (0x3B) /* Matches FILE_DEVICE_INFINIBAND from wdm.h */
-#define AL_IOCTL_VERSION (6)
+#define AL_IOCTL_VERSION (7)
/* max number of devices with non-default pkey */
#define MAX_NUM_PKEY 16
diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\kernel\al_cm_cep.c trunk\core\al\kernel\al_cm_cep.c
--- old\core\al\kernel\al_cm_cep.c Tue Jul 01 14:55:30 2008
+++ trunk\core\al\kernel\al_cm_cep.c Tue Jul 01 14:54:53 2008
@@ -6379,6 +6379,8 @@ NTSTATUS
al_cep_get_pdata(
IN ib_al_handle_t h_al,
IN net32_t cid,
+ OUT uint8_t *p_init_depth,
+ OUT uint8_t *p_resp_res,
IN OUT uint8_t *p_psize,
OUT uint8_t* pdata )
{
@@ -6399,6 +6401,9 @@ al_cep_get_pdata(
("CEP not found for cid %d, h_al %p\n", cid, h_al ));
return STATUS_CONNECTION_INVALID;
}
+
+ *p_init_depth = p_cep->init_depth;
+ *p_resp_res = p_cep->resp_res;
copy_len = min( *p_psize, p_cep->psize );
diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\kernel\al_ndi_cm.c trunk\core\al\kernel\al_ndi_cm.c
--- old\core\al\kernel\al_ndi_cm.c Tue Jul 01 14:55:29 2008
+++ trunk\core\al\kernel\al_ndi_cm.c Tue Jul 01 14:54:53 2008
@@ -184,29 +184,26 @@ __cep_timewait_qp(
static ib_api_status_t
__ndi_qp2rts(
IN ib_qp_handle_t const h_qp,
- IN uint8_t init_depth,
- IN uint8_t resp_res,
- IN PIRP p_irp,
- IN OUT ib_qp_mod_t *p_qp_mod
+ IN PIRP p_irp
)
{
ib_api_status_t status;
+ ib_qp_mod_t qp_mod;
AL_ENTER( AL_DBG_NDI );
/* fill required qp attributes */
status = al_cep_get_rtr_attr( qp_get_al( h_qp ),
- ((al_conn_qp_t*)h_qp)->cid, p_qp_mod );
+ ((al_conn_qp_t*)h_qp)->cid, &qp_mod );
if ( status != IB_SUCCESS )
{
AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
("al_cep_get_rtr_attr returned %s\n", ib_get_err_str( status )) );
goto exit;
}
- p_qp_mod->state.rtr.resp_res = resp_res;
/* perform the request: INIT->RTR */
- status = ndi_modify_qp( h_qp, p_qp_mod,
+ status = ndi_modify_qp( h_qp, &qp_mod,
cl_ioctl_out_size( p_irp ), cl_ioctl_out_buf( p_irp ) );
if ( status != IB_SUCCESS )
{
@@ -217,17 +214,16 @@ __ndi_qp2rts(
/* fill required qp attributes */
status = al_cep_get_rts_attr( qp_get_al( h_qp ),
- ((al_conn_qp_t*)h_qp)->cid, p_qp_mod );
+ ((al_conn_qp_t*)h_qp)->cid, &qp_mod );
if ( status != IB_SUCCESS )
{
AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
("al_cep_get_rts_attr returned %s\n", ib_get_err_str( status )) );
goto exit;
}
- p_qp_mod->state.rts.init_depth = init_depth;
/* perform the request: RTR->RTS */
- status = ndi_modify_qp( h_qp, p_qp_mod,
+ status = ndi_modify_qp( h_qp, &qp_mod,
cl_ioctl_out_size( p_irp ), cl_ioctl_out_buf( p_irp ) );
if ( status != IB_SUCCESS )
{
@@ -848,8 +849,8 @@ __ndi_fill_cm_req(
p_cm_req->qp_type = IB_QPT_RELIABLE_CONN;
p_cm_req->h_qp = h_qp;
- p_cm_req->resp_res = 0;
- p_cm_req->init_depth = 0;
+ p_cm_req->resp_res = p_req->resp_res;
+ p_cm_req->init_depth = p_req->init_depth;
p_cm_req->remote_resp_timeout =
ib_path_rec_pkt_life( p_path_rec ) + CM_REMOTE_TIMEOUT;
@@ -1218,13 +1219,8 @@ __ndi_rtu_cm(
IN PIRP p_irp )
{
NTSTATUS nt_status;
- ib_qp_mod_t qp_mod;
ib_api_status_t status;
- ib_qp_handle_t VOID_PTR64 h_qp = p_irp->Tail.Overlay.DriverContext[0];
- ual_ndi_rtu_cm_ioctl_in_t *p_rtu =
- (ual_ndi_rtu_cm_ioctl_in_t*)cl_ioctl_in_buf( p_irp );
- uint8_t pdata[IB_REJ_PDATA_SIZE];
- uint8_t psize = sizeof(pdata);
+ ib_qp_handle_t h_qp = p_irp->Tail.Overlay.DriverContext[0];
UNUSED_PARAM(p_dev_obj);
@@ -1235,17 +1231,15 @@ __ndi_rtu_cm(
IoFreeWorkItem( p_irp->Tail.Overlay.DriverContext[1] );
/* change the QP state to RTS */
- status = __ndi_qp2rts( h_qp, p_rtu->init_depth,
- p_rtu->resp_res, p_irp, &qp_mod );
+ status = __ndi_qp2rts( h_qp, p_irp );
if ( status != IB_SUCCESS )
{
goto err;
}
/* send RTU */
- al_cep_get_pdata( qp_get_al( h_qp ), ((al_conn_qp_t*)h_qp)->cid, &psize, pdata );
- status = al_cep_rtu( qp_get_al( h_qp ), ((al_conn_qp_t*)h_qp)->cid, pdata, psize );
- if( status != IB_SUCCESS && status != IB_INVALID_STATE )
+ status = al_cep_rtu( qp_get_al( h_qp ), ((al_conn_qp_t*)h_qp)->cid, NULL, 0 );
+ if( status != IB_SUCCESS )
{
net32_t cid;
err:
@@ -1333,7 +1327,6 @@ __ndi_rep_cm(
IN PIRP p_irp )
{
NTSTATUS nt_status;
- ib_qp_mod_t qp_mod;
ib_api_status_t status;
ib_qp_handle_t VOID_PTR64 h_qp = p_irp->Tail.Overlay.DriverContext[0];
ual_ndi_rep_cm_ioctl_in_t *p_rep =
@@ -1348,8 +1341,7 @@ __ndi_rep_cm(
IoFreeWorkItem( p_irp->Tail.Overlay.DriverContext[1] );
/* change the QP state to RTS */
- status = __ndi_qp2rts( h_qp, p_rep->init_depth,
- p_rep->resp_res, p_irp, &qp_mod );
+ status = __ndi_qp2rts( h_qp, p_irp );
if ( status != IB_SUCCESS )
{
nt_status = STATUS_CONNECTION_ABORTED;
@@ -1417,7 +1409,7 @@ __ndi_fill_cm_rep(
p_cm_rep->h_qp = h_qp;
p_cm_rep->access_ctrl = IB_AC_RDMA_READ | IB_AC_RDMA_WRITE | IB_AC_LOCAL_WRITE;
- p_cm_rep->init_depth = 0;
+ p_cm_rep->init_depth = p_rep->init_depth;
p_cm_rep->target_ack_delay = 10;
p_cm_rep->failover_accepted = IB_FAILOVER_ACCEPT_UNSUPPORTED;
p_cm_rep->flow_ctrl = TRUE; /* HCAs must support end-to-end flow control. */
diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\kernel\al_proxy_cep.c trunk\core\al\kernel\al_proxy_cep.c
--- old\core\al\kernel\al_proxy_cep.c Tue Jul 01 14:55:29 2008
+++ trunk\core\al\kernel\al_proxy_cep.c Tue Jul 01 14:54:53 2008
@@ -935,7 +935,8 @@ proxy_cep_get_pdata(
}
p_ioctl->out.pdata_len = sizeof(p_ioctl->out.pdata);
- status = al_cep_get_pdata( p_context->h_al, p_ioctl->in.cid,
+ status = al_cep_get_pdata( p_context->h_al, p_ioctl->in.cid,
+ &p_ioctl->out.init_depth, &p_ioctl->out.resp_res,
(uint8_t*)&p_ioctl->out.pdata_len, p_ioctl->out.pdata );
if( NT_SUCCESS( status ) )
diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\inc\iba\ib_al_ioctl.h trunk\inc\iba\ib_al_ioctl.h
--- old\inc\iba\ib_al_ioctl.h Thu Jun 26 20:35:14 2008
+++ trunk\inc\iba\ib_al_ioctl.h Tue Jul 01 14:54:53 2008
@@ -3130,6 +3130,8 @@ typedef union _ual_cep_get_pdata_ioctl
{
uint32_t pdata_len;
uint8_t pdata[IB_REJ_PDATA_SIZE];
+ uint8_t resp_res;
+ uint8_t init_depth;
} out;
@@ -3516,6 +3518,8 @@ typedef struct _ual_ndi_req_cm_ioctl_in
uint8_t prot;
uint8_t pdata_size;
ib_cm_rdma_req_t pdata;
+ uint8_t resp_res;
+ uint8_t init_depth;
} ual_ndi_req_cm_ioctl_in_t;
/*
@@ -3541,6 +3545,12 @@ typedef struct _ual_ndi_req_cm_ioctl_in
* pdata
* Private data in format RDMA CM
*
+* resp_res
+* Responder resources for the QP.
+*
+* init_depth
+* Initiator depth for the QP.
+*
*****/
/****s* User-mode Access Layer/ual_ndi_rep_cm_ioctl_in_t
@@ -3635,8 +3645,6 @@ typedef struct _ual_ndi_rej_cm_ioctl_in
typedef struct _ual_ndi_rtu_cm_ioctl_in
{
uint64_t h_qp;
- uint8_t init_depth;
- uint8_t resp_res;
} ual_ndi_rtu_cm_ioctl_in_t;
/*
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nd_init_depth_resp_res.patch
Type: application/octet-stream
Size: 8185 bytes
Desc: nd_init_depth_resp_res.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20080701/babfadce/attachment.obj>
More information about the ofw
mailing list