[ofw][patch][[ibbus]

Smith, Stan stan.smith at intel.com
Mon Mar 16 17:08:04 PDT 2009


Leo,
  Please hold off on this patch until I finished the ibbus CA reference per fabric PDO experiment you asked me to perform.
James has stated this patch is unnecessary if we go down the CA ref / fabric PDO path.
Should have testing wrapped up by EOD Tuesday.

thanks,

stan.

________________________________
From: ofw-bounces at lists.openfabrics.org [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Leonid Keller
Sent: Monday, March 16, 2009 9:22 AM
To: James Yang
Cc: ofw at lists.openfabrics.org
Subject: [ofw][patch][[ibbus]


[IBBUS] Fix for hibernate in case of several child devices of IBBUS

Signed-off-by: James Yang

Index: core/bus/kernel/bus_port_mgr.c
===================================================================
--- core/bus/kernel/bus_port_mgr.c (revision 2032)
+++ core/bus/kernel/bus_port_mgr.c (working copy)
@@ -420,13 +420,12 @@
    deref_al_obj( &p_ext->h_ca->obj );
   }

-  BUS_TRACE( BUS_DBG_PNP, ("%s Deleted device %s: PDO %p, ext %p\n",
-     p_bfi->whoami, p_ext->cl_ext.vfptr_pnp_po->identity,
-     p_ext->cl_ext.p_self_do, p_ext ) );
+   BUS_TRACE( BUS_DBG_PNP, ("%s Deleted device %s: PDO %p, ext %p\n",
+      p_bfi->whoami, p_ext->cl_ext.vfptr_pnp_po->identity,
+      p_ext->cl_ext.p_self_do, p_ext ) );
+   IoDeleteDevice( p_ext->cl_ext.p_self_do );
+  }

-  IoDeleteDevice( p_ext->cl_ext.p_self_do );
- }
-
  cl_mutex_destroy( &p_port_mgr->pdo_mutex );
  cl_obj_deinit( p_obj );
  cl_free( p_port_mgr );
@@ -585,7 +584,7 @@
  NTSTATUS  status;
  cl_list_item_t *p_list_item;
  bus_port_ext_t *p_port_ext;
- bus_pdo_ext_t *p_pdo_ext = NULL;
+ bus_pdo_ext_t *p_shadow_pdo_ext, *p_pdo_ext = NULL;
  size_t   n_devs = 0;
  port_mgr_t  *p_port_mgr = p_bfi->p_port_mgr;
  cl_qlist_t  *p_pdo_list = &p_port_mgr->port_list;
@@ -611,14 +610,14 @@
   p_pdo_ext = PARENT_STRUCT( p_list_item, bus_pdo_ext_t, list_item );
   p_port_ext = (bus_port_ext_t*)p_pdo_ext;

