Blame SOURCES/0074-Remove-guest-side-video-time-stamping.patch

e2c81d
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
e2c81d
From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@gmail.com>
e2c81d
Date: Sun, 2 Nov 2014 22:11:58 +0100
e2c81d
Subject: [PATCH] Remove guest side video time-stamping
e2c81d
e2c81d
The multimedia time is defined by the server side monotonic time [1],
e2c81d
but the drawing time-stamp is done in guest side, so it requires
e2c81d
synchronization between host and guest. This is expensive, when no audio
e2c81d
is playing, there is a ~30x/sec wakeup to update the qxl device mmtime,
e2c81d
and it requires marking dirty the rom region.
e2c81d
e2c81d
Instead, the video timestamping can be done more efficiently on server
e2c81d
side, without visible drawbacks.
e2c81d
e2c81d
[1] a better timestamp could be the audio time, since audio players are
e2c81d
    usually sync with audio time)
e2c81d
e2c81d
Related to:
e2c81d
https://bugzilla.redhat.com/show_bug.cgi?id=912763
e2c81d
---
e2c81d
 server/red_dispatcher.c |  9 ---------
e2c81d
 server/red_worker.c     |  1 +
e2c81d
 server/reds-private.h   |  2 --
e2c81d
 server/reds.c           | 13 -------------
e2c81d
 server/snd_worker.c     |  1 -
e2c81d
 server/spice.h          |  3 ++-
e2c81d
 6 files changed, 3 insertions(+), 26 deletions(-)
e2c81d
e2c81d
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
e2c81d
index 2ebde63..6ecd3d4 100644
e2c81d
--- a/server/red_dispatcher.c
e2c81d
+++ b/server/red_dispatcher.c
e2c81d
@@ -749,15 +749,6 @@ static void qxl_worker_loadvm_commands(QXLWorker *qxl_worker,
e2c81d
     red_dispatcher_loadvm_commands((RedDispatcher*)qxl_worker, ext, count);
e2c81d
 }
e2c81d
 
e2c81d
-void red_dispatcher_set_mm_time(uint32_t mm_time)
e2c81d
-{
e2c81d
-    RedDispatcher *now = dispatchers;
e2c81d
-    while (now) {
e2c81d
-        now->qxl->st->qif->set_mm_time(now->qxl, mm_time);
e2c81d
-        now = now->next;
e2c81d
-    }
e2c81d
-}
e2c81d
-
e2c81d
 static inline int calc_compression_level(void)
