In order to invalidate a single palette cache item, we were using spice_marshall_msg_cursor_inval_one(), which is the marshal function used to send an invalidation message for the Cursor channel's cache. This didn't cause any problems because SPICE_MSG_CURSOR_INVAL_ONE and SPICE_MSG_DISPLAY_INVAL_PALETTE have the same message ID and parameters, but it's better to use the correct marshalling function. --- Changes since last version: - leave the PIPE_ITEM_TYPE_INVAL_ONE case in display_channel_client_release_item_before_push(). without that change, it introduces this regression: (/usr/bin/qemu-system-x86_64:20414): SpiceWorker-ERROR **: ../../server/red_worker.c:8024:display_channel_send_item: invalid pipe item type Thread 5 (Thread 0x7ffa86403700 (LWP 20415)): #0 0x00007ffa93516eb9 in syscall () at /lib64/libc.so.6 #1 0x0000558dcf94d631 in qemu_event_wait () #2 0x0000558dcf95b666 in call_rcu_thread () #3 0x00007ffaa083c555 in start_thread () at /lib64/libpthread.so.0 #4 0x00007ffa9351cb9d in clone () at /lib64/libc.so.6 Thread 4 (Thread 0x7ffa84702700 (LWP 20416)): #0 0x00007ffaa0843a41 in do_futex_wait () at /lib64/libpthread.so.0 #1 0x00007ffaa0843b0f in __new_sem_wait_slow () at /lib64/libpthread.so.0 #2 0x00007ffaa0843bc2 in sem_timedwait () at /lib64/libpthread.so.0 #3 0x0000558dcf94d487 in qemu_sem_timedwait () #4 0x0000558dcf8d297c in worker_thread () #5 0x00007ffaa083c555 in start_thread () at /lib64/libpthread.so.0 #6 0x00007ffa9351cb9d in clone () at /lib64/libc.so.6 Thread 3 (Thread 0x7ffa83114700 (LWP 20417)): #0 0x00007ffa93512a07 in ioctl () at /lib64/libc.so.6 #1 0x0000558dcf6c7315 in kvm_vcpu_ioctl () #2 0x0000558dcf6c73cc in kvm_cpu_exec () #3 0x0000558dcf6b47ac in qemu_kvm_cpu_thread_fn () #4 0x00007ffaa083c555 in start_thread () at /lib64/libpthread.so.0 #5 0x00007ffa9351cb9d in clone () at /lib64/libc.so.6 Thread 2 (Thread 0x7ffa823ff700 (LWP 20418)): #0 0x00007ffaa084454d in read () at /lib64/libpthread.so.0 #1 0x00007ffaa1ad2fcc in spice_backtrace_gstack () at ../../../spice-common/common/backtrace.c:99 #2 0x00007ffaa1ad3089 in spice_backtrace () at ../../../spice-common/common/backtrace.c:130 #3 0x00007ffaa1adc3c5 in spice_logv (log_domain=0x7ffaa1b839ec "SpiceWorker", log_level=SPICE_LOG_LEVEL_ERROR, strloc=0x7ffaa1b862b0 "../../server/red_worker.c:8024", function=0x7ffaa1b88b10 <__FUNCTION__.34269> "display_channel_send_item", format=0x7ffaa1b86297 "invalid pipe item type", args=0x7ffa823fe7d8) at ../../../spice-common/common/log.c:108 #4 0x00007ffaa1adc48e in spice_log (log_domain=0x7ffaa1b839ec "SpiceWorker", log_level=SPICE_LOG_LEVEL_ERROR, strloc=0x7ffaa1b862b0 "../../server/red_worker.c:8024", function=0x7ffaa1b88b10 <__FUNCTION__.34269> "display_channel_send_item", format=0x7ffaa1b86297 "invalid pipe item type") at ../../../spice-common/common/log.c:123 #5 0x00007ffaa1aa1717 in display_channel_send_item (rcc=0x7ffa78037850, pipe_item=0x7ffa7841dd80) at ../../server/red_worker.c:8024 #6 0x00007ffaa1a7367d in red_channel_client_send_item (rcc=0x7ffa78037850, item=0x7ffa7841dd80) at ../../server/red_channel.c:597 #7 0x00007ffaa1a75d9a in red_channel_client_push (rcc=0x7ffa78037850) at ../../server/red_channel.c:1356 #8 0x00007ffaa1a75e30 in red_channel_push (channel=0x7ffa78000900) at ../../server/red_channel.c:1373 #9 0x00007ffaa1aa17be in red_push (worker=0x7ffa8243a010) at ../../server/red_worker.c:8041 #10 0x00007ffaa1aa94a1 in red_worker_main (arg=0x7ffa8243a010) at ../../server/red_worker.c:10679 #11 0x00007ffaa083c555 in start_thread () at /lib64/libpthread.so.0 #12 0x00007ffa9351cb9d in clone () at /lib64/libc.so.6 Thread 1 (Thread 0x7ffaa1f36c00 (LWP 20414)): #0 0x00007ffa935113c1 in ppoll () at /lib64/libc.so.6 #1 0x0000558dcf8e0269 in qemu_poll_ns () #2 0x0000558dcf8dfb1c in main_loop_wait () #3 0x0000558dcf6896db in main () Aborted (core dumped) To test, boot a rhel 7.1 vm server/red_worker.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/server/red_worker.c b/server/red_worker.c index b6f38f8..bbd3ba9 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -7493,15 +7493,17 @@ static inline void marshall_qxl_drawable(RedChannelClient *rcc, red_lossy_marshall_qxl_drawable(display_channel->common.worker, rcc, m, dpi); } -static inline void red_marshall_inval(RedChannelClient *rcc, - SpiceMarshaller *base_marshaller, CacheItem *cach_item) +static inline void red_marshall_inval_palette(RedChannelClient *rcc, + SpiceMarshaller *base_marshaller, + CacheItem *cache_item) { SpiceMsgDisplayInvalOne inval_one; - red_channel_client_init_send_data(rcc, cach_item->inval_type, NULL); - inval_one.id = *(uint64_t *)&cach_item->id; + red_channel_client_init_send_data(rcc, cache_item->inval_type, NULL); + inval_one.id = *(uint64_t *)&cache_item->id; + + spice_marshall_msg_display_inval_palette(base_marshaller, &inval_one); - spice_marshall_msg_cursor_inval_one(base_marshaller, &inval_one); } static void display_channel_marshall_migrate_data_surfaces(DisplayChannelClient *dcc, @@ -7958,7 +7960,7 @@ static void display_channel_send_item(RedChannelClient *rcc, PipeItem *pipe_item break; } case PIPE_ITEM_TYPE_INVAL_ONE: - red_marshall_inval(rcc, m, (CacheItem *)pipe_item); + red_marshall_inval_palette(rcc, m, (CacheItem *)pipe_item); break; case PIPE_ITEM_TYPE_STREAM_CREATE: { StreamAgent *agent = SPICE_CONTAINEROF(pipe_item, StreamAgent, create_item); -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel