#include <sys/ib/ibtl/impl/ibtl.h>
static char ibtf_srq[] = "ibtl_srq";
ibt_status_t
ibt_alloc_srq(ibt_hca_hdl_t hca_hdl, ibt_srq_flags_t flags, ibt_pd_hdl_t pd,
ibt_srq_sizes_t *srq_sizes, ibt_srq_hdl_t *ibt_srq_p,
ibt_srq_sizes_t *real_sizes_p)
{
ibt_status_t status;
ibt_srq_hdl_t ibt_srq;
IBTF_DPRINTF_L3(ibtf_srq, "ibt_alloc_srq(%p, %p)",
hca_hdl, srq_sizes);
ibt_srq = kmem_zalloc(sizeof (struct ibtl_srq_s), KM_SLEEP);
*ibt_srq_p = ibt_srq;
_NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(ibt_srq->srq_ibc_srq_hdl))
_NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(ibt_srq->srq_hca))
ibt_srq->srq_hca = hca_hdl;
status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_alloc_srq(
IBTL_HCA2CIHCA(hca_hdl), flags, ibt_srq, pd, srq_sizes,
&ibt_srq->srq_ibc_srq_hdl, real_sizes_p);
if (status != IBT_SUCCESS) {
IBTF_DPRINTF_L2(ibtf_srq, "ibt_alloc_srq: "
"CI SRQ handle allocation failed: status = %d", status);
kmem_free(ibt_srq, sizeof (struct ibtl_srq_s));
*ibt_srq_p = NULL;
return (status);
}
_NOTE(NOW_VISIBLE_TO_OTHER_THREADS(ibt_srq->srq_ibc_srq_hdl))
_NOTE(NOW_VISIBLE_TO_OTHER_THREADS(ibt_srq->srq_hca))
atomic_inc_32(&hca_hdl->ha_srq_cnt);
return (IBT_SUCCESS);
}
ibt_status_t
ibt_free_srq(ibt_srq_hdl_t ibt_srq)
{
ibt_status_t status;
ibtl_hca_t *ibt_hca = ibt_srq->srq_hca;
IBTF_DPRINTF_L3(ibtf_srq, "ibt_free_srq(%p)", ibt_srq);
status = ((IBTL_SRQ2CIHCAOPS_P(ibt_srq))->ibc_free_srq)
(IBTL_SRQ2CIHCA(ibt_srq), ibt_srq->srq_ibc_srq_hdl);
if (status != IBT_SUCCESS) {
IBTF_DPRINTF_L2(ibtf_srq, "ibt_free_srq: "
"CI SRQ handle de-allocation failed: status = %d", status);
return (status);
}
ibtl_free_srq_async_check(ibt_srq);
atomic_dec_32(&ibt_hca->ha_srq_cnt);
return (status);
}
ibt_status_t
ibt_query_srq(ibt_srq_hdl_t ibt_srq, ibt_pd_hdl_t *pd_p,
ibt_srq_sizes_t *sizes_p, uint_t *limit)
{
IBTF_DPRINTF_L3(ibtf_srq, "ibt_query_srq(%p)", ibt_srq);
return (IBTL_SRQ2CIHCAOPS_P(ibt_srq)->ibc_query_srq(
IBTL_SRQ2CIHCA(ibt_srq), ibt_srq->srq_ibc_srq_hdl, pd_p,
sizes_p, limit));
}
ibt_status_t
ibt_modify_srq(ibt_srq_hdl_t ibt_srq, ibt_srq_modify_flags_t flags,
uint_t size, uint_t limit, uint_t *real_size_p)
{
IBTF_DPRINTF_L3(ibtf_srq, "ibt_modify_srq(%p, %d, %d, %d)",
ibt_srq, flags, size, limit);
return (IBTL_SRQ2CIHCAOPS_P(ibt_srq)->ibc_modify_srq(
IBTL_SRQ2CIHCA(ibt_srq), ibt_srq->srq_ibc_srq_hdl,
flags, size, limit, real_size_p));
}
_NOTE(SCHEME_PROTECTS_DATA("client managed", ibtl_srq_s::srq_clnt_private))
void
ibt_set_srq_private(ibt_srq_hdl_t ibt_srq, void *clnt_private)
{
ibt_srq->srq_clnt_private = clnt_private;
}
void *
ibt_get_srq_private(ibt_srq_hdl_t ibt_srq)
{
return (ibt_srq->srq_clnt_private);
}
ibt_status_t
ibt_post_srq(ibt_srq_hdl_t srq, ibt_recv_wr_t *wr_list, uint_t size,
uint_t *posted)
{
IBTF_DPRINTF_L4(ibtf_srq, "ibt_post_srq(%p, %p, %d)",
srq, wr_list, size);
return (IBTL_SRQ2CIHCAOPS_P(srq)->ibc_post_srq(IBTL_SRQ2CIHCA(srq),
srq->srq_ibc_srq_hdl, wr_list, size, posted));
}