Fix a race situation for global variable dirtylimit_state.
Also, replace usleep by g_usleep to increase platform
accessibility to the sleep function.
Signed-off-by: Hyman Huang
Reviewed-by: Fabiano Rosas
Message-Id:
---
system/dirtylimit.c | 20 ++--
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/system/dirtylimit.c b/system/dirtylimit.c
index fa959d7743..3666c4cb7c 100644
--- a/system/dirtylimit.c
+++ b/system/dirtylimit.c
@@ -411,12 +411,20 @@ void dirtylimit_set_all(uint64_t quota,
void dirtylimit_vcpu_execute(CPUState *cpu)
{
-if (dirtylimit_in_service() &&
-dirtylimit_vcpu_get_state(cpu->cpu_index)->enabled &&
-cpu->throttle_us_per_full) {
-trace_dirtylimit_vcpu_execute(cpu->cpu_index,
-cpu->throttle_us_per_full);
-usleep(cpu->throttle_us_per_full);
+if (cpu->throttle_us_per_full) {
+dirtylimit_state_lock();
+
+if (dirtylimit_in_service() &&
+dirtylimit_vcpu_get_state(cpu->cpu_index)->enabled) {
+dirtylimit_state_unlock();
+trace_dirtylimit_vcpu_execute(cpu->cpu_index,
+cpu->throttle_us_per_full);
+
+g_usleep(cpu->throttle_us_per_full);
+return;
+}
+
+dirtylimit_state_unlock();
}
}
--
2.39.1