|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 24/25] argo: unmap rings on suspend and send signal to ring-owners on resume
so that the guest may re-register the rings on resume with current mappings.
Signed-off-by: Christopher Clark <christopher.clark6@xxxxxxxxxxxxxx>
---
xen/common/argo.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++
xen/common/domain.c | 9 +++++++
xen/include/xen/argo.h | 2 ++
3 files changed, 80 insertions(+)
diff --git a/xen/common/argo.c b/xen/common/argo.c
index 9b12e6b..98de9a9 100644
--- a/xen/common/argo.c
+++ b/xen/common/argo.c
@@ -840,6 +840,16 @@ static void argo_ring_remove_mfns(const struct domain *d,
}
static void
+argo_ring_reset(struct domain *d, struct argo_ring_info *ring_info)
+{
+ ASSERT(rw_is_write_locked(&d->argo->lock));
+
+ argo_ring_remove_mfns(d, ring_info);
+ ring_info->len = 0;
+ ring_info->tx_ptr = 0;
+}
+
+static void
argo_ring_remove_info(struct domain *d, struct argo_ring_info *ring_info)
{
ASSERT(rw_is_write_locked(&d->argo->lock));
@@ -1832,3 +1842,62 @@ argo_destroy(struct domain *d)
* domain.
*/
}
+
+void
+argo_shutdown_for_suspend(struct domain *d)
+{
+ int i;
+
+ if ( !d )
+ return;
+
+ if ( get_domain(d) )
+ {
+ read_lock(&argo_lock);
+
+ if ( d->argo )
+ {
+ write_lock(&d->argo->lock);
+
+ for ( i = 0; i < ARGO_HTABLE_SIZE; i++ )
+ {
+ struct hlist_node *node, *next;
+ struct argo_ring_info *ring_info;
+ hlist_for_each_entry_safe(ring_info, node,
+ next, &d->argo->ring_hash[i], node)
+ argo_ring_reset(d, ring_info);
+ }
+
+ write_unlock(&d->argo->lock);
+ }
+
+ read_unlock(&argo_lock);
+
+ put_domain(d);
+ }
+}
+
+void
+argo_resume(struct domain *d)
+{
+ bool send_wakeup;
+
+ if ( !d )
+ return;
+
+ if ( !get_domain(d) )
+ return;
+
+ read_lock(&argo_lock);
+
+ read_lock(&d->argo->lock);
+ send_wakeup = ( d->argo->ring_count > 0 );
+ read_unlock(&d->argo->lock);
+
+ if ( send_wakeup )
+ argo_signal_domain(d);
+
+ read_unlock(&argo_lock);
+
+ put_domain(d);
+}
diff --git a/xen/common/domain.c b/xen/common/domain.c
index eadea4d..176dc74 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -88,6 +88,11 @@ static void __domain_finalise_shutdown(struct domain *d)
if ( !v->paused_for_shutdown )
return;
+#ifdef CONFIG_ARGO
+ if ( d->shutdown_code == SHUTDOWN_suspend )
+ argo_shutdown_for_suspend(d);
+#endif
+
d->is_shut_down = 1;
if ( (d->shutdown_code == SHUTDOWN_suspend) && d->suspend_evtchn )
evtchn_send(d, d->suspend_evtchn);
@@ -856,6 +861,10 @@ void domain_resume(struct domain *d)
spin_unlock(&d->shutdown_lock);
domain_unpause(d);
+
+#ifdef CONFIG_ARGO
+ argo_resume(d);
+#endif
}
int vcpu_start_shutdown_deferral(struct vcpu *v)
diff --git a/xen/include/xen/argo.h b/xen/include/xen/argo.h
index c037de6..b466158 100644
--- a/xen/include/xen/argo.h
+++ b/xen/include/xen/argo.h
@@ -26,5 +26,7 @@ struct argo_domain;
int argo_init(struct domain *d);
void argo_destroy(struct domain *d);
+void argo_shutdown_for_suspend(struct domain *d);
+void argo_resume(struct domain *d);
#endif
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |