[ofw] patch: [ibbus] Add A new function to IBAL that allows one to create a multicast group without attaching a QP to it.

Fab Tillier ftillier at microsoft.com
Thu Feb 10 09:32:33 PST 2011


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/6231b3d5/attachment.html>


More information about the ofw mailing list