]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Verify that all interfaces have been released when going into S4
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 3 Dec 2015 12:31:57 +0000 (12:31 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 3 Dec 2015 12:39:03 +0000 (12:39 +0000)
Because a transition into and out of S4 means a new domain is built, it's
crucial that all XENBUS interfaces are released (so that things like
event channels, grant tables and the xenstore ring get re-constructed).

This patch adds BUG_ONs to ensure this is the case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
21 files changed:
src/xenbus/balloon.c
src/xenbus/balloon.h
src/xenbus/cache.c
src/xenbus/cache.h
src/xenbus/debug.c
src/xenbus/debug.h
src/xenbus/evtchn.c
src/xenbus/evtchn.h
src/xenbus/fdo.c
src/xenbus/gnttab.c
src/xenbus/gnttab.h
src/xenbus/range_set.c
src/xenbus/range_set.h
src/xenbus/shared_info.c
src/xenbus/shared_info.h
src/xenbus/store.c
src/xenbus/store.h
src/xenbus/suspend.c
src/xenbus/suspend.h
src/xenbus/unplug.c
src/xenbus/unplug.h

index 2dc4a6cb9896333518ad6ee2a5b9cebd2250548e..1b3f5fa67325d93d234c71e8f99b6dc914dac913 100644 (file)
@@ -987,6 +987,14 @@ BalloonGetInterface(
     return status;
 }   
 
+ULONG
+BalloonGetReferences(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 BalloonTeardown(
     IN  PXENBUS_BALLOON_CONTEXT Context
index cc47d7d7c3f8ddf9575feb9104371eb3f720a2e3..03570f34f2afc919057c5010ca8ed65628f6db00 100644 (file)
@@ -54,6 +54,11 @@ BalloonGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+BalloonGetReferences(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    );
+
 extern VOID
 BalloonTeardown(
     IN  PXENBUS_BALLOON_CONTEXT Context
index 83993ca2f53dac954ea3ea8e832404a55217cd62..9727b14db9ded79cdf60cdc1a82c9f9a3d029d0c 100644 (file)
@@ -1014,6 +1014,14 @@ CacheGetInterface(
     return status;
 }   
 
+ULONG
+CacheGetReferences(
+    IN  PXENBUS_CACHE_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 CacheTeardown(
     IN  PXENBUS_CACHE_CONTEXT   Context
index 582c77d7080b11709d6d40f296758fec27fde396..be94973f13bf9fdc3dd6909ef65985a588b5c999 100644 (file)
@@ -54,6 +54,11 @@ CacheGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+CacheGetReferences(
+    IN  PXENBUS_CACHE_CONTEXT   Context
+    );
+
 extern VOID
 CacheTeardown(
     IN  PXENBUS_CACHE_CONTEXT   Context
index bd62b512de64f68ad1580f542ab85ac46676fa2f..7b2ec730e941b358d74fac4a9dba24bfc1855486 100644 (file)
@@ -427,6 +427,14 @@ DebugGetInterface(
     return status;
 }   
 
+ULONG
+DebugGetReferences(
+    IN  PXENBUS_DEBUG_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 DebugTeardown(
     IN  PXENBUS_DEBUG_CONTEXT   Context
@@ -444,4 +452,3 @@ DebugTeardown(
 
     Trace("<====\n");
 }
-
index 370f30228ca4dbe18dd75e93b1ef3291e899fb78..dd7ec08cd05df9322bb0bb413bd58ad450317101 100644 (file)
@@ -54,6 +54,11 @@ DebugGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+DebugGetReferences(
+    IN  PXENBUS_DEBUG_CONTEXT   Context
+    );
+
 extern VOID
 DebugTeardown(
     IN  PXENBUS_DEBUG_CONTEXT   Context
index 4a6ebd29c80085ff0704b7a5baa005dc4ffb3f88..5769cf33554867374298c715c216b975b31e944b 100644 (file)
@@ -1880,6 +1880,14 @@ EvtchnGetInterface(
     return status;
 }   
 
+ULONG
+EvtchnGetReferences(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
index 69b557e06fb38e038a0f178103d4a5b70f7e7793..31250b2b7d86af03c33a4a590f3a4fd0d50b66ec 100644 (file)
@@ -54,6 +54,11 @@ EvtchnGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+EvtchnGetReferences(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    );
+
 extern VOID
 EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
index ce4840c267ecd75dbb0a606b7f5afad22583eb28..e889871c29c20ba29d0b8479eba67a74a6b9406d 100644 (file)
@@ -3206,6 +3206,17 @@ FdoS3ToS4(
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     ASSERT3U(__FdoGetSystemPowerState(Fdo), ==, PowerSystemSleeping3);
 
+    BUG_ON(SuspendGetReferences(Fdo->SuspendContext) != 0);
+    BUG_ON(SharedInfoGetReferences(Fdo->SharedInfoContext) != 0);
+    BUG_ON(EvtchnGetReferences(Fdo->EvtchnContext) != 0);
+    BUG_ON(DebugGetReferences(Fdo->DebugContext) != 0);
+    BUG_ON(StoreGetReferences(Fdo->StoreContext) != 0);
+    BUG_ON(RangeSetGetReferences(Fdo->RangeSetContext) != 0);
+    BUG_ON(CacheGetReferences(Fdo->CacheContext) != 0);
+    BUG_ON(GnttabGetReferences(Fdo->GnttabContext) != 0);
+    BUG_ON(UnplugGetReferences(Fdo->UnplugContext) != 0);
+    BUG_ON(BalloonGetReferences(Fdo->BalloonContext) != 0);
+
     __FdoSetSystemPowerState(Fdo, PowerSystemHibernate);
 
     Trace("<====\n");
index 9057eedced518303b9a5300e62db5c545954550b..56158d832271f05db0be25c4e2d55a1e2c907dd3 100644 (file)
@@ -1058,6 +1058,14 @@ GnttabGetInterface(
     return status;
 }   
 
+ULONG
+GnttabGetReferences(
+    IN  PXENBUS_GNTTAB_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 GnttabTeardown(
     IN  PXENBUS_GNTTAB_CONTEXT  Context
index 0214a9e5c8c5cfba1d18892f13a5b6c5c4890b26..a8cf4094181bd70c7119beaaec573554b1398998 100644 (file)
@@ -54,6 +54,11 @@ GnttabGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+GnttabGetReferences(
+    IN  PXENBUS_GNTTAB_CONTEXT  Context
+    );
+
 extern VOID
 GnttabTeardown(
     IN  PXENBUS_GNTTAB_CONTEXT  Context
index a0b131155b7f1b73c14a9780570a792e0a73093a..1ce113f9c36713c1ec7175e9d24599e1dfbbcd22 100644 (file)
@@ -869,6 +869,14 @@ RangeSetGetInterface(
     return status;
 }   
 
+ULONG
+RangeSetGetReferences(
+    IN  PXENBUS_RANGE_SET_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 RangeSetTeardown(
     IN  PXENBUS_RANGE_SET_CONTEXT   Context
@@ -889,5 +897,3 @@ RangeSetTeardown(
 
     Trace("<====\n");
 }
-
-
index 6af8f276928348528361a21e81d7fc01a95810da..a150fdab65994bd9092de0d15fe88037d6d683c5 100644 (file)
@@ -54,6 +54,11 @@ RangeSetGetInterface(
     IN      ULONG                       Size
     );
 
+extern ULONG
+RangeSetGetReferences(
+    IN  PXENBUS_RANGE_SET_CONTEXT   Context
+    );
+
 extern VOID
 RangeSetTeardown(
     IN  PXENBUS_RANGE_SET_CONTEXT   Context
index 1279ac4f37d03ae232a3882accbe5da5cf0f40e4..01621acf7f9585524fcc3d664c8df93eb369f29e 100644 (file)
@@ -794,6 +794,14 @@ SharedInfoGetInterface(
     return status;
 }   
 
+ULONG
+SharedInfoGetReferences(
+    IN  PXENBUS_SHARED_INFO_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 SharedInfoTeardown(
     IN  PXENBUS_SHARED_INFO_CONTEXT Context
@@ -816,4 +824,3 @@ SharedInfoTeardown(
 
     Trace("<====\n");
 }
-
index 74d72b8caf76aa52adc8a8d6f23b8e3902d8ce28..2d52576838047bae9ade9e0333f8b850b59af0a5 100644 (file)
@@ -54,6 +54,11 @@ SharedInfoGetInterface(
     IN      ULONG                       Size
     );
 
+extern ULONG
+SharedInfoGetReferences(
+    IN  PXENBUS_SHARED_INFO_CONTEXT Context
+    );
+
 extern VOID
 SharedInfoTeardown(
     IN  PXENBUS_SHARED_INFO_CONTEXT Context
index dc4e7f3ed8410d14f577af58d61bf430fe0330c1..dad0f393e9e208c0badba901e8ea617effcf31d5 100644 (file)
@@ -2107,6 +2107,9 @@ StoreDisable(
     IN PXENBUS_STORE_CONTEXT    Context
     )
 {
+    LogPrintf(LOG_LEVEL_INFO,
+              "STORE: DISABLE\n");
+
     Context->Enabled = FALSE;
 
     XENBUS_EVTCHN(Close,
@@ -2129,10 +2132,6 @@ StoreEnable(
 
     Port = (ULONG)Value;
 
-    LogPrintf(LOG_LEVEL_INFO,
-              "STORE: EVTCHN %u\n",
-              Port);
-
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Context->EvtchnInterface,
                                      XENBUS_EVTCHN_TYPE_FIXED,
@@ -2149,6 +2148,10 @@ StoreEnable(
 
     Context->Enabled = TRUE;
 
+    LogPrintf(LOG_LEVEL_INFO,
+              "STORE: ENABLE (%u)\n",
+              Port);
+
     // Trigger an initial poll
     KeInsertQueueDpc(&Context->Dpc, NULL, NULL);
 }
@@ -2770,6 +2773,14 @@ StoreGetInterface(
     return status;
 }   
 
+ULONG
+StoreGetReferences(
+    IN  PXENBUS_STORE_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 StoreTeardown(
     IN  PXENBUS_STORE_CONTEXT   Context
index 6455ca06980c7b10724f976721a123fb0a9618a0..54fff9db910b9ca23d81b2e7695c50b366c06f92 100644 (file)
@@ -54,6 +54,11 @@ StoreGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+StoreGetReferences(
+    IN  PXENBUS_STORE_CONTEXT   Context
+    );
+
 extern VOID
 StoreTeardown(
     IN  PXENBUS_STORE_CONTEXT   Context
index fad35e473522c12054256e8902aab43fdacf93db..d272862c2a5f9c3ea50a0bd5bf1f23ec2bc1bce1 100644 (file)
@@ -468,6 +468,14 @@ SuspendGetInterface(
     return status;
 }   
 
+ULONG
+SuspendGetReferences(
+    IN  PXENBUS_SUSPEND_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 SuspendTeardown(
     IN  PXENBUS_SUSPEND_CONTEXT Context
index df0e18566bfe03f10b11da3a320286dd970484ce..4a36e079fa3425159130d9e7896993f82772e666 100644 (file)
@@ -54,6 +54,11 @@ SuspendGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+SuspendGetReferences(
+    IN  PXENBUS_SUSPEND_CONTEXT Context
+    );
+
 extern VOID
 SuspendTeardown(
     IN  PXENBUS_SUSPEND_CONTEXT Context
index 0a1b27a1178b54c63870dd7ac69189f2ea11a65a..7414b0cdeda1ad49dc145644342213e8a44b4ed4 100644 (file)
@@ -224,6 +224,14 @@ UnplugGetInterface(
     return status;
 }
 
+ULONG
+UnplugGetReferences(
+    IN  PXENBUS_UNPLUG_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 UnplugTeardown(
     IN  PXENBUS_UNPLUG_CONTEXT  Context
index 416b2d46cc9a1cb3c07e73ae7138fc6758a50709..6a2382de8de2e332eef212912d52249e5e5cffcd 100644 (file)
@@ -54,6 +54,11 @@ UnplugGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+UnplugGetReferences(
+    IN  PXENBUS_UNPLUG_CONTEXT   Context
+    );
+
 extern VOID
 UnplugTeardown(
     IN  PXENBUS_UNPLUG_CONTEXT   Context