[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 |