return DAT_SUCCESS;
}
+/*
+ * dapls_cb_pending
+ *
+ * snapshot of active entries on cookie ring buffer
+ *
+ * Input:
+ * buffer pointer to DAPL_COOKIE_BUFFER
+ *
+ * Returns:
+ * DAT_COUNT number of active/pending cookies
+ *
+ */
+extern DAT_COUNT
+dapls_cb_pending (
+ DAPL_COOKIE_BUFFER *buffer )
+{
+ DAT_COUNT head, tail;
+
+ head = dapl_os_atomic_read(&buffer->head);
+ tail = dapl_os_atomic_read(&buffer->tail);
+
+ if (head == tail)
+ return 0;
+ else if (head > tail)
+ return (head - tail);
+ else
+ return ((buffer->pool_size - tail) + head);
+}
/*
* dapls_rmr_cookie_alloc
dapls_cb_free (
DAPL_COOKIE_BUFFER *buffer );
+extern DAT_COUNT
+dapls_cb_pending (
+ DAPL_COOKIE_BUFFER *buffer );
+
extern DAT_RETURN
dapls_rmr_cookie_alloc (
IN DAPL_COOKIE_BUFFER *buffer,
if ( in_dto_idle != NULL )
{
- *in_dto_idle = (dapl_os_atomic_read (&ep_ptr->recv_count)) ? DAT_FALSE : DAT_TRUE;
+ *in_dto_idle = (dapls_cb_pending(&ep_ptr->recv_buffer)) ? DAT_FALSE : DAT_TRUE;
}
if ( out_dto_idle != NULL )
{
- *out_dto_idle = (dapl_os_atomic_read (&ep_ptr->req_count)) ? DAT_FALSE : DAT_TRUE;
+ *out_dto_idle = (dapls_cb_pending(&ep_ptr->req_buffer)) ? DAT_FALSE : DAT_TRUE;
}
bail:
goto bail;
}
- /*
- * Take reference before posting to avoid race conditions with
- * completions
- */
- dapl_os_atomic_inc (&ep_ptr->recv_count);
-
/*
* Invoke provider specific routine to post DTO
*/
if ( dat_status != DAT_SUCCESS )
{
- dapl_os_atomic_dec (&ep_ptr->recv_count);
dapls_cookie_dealloc (&ep_ptr->recv_buffer, cookie);
}
ep_ptr->qp_state = DAPL_QP_STATE_UNATTACHED;
ep_ptr->cm_handle = IB_INVALID_HANDLE;
- dapl_os_atomic_set (&ep_ptr->req_count, 0);
- dapl_os_atomic_set (&ep_ptr->recv_count, 0);
-
if ( DAT_SUCCESS != dapls_cb_create (
&ep_ptr->req_buffer,
ep_ptr,
dto_type,
user_cookie,
&cookie );
- if ( dat_status != DAT_SUCCESS )
- {
+ if (dat_status != DAT_SUCCESS) {
+ dapl_log(DAPL_DBG_TYPE_ERR,
+ " dapl_post_req resource ERR:"
+ " dtos pending = %d, max_dtos %d, max_cb %d hd %d tl %d\n",
+ dapls_cb_pending(&ep_ptr->req_buffer),
+ ep_ptr->param.ep_attr.max_request_dtos,
+ ep_ptr->req_buffer.pool_size,
+ ep_ptr->req_buffer.head,
+ ep_ptr->req_buffer.tail);
+
goto bail;
}
- /*
- * Take reference before posting to avoid race conditions with
- * completions
- */
- dapl_os_atomic_inc (&ep_ptr->req_count);
-
/*
* Invoke provider specific routine to post DTO
*/
if ( dat_status != DAT_SUCCESS )
{
- dapl_os_atomic_dec (&ep_ptr->req_count);
dapls_cookie_dealloc (&ep_ptr->req_buffer, cookie);
}
}
#endif
- if ( DAPL_DTO_TYPE_RECV == cookie->val.dto.type )
- {
- dapl_os_atomic_dec (&ep_ptr->recv_count);
- buffer = &ep_ptr->recv_buffer;
- }
+ if (DAPL_DTO_TYPE_RECV == cookie->val.dto.type)
+ buffer = &ep_ptr->recv_buffer;
else
- {
- dapl_os_atomic_dec (&ep_ptr->req_count);
- buffer = &ep_ptr->req_buffer;
- }
-
+ buffer = &ep_ptr->req_buffer;
+
event_ptr->event_number = DAT_DTO_COMPLETION_EVENT;
event_ptr->event_data.dto_completion_event_data.ep_handle =
cookie->ep;
case DAPL_COOKIE_TYPE_RMR:
{
- dapl_os_atomic_dec (&ep_ptr->req_count);
-
event_ptr->event_number = DAT_RMR_BIND_COMPLETION_EVENT;
event_ptr->event_data.rmr_completion_event_data.rmr_handle =
is_signaled = (completion_flags & DAT_COMPLETION_SUPPRESS_FLAG) ? DAT_FALSE : DAT_TRUE;
- /*
- * Take reference before posting to avoid race conditions with
- * completions
- */
- dapl_os_atomic_inc (&ep_ptr->req_count);
-
dat_status = dapls_ib_mw_bind (rmr,
lmr,
ep_ptr,
is_signaled);
if ( DAT_SUCCESS != dat_status )
{
- dapl_os_atomic_dec (&ep_ptr->req_count);
dapls_cookie_dealloc (&ep_ptr->req_buffer, cookie);
goto bail;
}
is_signaled = (completion_flags & DAT_COMPLETION_UNSIGNALLED_FLAG) ? DAT_FALSE : DAT_TRUE;
- /*
- * Take reference before posting to avoid race conditions with
- * completions
- */
- dapl_os_atomic_inc (&ep_ptr->req_count);
-
dat_status = dapls_ib_mw_unbind (rmr,
ep_ptr,
cookie,
is_signaled);
if ( DAT_SUCCESS != dat_status )
{
- dapl_os_atomic_dec (&ep_ptr->req_count);
dapls_cookie_dealloc (&ep_ptr->req_buffer, cookie);
goto bail1;
}