[ofa-general] [PATCH] opensm: use mgrp pointer in port mcm_info

Hal Rosenstock hal.rosenstock at gmail.com
Mon Sep 14 05:45:39 PDT 2009


On Sun, Sep 6, 2009 at 11:49 AM, Sasha Khapyorsky <sashak at voltaire.com>wrote:

>
> Port needs to access multicast groups where it is joined to. Now it is
> implemented by keeping list of list of mcm_info elements where MLID of
> each multicast group is stored. Obviously this assumes single MGID to
> MLID mapping model.
>


Does this mean consolidate_ipv6_snm_req does not work now ? If so, did OFED
1.5 Beta go out this way ? Also, what is the plan/timeframe to restore this
functionality ?

-- Hal


>
> This patch changes this so that instead of MLID mcm_info stores pointer
> to multicast group object (mgrp). Such model makes it possible to
> have MGIDs to MLID compression.
>
> Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
> ---
>  opensm/include/opensm/osm_mcm_info.h |   13 +++++++------
>  opensm/include/opensm/osm_port.h     |   13 +++++++------
>  opensm/opensm/osm_drop_mgr.c         |   10 +++-------
>  opensm/opensm/osm_mcm_info.c         |    8 ++++----
>  opensm/opensm/osm_port.c             |   10 +++++-----
>  opensm/opensm/osm_sm.c               |    6 +++---
>  6 files changed, 29 insertions(+), 31 deletions(-)
>
> diff --git a/opensm/include/opensm/osm_mcm_info.h
> b/opensm/include/opensm/osm_mcm_info.h
> index dec607f..62ae326 100644
> --- a/opensm/include/opensm/osm_mcm_info.h
> +++ b/opensm/include/opensm/osm_mcm_info.h
> @@ -47,6 +47,7 @@
>  #include <iba/ib_types.h>
>  #include <complib/cl_qlist.h>
>  #include <opensm/osm_base.h>
> +#include <opensm/osm_multicast.h>
>
>  #ifdef __cplusplus
>  #  define BEGIN_C_DECLS extern "C" {
> @@ -73,15 +74,15 @@ BEGIN_C_DECLS
>  */
>  typedef struct osm_mcm_info {
>        cl_list_item_t list_item;
> -       ib_net16_t mlid;
> +       osm_mgrp_t *mgrp;
>  } osm_mcm_info_t;
>  /*
>  * FIELDS
>  *      list_item
>  *              Linkage structure for cl_qlist.  MUST BE FIRST MEMBER!
>  *
> -*      mlid
> -*              MLID of this multicast group.
> +*      mgrp
> +*              The pointer to multicast group where this port is member of
>  *
>  * SEE ALSO
>  *********/
> @@ -95,11 +96,11 @@ typedef struct osm_mcm_info {
>  *
>  * SYNOPSIS
>  */
> -osm_mcm_info_t *osm_mcm_info_new(IN const ib_net16_t mlid);
> +osm_mcm_info_t *osm_mcm_info_new(IN osm_mgrp_t *mgrp);
>  /*
>  * PARAMETERS
> -*      mlid
> -*              [in] MLID value for this multicast group.
> +*      mgrp
> +*              [in] the pointer to multicast group.
>  *
>  * RETURN VALUES
>  *      Pointer to an initialized tree node.
> diff --git a/opensm/include/opensm/osm_port.h
> b/opensm/include/opensm/osm_port.h
> index 7079e74..0e0d3d2 100644
> --- a/opensm/include/opensm/osm_port.h
> +++ b/opensm/include/opensm/osm_port.h
> @@ -65,6 +65,7 @@ BEGIN_C_DECLS
>  */
>  struct osm_port;
>  struct osm_node;
> +struct osm_mgrp;
>
>  /****h* OpenSM/Physical Port
>  * NAME
> @@ -1420,14 +1421,14 @@ osm_get_port_by_base_lid(IN const osm_subn_t *
> const p_subn,
>  * SYNOPSIS
>  */
>  ib_api_status_t
> -osm_port_add_mgrp(IN osm_port_t * const p_port, IN const ib_net16_t mlid);
> +osm_port_add_mgrp(IN osm_port_t * const p_port, IN struct osm_mgrp *mgrp);
>  /*
>  * PARAMETERS
>  *      p_port
>  *              [in] Pointer to an osm_port_t object.
>  *
> -*      mlid
> -*              [in] MLID of the multicast group.
> +*      mgrp
> +*              [in] Pointer to the multicast group.
>  *
>  * RETURN VALUES
>  *      IB_SUCCESS
> @@ -1449,14 +1450,14 @@ osm_port_add_mgrp(IN osm_port_t * const p_port, IN
> const ib_net16_t mlid);
>  * SYNOPSIS
>  */
>  void
> -osm_port_remove_mgrp(IN osm_port_t * const p_port, IN const ib_net16_t
> mlid);
> +osm_port_remove_mgrp(IN osm_port_t * const p_port, IN struct osm_mgrp
> *mgrp);
>  /*
>  * PARAMETERS
>  *      p_port
>  *              [in] Pointer to an osm_port_t object.
>  *
> -*      mlid
> -*              [in] MLID of the multicast group.
> +*      mgrp
> +*              [in] Pointer to the multicast group.
>  *
>  * RETURN VALUES
>  *      None.
> diff --git a/opensm/opensm/osm_drop_mgr.c b/opensm/opensm/osm_drop_mgr.c
> index c9a4f33..4891bb8 100644
> --- a/opensm/opensm/osm_drop_mgr.c
> +++ b/opensm/opensm/osm_drop_mgr.c
> @@ -158,7 +158,6 @@ static void drop_mgr_remove_port(osm_sm_t * sm, IN
> osm_port_t * p_port)
>        osm_port_t *p_port_check;
>        cl_qmap_t *p_sm_guid_tbl;
>        osm_mcm_info_t *p_mcm;
> -       osm_mgrp_t *p_mgrp;
>        cl_ptr_vector_t *p_port_lid_tbl;
>        uint16_t min_lid_ho;
>        uint16_t max_lid_ho;
> @@ -212,12 +211,9 @@ static void drop_mgr_remove_port(osm_sm_t * sm, IN
> osm_port_t * p_port)
>
>        p_mcm = (osm_mcm_info_t *) cl_qlist_remove_head(&p_port->mcm_list);
>        while (p_mcm != (osm_mcm_info_t *) cl_qlist_end(&p_port->mcm_list))
> {
> -               p_mgrp = osm_get_mgrp_by_mlid(sm->p_subn, p_mcm->mlid);
> -               if (p_mgrp) {
> -                       osm_mgrp_delete_port(sm->p_subn, sm->p_log,
> -                                            p_mgrp, p_port->guid);
> -                       osm_mcm_info_delete((osm_mcm_info_t *) p_mcm);
> -               }
> +               osm_mgrp_delete_port(sm->p_subn, sm->p_log, p_mcm->mgrp,
> +                                    p_port->guid);
> +               osm_mcm_info_delete(p_mcm);
>                p_mcm =
>                    (osm_mcm_info_t *)
> cl_qlist_remove_head(&p_port->mcm_list);
>        }
> diff --git a/opensm/opensm/osm_mcm_info.c b/opensm/opensm/osm_mcm_info.c
> index 0325a34..c07c70b 100644
> --- a/opensm/opensm/osm_mcm_info.c
> +++ b/opensm/opensm/osm_mcm_info.c
> @@ -49,17 +49,17 @@
>
>  /**********************************************************************
>  **********************************************************************/
> -osm_mcm_info_t *osm_mcm_info_new(IN const ib_net16_t mlid)
> +osm_mcm_info_t *osm_mcm_info_new(IN osm_mgrp_t *mgrp)
>  {
>        osm_mcm_info_t *p_mcm;
>
> -       p_mcm = (osm_mcm_info_t *) malloc(sizeof(*p_mcm));
> +       p_mcm = malloc(sizeof(*p_mcm));
>        if (p_mcm) {
>                memset(p_mcm, 0, sizeof(*p_mcm));
> -               p_mcm->mlid = mlid;
> +               p_mcm->mgrp = mgrp;
>        }
>
> -       return (p_mcm);
> +       return p_mcm;
>  }
>
>  /**********************************************************************
> diff --git a/opensm/opensm/osm_port.c b/opensm/opensm/osm_port.c
> index 751c0f0..3470381 100644
> --- a/opensm/opensm/osm_port.c
> +++ b/opensm/opensm/osm_port.c
> @@ -223,12 +223,12 @@ Found:
>
>  /**********************************************************************
>  **********************************************************************/
> -ib_api_status_t osm_port_add_mgrp(IN osm_port_t * p_port, IN ib_net16_t
> mlid)
> +ib_api_status_t osm_port_add_mgrp(IN osm_port_t * p_port, IN osm_mgrp_t
> *mgrp)
>  {
>        ib_api_status_t status = IB_SUCCESS;
>        osm_mcm_info_t *p_mcm;
>
> -       p_mcm = osm_mcm_info_new(mlid);
> +       p_mcm = osm_mcm_info_new(mgrp);
>        if (p_mcm)
>                cl_qlist_insert_tail(&p_port->mcm_list,
>                                     (cl_list_item_t *) p_mcm);
> @@ -243,7 +243,7 @@ ib_api_status_t osm_port_add_mgrp(IN osm_port_t *
> p_port, IN ib_net16_t mlid)
>  static cl_status_t port_mgrp_find_func(IN const cl_list_item_t *
> p_list_item,
>                                       IN void *context)
>  {
> -       if (*((ib_net16_t *) context) == ((osm_mcm_info_t *)
> p_list_item)->mlid)
> +       if (context == ((osm_mcm_info_t *) p_list_item)->mgrp)
>                return CL_SUCCESS;
>        else
>                return CL_NOT_FOUND;
> @@ -251,12 +251,12 @@ static cl_status_t port_mgrp_find_func(IN const
> cl_list_item_t * p_list_item,
>
>  /**********************************************************************
>  **********************************************************************/
> -void osm_port_remove_mgrp(IN osm_port_t * p_port, IN const ib_net16_t
> mlid)
> +void osm_port_remove_mgrp(IN osm_port_t * p_port, IN osm_mgrp_t *mgrp)
>  {
>        cl_list_item_t *p_mcm;
>
>        p_mcm = cl_qlist_find_from_head(&p_port->mcm_list,
> port_mgrp_find_func,
> -                                       &mlid);
> +                                       mgrp);
>
>        if (p_mcm != cl_qlist_end(&p_port->mcm_list)) {
>                cl_qlist_remove_item(&p_port->mcm_list, p_mcm);
> diff --git a/opensm/opensm/osm_sm.c b/opensm/opensm/osm_sm.c
> index b3ce69a..2794775 100644
> --- a/opensm/opensm/osm_sm.c
> +++ b/opensm/opensm/osm_sm.c
> @@ -520,7 +520,7 @@ ib_api_status_t osm_sm_mcgrp_join(IN osm_sm_t * p_sm,
> IN const ib_net16_t mlid,
>         */
>        p_mcm = (osm_mcm_info_t *) cl_qlist_head(&p_port->mcm_list);
>        while (p_mcm != (osm_mcm_info_t *) cl_qlist_end(&p_port->mcm_list))
> {
> -               if (p_mcm->mlid == mlid) {
> +               if (p_mcm->mgrp->mlid == mlid) {
>                        OSM_LOG(p_sm->p_log, OSM_LOG_DEBUG,
>                                "Found mlid object for Port:"
>                                "0x%016" PRIx64 " lid:0x%X\n",
> @@ -530,7 +530,7 @@ ib_api_status_t osm_sm_mcgrp_join(IN osm_sm_t * p_sm,
> IN const ib_net16_t mlid,
>                p_mcm = (osm_mcm_info_t *) cl_qlist_next(&p_mcm->list_item);
>        }
>
> -       status = osm_port_add_mgrp(p_port, mlid);
> +       status = osm_port_add_mgrp(p_port, p_mgrp);
>        if (status != IB_SUCCESS) {
>                OSM_LOG(p_sm->p_log, OSM_LOG_ERROR, "ERR 2E03: "
>                        "Unable to associate port 0x%" PRIx64 " to mlid
> 0x%X\n",
> @@ -590,7 +590,7 @@ ib_api_status_t osm_sm_mcgrp_leave(IN osm_sm_t * p_sm,
> IN const ib_net16_t mlid,
>        /*
>         * Walk the list of ports in the group, and remove the appropriate
> one.
>         */
> -       osm_port_remove_mgrp(p_port, mlid);
> +       osm_port_remove_mgrp(p_port, p_mgrp);
>
>        status = sm_mgrp_process(p_sm, p_mgrp);
>  Exit:
> --
> 1.6.4.2
>
> _______________________________________________
> general mailing list
> general at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
>
> To unsubscribe, please visit
> http://openib.org/mailman/listinfo/openib-general
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/general/attachments/20090914/3d6bcc19/attachment.html>


More information about the general mailing list