[ofw] patch: [ibbus] Add A new function to IBAL that allows one to create a multicast group without attaching a QP to it.
Tzachi Dar
tzachid at mellanox.co.il
Thu Feb 10 12:39:27 PST 2011
Hi Fab,
Indeed this is something that I did not think about.
I guess that in order to keep the current model we should add the ib_al_handle_t parameter into the no_qp multicast scenario.
Thanks
Tzachi
From: Fab Tillier [mailto:ftillier at microsoft.com]
Sent: Thursday, February 10, 2011 7:33 PM
To: Tzachi Dar; ofw at lists.openfabrics.org
Subject: RE: [ofw] patch: [ibbus] Add A new function to IBAL that allows one to create a multicast group without attaching a QP to it.
Hi Tzachi,
I noticed that in the no_qp case, you don't attach the mcast object to anything. Shouldn't it be tracked somewhere, or are we going to let it just float about in memory? Note that the latter breaks the current contract where IBAL provides cleanup if someone simply calls ib_close_al. It's not that I'm opposed to such a change, I just want to make sure it's a conscious one.
-Fab
From: ofw-bounces at lists.openfabrics.org [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Tzachi Dar
Sent: Thursday, February 10, 2011 8:30 AM
To: ofw at lists.openfabrics.org
Subject: [ofw] patch: [ibbus] Add A new function to IBAL that allows one to create a multicast group without attaching a QP to it.
On some occasions one might have to create a multicast group but does not want to attach a QP to it.
The following new function enables this functionality.
Any comments (including to function names) are welcomed.
Thanks
Tzachi & Irena
Index: b:/users/irena/proj1/trunk/core/bus/kernel/bus_pnp.c
===================================================================
--- b:/users/irena/proj1/trunk/core/bus/kernel/bus_pnp.c (revision 7368)
+++ b:/users/irena/proj1/trunk/core/bus/kernel/bus_pnp.c (revision 7369)
@@ -1014,6 +1014,7 @@
p_ifc->poll_cq = ib_poll_cq;
p_ifc->rearm_cq = ib_rearm_cq;
p_ifc->join_mcast = ib_join_mcast;
+ p_ifc->join_mcast_no_qp = al_join_mcast_no_qp;
p_ifc->leave_mcast = ib_leave_mcast;
p_ifc->local_mad = ib_local_mad;
p_ifc->cm_listen = ib_cm_listen;
Index: b:/users/irena/proj1/trunk/core/al/al_mcast.c
===================================================================
--- b:/users/irena/proj1/trunk/core/al/al_mcast.c (revision 7368)
+++ b:/users/irena/proj1/trunk/core/al/al_mcast.c (revision 7369)
@@ -100,10 +100,9 @@
#endif
-
ib_api_status_t
-al_join_mcast(
- IN const ib_qp_handle_t h_qp,
+al_join_mcast_common(
+ IN const ib_qp_handle_t h_qp OPTIONAL,
IN const ib_mcast_req_t* const p_mcast_req )
{
ib_mcast_handle_t h_mcast;
@@ -113,20 +112,6 @@
AL_ENTER( AL_DBG_MCAST );
- /*
- * Validate the port GUID. There is no need to validate the pkey index as
- * the user could change it later to make it invalid. There is also no
- * need to perform any QP transitions as ib_init_dgrm_svc resets the QP and
- * starts from scratch.
- */
- status = get_port_num( h_qp->obj.p_ci_ca, p_mcast_req->port_guid, NULL );
- if( status != IB_SUCCESS )
- {
- AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
- ("get_port_num failed, status: %s\n", ib_get_err_str(status)) );
- return status;
- }
-
/* Allocate a new multicast request. */
h_mcast = cl_zalloc( sizeof( ib_mcast_t ) );
if( !h_mcast )
@@ -183,13 +168,16 @@
h_mcast->port_guid = p_mcast_req->port_guid;
/* Track the multicast with the QP instance. */
- status = attach_al_obj( &h_qp->obj, &h_mcast->obj );
- if( status != IB_SUCCESS )
- {
- h_mcast->obj.pfn_destroy( &h_mcast->obj, NULL );
- AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
- ("attach_al_obj returned %s.\n", ib_get_err_str(status)) );
- return status;
+
+ if (h_qp) {
+ status = attach_al_obj( &h_qp->obj, &h_mcast->obj );
+ if( status != IB_SUCCESS )
+ {
+ h_mcast->obj.pfn_destroy( &h_mcast->obj, NULL );
+ AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
+ ("attach_al_obj returned %s.\n", ib_get_err_str(status)) );
+ return status;
+ }
}
/* Issue the MAD to the SA. */
@@ -224,6 +212,38 @@
}
+ib_api_status_t
+al_join_mcast_no_qp(
+ IN const ib_mcast_req_t* const p_mcast_req )
+{
+ return al_join_mcast_common(NULL, p_mcast_req );
+
+}
+
+ib_api_status_t
+al_join_mcast(
+ IN const ib_qp_handle_t h_qp,
+ IN const ib_mcast_req_t* const p_mcast_req )
+{
+ ib_api_status_t status;
+ /*
+ * Validate the port GUID. There is no need to validate the pkey index as
+ * the user could change it later to make it invalid. There is also no
+ * need to perform any QP transitions as ib_init_dgrm_svc resets the QP and
+ * starts from scratch.
+ */
+
+ status = get_port_num( h_qp->obj.p_ci_ca, p_mcast_req->port_guid, NULL );
+ if( status != IB_SUCCESS )
+ {
+ AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
+ ("get_port_num failed, status: %s\n", ib_get_err_str(status)) );
+ return status;
+ }
+
+ return al_join_mcast_common(h_qp, p_mcast_req);
+}
+
static void
__destroying_mcast(
IN al_obj_t *p_obj )
@@ -504,7 +524,8 @@
*/
h_mcast->state = SA_REG_ACTIVE;
/* Attach the QP to the multicast group. */
- if(ib_member_get_state(mcast_rec.p_member_rec->scope_state) == IB_MC_REC_STATE_FULL_MEMBER)
+ if(ib_member_get_state(mcast_rec.p_member_rec->scope_state) == IB_MC_REC_STATE_FULL_MEMBER &&
+ (((ib_qp_handle_t)h_mcast->obj.p_parent_obj) != NULL))
{
status = verbs_attach_mcast(h_mcast);
if( status != IB_SUCCESS )
Index: b:/users/irena/proj1/trunk/core/al/al_mcast.h
===================================================================
--- b:/users/irena/proj1/trunk/core/al/al_mcast.h (revision 7368)
+++ b:/users/irena/proj1/trunk/core/al/al_mcast.h (revision 7369)
@@ -96,7 +96,11 @@
IN const ib_qp_handle_t h_qp,
IN const ib_mcast_req_t* const p_mcast_req );
+ib_api_status_t
+al_join_mcast_no_qp(
+ IN const ib_mcast_req_t* const p_mcast_req );
+
#if defined( CL_KERNEL )
/*
* Called by proxy to attach a QP to a multicast group.
@@ -109,6 +113,7 @@
OUT al_attach_handle_t *ph_attach,
IN OUT ci_umv_buf_t *p_umv_buf OPTIONAL );
+
#endif /* CL_KERNEL */
Index: b:/users/irena/proj1/trunk/core/al/al_qp.c
===================================================================
--- b:/users/irena/proj1/trunk/core/al/al_qp.c (revision 7368)
+++ b:/users/irena/proj1/trunk/core/al/al_qp.c (revision 7369)
@@ -1619,7 +1619,28 @@
}
+ib_api_status_t
+ib_join_mcast_no_qp(
+ IN const ib_mcast_req_t* const p_mcast_req )
+{
+ ib_api_status_t status;
+ AL_ENTER( AL_DBG_MCAST );
+
+ if( !p_mcast_req )
+ {
+ AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("IB_INVALID_PARAMETER\n") );
+ return IB_INVALID_PARAMETER;
+ }
+
+ status = al_join_mcast_no_qp( p_mcast_req );
+
+ AL_EXIT( AL_DBG_MCAST );
+ return status;
+}
+
+
+
/*
* Post a work request to the send queue of the QP.
*/
Index: b:/users/irena/proj1/trunk/inc/kernel/iba/ib_al_ifc.h
===================================================================
--- b:/users/irena/proj1/trunk/inc/kernel/iba/ib_al_ifc.h (revision 7368)
+++ b:/users/irena/proj1/trunk/inc/kernel/iba/ib_al_ifc.h (revision 7369)
@@ -48,7 +48,7 @@
* IB resources provided by HCAs.
*********/
-#define AL_INTERFACE_VERSION (14)
+#define AL_INTERFACE_VERSION (15)
@@ -404,6 +404,10 @@
IN const ib_mcast_req_t* const p_mcast_req );
typedef ib_api_status_t
+(*ib_pfn_join_mcast_no_qp_t)(
+ IN const ib_mcast_req_t* const p_mcast_req );
+
+typedef ib_api_status_t
(*ib_pfn_leave_mcast_t)(
IN const ib_mcast_handle_t h_mcast,
IN const ib_pfn_destroy_cb_t destroy_cb );
@@ -702,6 +706,7 @@
ib_pfn_poll_cq_t poll_cq;
ib_pfn_rearm_cq_t rearm_cq;
ib_pfn_join_mcast_t join_mcast;
+ ib_pfn_join_mcast_no_qp_t join_mcast_no_qp;
ib_pfn_leave_mcast_t leave_mcast;
ib_pfn_local_mad_t local_mad;
ib_pfn_cm_listen_t cm_listen;
Index: b:/users/irena/proj1/trunk/inc/iba/ib_al.h
===================================================================
--- b:/users/irena/proj1/trunk/inc/iba/ib_al.h (revision 7368)
+++ b:/users/irena/proj1/trunk/inc/iba/ib_al.h (revision 7369)
@@ -3801,7 +3801,7 @@
* ib_join_mcast
*
* DESCRIPTION
-* Attaches a queue pair to a multicast group.
+* Creates a multicast group and Attaches a queue pair to it.
*
* SYNOPSIS
*/
@@ -3876,7 +3876,84 @@
* ib_leave_mcast, ib_mcast_req_t, ib_create_qp, ib_init_dgrm_svc
*****/
+/****f* Access Layer/ib_join_mcast
+* NAME
+* ib_join_mcast_no_qp
+*
+* DESCRIPTION
+* Creates a multicast group.
+*
+* SYNOPSIS
+*/
+AL_EXPORT ib_api_status_t AL_API
+ib_join_mcast_no_qp(
+ IN const ib_mcast_req_t* const p_mcast_req );
+/*
+* PARAMETERS
+*
+* p_mcast_req
+* [in] Specifies the multicast group to join.
+*
+* RETURN VALUES
+* IB_SUCCESS
+* The join multicast group request has been initiated.
+*
+* IB_INVALID_QP_HANDLE
+* The queue pair handle was invalid.
+*
+* IB_INVALID_PARAMETER
+* A reference to the multicast group request information was not
+* provided.
+*
+* IB_INVALID_SERVICE_TYPE
+* The queue pair configuration does not support this type of service.
+*
+* IB_INSUFFICIENT_MEMORY
+* There was insufficient memory to join the multicast group.
+*
+* IB_INVALID_GUID
+* No port was found for the port_guid specified in the request.
+*
+* IB_INSUFFICIENT_RESOURCES
+* There were insufficient resources currently available on the channel
+* adapter to perform the operation.
+*
+* IB_INVALID_PKEY
+* The pkey specified in the multicast join request does not match the
+* pkey of the queue pair.
+*
+* IB_INVALID_PORT
+* The port GUID specified in the multicast join request does not match
+* the port of the queue pair.
+*
+* IB_ERROR
+* An error occurred while performing the multicast group join operation.
+*
+* IB_INSUFFICIENT_RESOURCES
+* There were insufficient resources currently available to complete
+* the request.
+*
+* IB_INSUFFICIENT_MEMORY
+* There was insufficient memory to complete the request.
+*
+* NOTES
+* This routine results in the specified queue pair joining a multicast
+* group. If the multicast group does not already exist, it will be created
+* at the user's option. Information about the multicast group is returned
+* to the user through a callback specified through the p_mcast_req
+* parameter.
+*
+* If the specified queue pair is already a member of a multicast group when
+* this call is invoked, an error will occur if there are conflicting
+* membership requirements. The QP is restricted to being bound to a single
+* port_guid and using a single pkey.
+*
+* SEE ALSO
+* ib_leave_mcast, ib_mcast_req_t, ib_create_qp, ib_init_dgrm_svc
+*****/
+
+
/****f* Access Layer/ib_leave_mcast
* NAME
* ib_leave_mcast
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20110210/477d67c4/attachment.html>
More information about the ofw
mailing list