console_resume();
}
-static void freeze_domains(void)
+static int freeze_domains(void)
{
struct domain *d;
struct vcpu *v;
+ if ( !spin_trylock(¤t->domain->hypercall_deadlock_mutex) )
+ return -EBUSY;
+
rcu_read_lock(&domlist_read_lock);
for_each_domain ( d )
{
}
}
rcu_read_unlock(&domlist_read_lock);
+
+ spin_unlock(¤t->domain->hypercall_deadlock_mutex);
+
+ return 0;
}
static void thaw_domains(void)
printk(XENLOG_INFO "Preparing system for ACPI S%d state.", state);
- freeze_domains();
+ rc = freeze_domains();
+ if ( rc )
+ goto unlock_and_fail;
rc = continue_hypercall_on_cpu(0, enter_state_helper, &acpi_sinfo);
if ( rc )
{
/* Continuation will not execute: undo our own work so far. */
thaw_domains();
- spin_unlock(&pm_lock);
+ goto unlock_and_fail;
}
+ return 0;
+
+ unlock_and_fail:
+ spin_unlock(&pm_lock);
return rc;
}