-  if( p_pdo_ext->b_present && p_pdo_ext->b_hibernating &&
+  if( p_pdo_ext->b_present && p_pdo_ext->b_hibernating && p_pdo_ext->hca_acquired &&
    (p_port_ext->port_guid.guid == p_pnp_rec->p_port_attr->port_guid) )
   {
    n_devs++;
    break;
   }

-  BUS_TRACE( BUS_DBG_PNP, ("%s Skipped PDO for %s: PDO %p, ext %p, "
+  BUS_TRACE( BUS_DBG_PNP, ("%s Skipped acquire hca on PDO for %s: PDO %p, ext %p, "
    "present %d, missing %d, hibernating %d, port_guid %I64x.\n",
    p_bfi->whoami,
    p_pdo_ext->cl_ext.vfptr_pnp_po->identity,
@@ -654,6 +653,31 @@
     p_pdo_ext->cl_ext.p_self_do,
     p_pdo_ext, p_pdo_ext->b_present, p_pdo_ext->b_reported_missing,
     p_pdo_ext->b_hibernating, p_port_ext->port_guid.guid ) );
+
+   for( p_list_item = cl_qlist_head( p_pdo_list );
+    p_list_item != cl_qlist_end( p_pdo_list );
+    p_list_item = cl_qlist_next( p_list_item ) )
+   {
+    p_shadow_pdo_ext = PARENT_STRUCT( p_list_item, bus_pdo_ext_t, list_item );
+    p_port_ext = (bus_port_ext_t*)p_shadow_pdo_ext;
+
+    if( p_shadow_pdo_ext->b_present && p_shadow_pdo_ext->b_hibernating &&
+     (p_port_ext->port_guid.guid == p_pnp_rec->p_port_attr->port_guid) )
+    {
+     p_shadow_pdo_ext->b_hibernating = FALSE;
+     p_shadow_pdo_ext->h_ca = p_pdo_ext->h_ca;
+
+
+     BUS_TRACE( BUS_DBG_PNP, ("%s set shadow h_ca PDO for %s: PDO %p, ext %p, "
+            "present %d, missing %d, hibernating %d, port_guid %I64x.\n",
+            p_bfi->whoami,
+            p_shadow_pdo_ext->cl_ext.vfptr_pnp_po->identity,
+            p_shadow_pdo_ext->cl_ext.p_self_do,
+            p_shadow_pdo_ext, p_shadow_pdo_ext->b_present, p_shadow_pdo_ext->b_reported_missing,
+            p_shadow_pdo_ext->b_hibernating, p_port_ext->port_guid.guid  ) );
+    }
+   }
+
   }
  }
  else
@@ -1144,6 +1168,10 @@
  port_mgr_t  *p_port_mgr;
  bus_filter_t *p_bfi;
  port_pnp_ctx_t *p_ctx = p_pnp_rec->pnp_rec.context;
+ cl_list_item_t  *p_list_item;
+ bus_port_ext_t  *p_port_ext;
+ bus_pdo_ext_t  *p_pdo_ext;
+ cl_qlist_t*      p_pdo_list;

  BUS_ENTER( BUS_DBG_PNP );

@@ -1210,6 +1238,23 @@
  }

  p_ext->b_present = FALSE;
+
+ p_pdo_list = &p_port_mgr->port_list;
+
+ for( p_list_item = cl_qlist_head( p_pdo_list );
+   p_list_item != cl_qlist_end( p_pdo_list );
+   p_list_item = cl_qlist_next( p_list_item ) )
+  {
+  p_pdo_ext = PARENT_STRUCT( p_list_item, bus_pdo_ext_t, list_item );
+  p_port_ext =  (bus_port_ext_t*) p_pdo_ext;
+
+  if( (p_port_ext->port_guid.guid == ((bus_port_ext_t*)p_ext)->port_guid.guid) )
+   {
+   p_pdo_ext->b_present = FALSE;
+  }
+ }
+
+
  BUS_TRACE( BUS_DBG_PNP,
   ("Mark removing %s: PDO %p, ext %p, present %d, missing %d .\n",
   p_ext->cl_ext.vfptr_pnp_po->identity, p_ext->cl_ext.p_self_do, p_ext,
@@ -1235,6 +1280,21 @@
  // after arriving IB_PNP_PORT_ADD event from IBAL
  p_ext->h_ca = NULL;

+ p_pdo_list = &p_port_mgr->port_list;
+
+ for( p_list_item = cl_qlist_head( p_pdo_list );
+   p_list_item != cl_qlist_end( p_pdo_list );
+   p_list_item = cl_qlist_next( p_list_item ) )
+  {
+  p_pdo_ext = PARENT_STRUCT( p_list_item, bus_pdo_ext_t, list_item );
+  p_port_ext =  (bus_port_ext_t*) p_pdo_ext;
+
+  if( p_port_ext->port_guid.guid == ((bus_port_ext_t*)p_ext)->port_guid.guid )
+  {
+   p_pdo_ext->h_ca = NULL;
+  }
+ }
+
  cl_mutex_release( &p_port_mgr->pdo_mutex );

  BUS_EXIT( BUS_DBG_PNP );
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20090316/71c23720/attachment.html>


More information about the ofw mailing list