e2c81d
 {
e2c81d
     spice_assert(streaming_video != STREAM_VIDEO_INVALID);
e2c81d
diff --git a/server/red_worker.c b/server/red_worker.c
e2c81d
index f9179a6..dfa5274 100644
e2c81d
--- a/server/red_worker.c
e2c81d
+++ b/server/red_worker.c
e2c81d
@@ -4237,6 +4237,7 @@ static inline void red_process_drawable(RedWorker *worker, RedDrawable *drawable
e2c81d
         return;
e2c81d
     }
e2c81d
 
e2c81d
+    drawable->mm_time = reds_get_mm_time();
e2c81d
     surface_id = item->surface_id;
e2c81d
 
e2c81d
     worker->surfaces[surface_id].refs++;
e2c81d
diff --git a/server/reds-private.h b/server/reds-private.h
e2c81d
index 9358d27..46899f6 100644
e2c81d
--- a/server/reds-private.h
e2c81d
+++ b/server/reds-private.h
e2c81d
@@ -6,7 +6,6 @@
e2c81d
 #include <spice/protocol.h>
e2c81d
 
e2c81d
 #define MIGRATE_TIMEOUT (1000 * 10) /* 10sec */
e2c81d
-#define MM_TIMER_GRANULARITY_MS (1000 / 30)
e2c81d
 #define MM_TIME_DELTA 400 /*ms*/
e2c81d
 
e2c81d
 typedef struct TicketAuthentication {
e2c81d
@@ -159,7 +158,6 @@ typedef struct RedsState {
e2c81d
     int dispatcher_allows_client_mouse;
e2c81d
     MonitorMode monitor_mode;
e2c81d
     SpiceTimer *mig_timer;
e2c81d
-    SpiceTimer *mm_timer;
e2c81d
 
e2c81d
     int vm_running;
e2c81d
     Ring char_devs_states; /* list of SpiceCharDeviceStateItem */
e2c81d
diff --git a/server/reds.c b/server/reds.c
e2c81d
index 53f21bd..f4c6d1d 100644
e2c81d
--- a/server/reds.c
e2c81d
+++ b/server/reds.c
e2c81d
@@ -3574,7 +3574,6 @@ uint32_t reds_get_mm_time(void)
e2c81d
 
e2c81d
 void reds_enable_mm_timer(void)
e2c81d
 {
e2c81d
-    core->timer_start(reds->mm_timer, MM_TIMER_GRANULARITY_MS);
e2c81d
     reds->mm_timer_enabled = TRUE;
e2c81d
     reds->mm_time_latency = MM_TIME_DELTA;
e2c81d
     reds_send_mm_time();
e2c81d
@@ -3582,16 +3581,9 @@ void reds_enable_mm_timer(void)
e2c81d
 
e2c81d
 void reds_disable_mm_timer(void)
e2c81d
 {
e2c81d
-    core->timer_cancel(reds->mm_timer);
e2c81d
     reds->mm_timer_enabled = FALSE;
e2c81d
 }
e2c81d
 
e2c81d
-static void mm_timer_proc(void *opaque)
e2c81d
-{
e2c81d
-    red_dispatcher_set_mm_time(reds_get_mm_time());
e2c81d
-    core->timer_start(reds->mm_timer, MM_TIMER_GRANULARITY_MS);
e2c81d
-}
e2c81d
-
e2c81d
 static SpiceCharDeviceState *attach_to_red_agent(SpiceCharDeviceInstance *sin)
e2c81d
 {
e2c81d
     VDIPortState *state = &reds->agent_state;
e2c81d
@@ -4029,11 +4021,6 @@ static int do_spice_init(SpiceCoreInterface *core_interface)
e2c81d
     }
e2c81d
 #endif
e2c81d
 
e2c81d
-    if (!(reds->mm_timer = core->timer_add(mm_timer_proc, NULL))) {
e2c81d
-        spice_error("mm timer create failed");
e2c81d
-    }
e2c81d
-    reds_enable_mm_timer();
e2c81d
-
e2c81d
     if (reds_init_net() < 0) {
e2c81d
         goto err;
e2c81d
     }
e2c81d
diff --git a/server/snd_worker.c b/server/snd_worker.c
e2c81d
index c451031..b6cb62b 100644
e2c81d
--- a/server/snd_worker.c
e2c81d
+++ b/server/snd_worker.c
e2c81d
@@ -1113,7 +1113,6 @@ SPICE_GNUC_VISIBLE void spice_server_playback_put_samples(SpicePlaybackInstance
e2c81d
         snd_playback_free_frame(playback_channel, playback_channel->pending_frame);
e2c81d
     }
e2c81d
     frame->time = reds_get_mm_time();
e2c81d
-    red_dispatcher_set_mm_time(frame->time);
e2c81d
     playback_channel->pending_frame = frame;
e2c81d
     snd_set_command(&playback_channel->base, SND_PLAYBACK_PCM_MASK);
e2c81d
     snd_playback_send(&playback_channel->base);
e2c81d
diff --git a/server/spice.h b/server/spice.h
e2c81d
index 7b5e04e..9c8e18a 100644
e2c81d
--- a/server/spice.h
e2c81d
+++ b/server/spice.h
e2c81d
@@ -20,6 +20,7 @@
e2c81d
 
e2c81d
 #include <stdint.h>
e2c81d
 #include <sys/socket.h>
e2c81d
+#include <spice/macros.h>
e2c81d
 #include <spice/qxl_dev.h>
e2c81d
 #include <spice/vd_agent.h>
e2c81d
 
e2c81d
@@ -228,7 +229,7 @@ struct QXLInterface {
e2c81d
 
e2c81d
     void (*attache_worker)(QXLInstance *qin, QXLWorker *qxl_worker);
e2c81d
     void (*set_compression_level)(QXLInstance *qin, int level);
e2c81d
-    void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time);
e2c81d
+    void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time) SPICE_GNUC_DEPRECATED;
e2c81d
 
e2c81d
     void (*get_init_info)(QXLInstance *qin, QXLDevInitInfo *info);
e2c81d
     int (*get_command)(QXLInstance *qin, struct QXLCommandExt *cmd);