Commit Graph

145 Commits

Author SHA1 Message Date
snir sheriber
b3898b4861 fix spelling mistakes in comments (reseting to resetting & dummym to dummy)
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2015-12-11 18:39:31 +01:00
Frediano Ziglio
49c0d2e698 Use MAX macro to compute the maximum value
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2015-08-25 16:24:07 +01:00
Marc-André Lureau
26dc05edc4 channel: minor simplification 2015-08-11 17:24:36 +02:00
Marc-André Lureau
3da1e1ed0c server: use more const CoreInterface 2015-08-11 17:24:36 +02:00
Frediano Ziglio
7b0ad8d44c Fix typo in comment
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2015-06-11 16:54:41 +02:00
Frediano Ziglio
6ec714e855 Use MIN macro to compute a minimum
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2015-06-11 16:54:41 +02:00
Christophe Fergeau
f55f73b702 ppc: Fixing endianness for channel messages
This is a modified version of a patch initially from
Erlon R. Cruz <erlon.cruz@br.flextronics.com>
2015-04-10 20:24:15 +02:00
Christophe Fergeau
14b7f5c8cf ppc: Fix endianness handling in initial SPICE connection
This commit fixes enough endianness issues that it's possible to
connect to a spice-server/qemu running on a big-endian box with a client
running on a little-endian machine.

I haven't tested more than getting to the bios/bootloader and typing a
bit on the keyboard as I did not manage to boot a distro afterwards :(

This is based on patches send by Erlon R. Cruz
<erlon.cruz@br.flextronics.com>
2015-04-10 20:16:54 +02:00
Marc-André Lureau
72cc0cff71 Do not perform network tests on UNIX socket
By default, stream latency is 0 and bandwidth is infinite. On UNIX
socket do not perform unnecessary testing and keep those values.
2015-01-15 18:29:36 +01:00
Christophe Fergeau
ef44803a3a Add const to test_capability first argument
We don't modify the capabilities content, so it can be marked as const.
2014-11-24 17:37:17 +01:00
Marc-André Lureau
8904dfc768 server: use a warning when disconnecting unresponsive client
The debug level is not visible by default, since it is an unsolicited
server behaviour, make it a warning.
2014-05-16 19:20:51 +02:00
Christophe Fergeau
660d63253d Fix test_capability() typo
It was spelt 'capabilty'
2014-03-13 17:13:38 +01:00
Christophe Fergeau
8b347a641c Add reds_stream.[ch]
Gather common RedsStream code there rather than having it
in reds.c
2014-01-20 12:15:41 +01:00
Christophe Fergeau
1b6ced7dda Silence gcc false positive with -Wuninitialized
Some versions of gcc warn about:
red_channel.c: In function 'red_channel_client_wait_outgoing_item':
red_channel.c:2331: error: 'end_time' may be used uninitialized in this function [-Wuninitialized]
red_channel.c: In function 'red_channel_client_wait_pipe_item_sent':
red_channel.c:2363: error: 'end_time' may be used uninitialized in this function [-Wuninitialized]
red_channel.c: In function 'red_channel_wait_all_sent':
red_channel.c:2401: error: 'end_time' may be used uninitialized in this function [-Wuninitialized]

This is a false positive as end_time is unitialized when timeout is -1, and
we will only try to use end_time if timeout is not -1.

This commit initializes end_time to UINT64_MAX to avoid that warning. As
the test involving end_time will never be reached, we ensure it's always
TRUE so that it would be a noop even if it was reached.
2013-10-28 11:12:20 +01:00
Yonit Halperin
bcf9e64f13 red_channel: cleanup of red_channel_client blocking methods
(1) receive timeout as a parameter.
(2) add a return value and pass the handling
    of failures to the calling routine.
2013-09-26 10:48:40 -04:00
Yonit Halperin
c8b808bb82 red_channel: add option to monitor whether a channel client is alive
rhbz#994175

When a client connection is closed surprisingly (i.e., without a FIN
segment), we cannot identify it by a socket error (which is the only
way by which we identified disconnections so far).
This patch allows a channel client to periodically check the state of
the connection and identify surprise disconnections.
2013-08-14 13:35:10 -04:00
Yonit Halperin
d1e7142a0f red_channel: add on_input callback for tracing incoming bytes
The callback will be used in the next patch.
2013-08-14 11:08:17 -04:00
Alon Levy
9b8ff04284 server: s/red_wait_all_sent/red_channel_wait_all_sent/ 2013-08-14 12:08:04 +03:00
Alon Levy
bc50ff0767 server: move three functions to red_channel
Three blocking functions, one was split to leave the display channel
specific referencing of the DrawablePipeItem being sent inside
red_worker, but the rest (most) of the timeout logic was moved to
red_channel, including the associated constants.

Moved functions:
red_channel_client_wait_pipe_item_sent
red_wait_outgoing_item
red_wait_all_sent

Introduces red_time.h & red_time.c for a small helper function dealing
with time.h
2013-08-14 12:08:04 +03:00
Yonit Halperin
c2e46b926e log: improve debug information related to client disconnection 2013-07-29 11:35:17 -04:00
Yonit Halperin
aab45618cc red_channel: add ref count to RedClient 2013-07-29 11:35:16 -04:00
Yonit Halperin
47e722b85c red_channel: prevent adding and pushing pipe items after a channel_client has diconnected
Fixes: leaks of pipe items & "red_client_destroy: assertion `rcc->send_data.size == 0'"

red_channel_disconnect clears the pipe. It is called only once. After,
it was called, not items should be added to the pipe.

An example of when this assert can occur:
on_new_cursor_channel (red_worker.c), pushes 2 pipe items.
When it pushes the first pipe item, if the client has disconnected,
it can hit a socket error, and then, red_channel_client_disconnect is called.
The second call to adding a pipe item, will add the item to
the pipe. red_channel_client_pipe_add_type also calls
red_channel_client_push, which will update the send_data.size.
Then, the push will also hit a socket error, but red_channel_client_disconnect
won't clear the pending pipe item again, since it was already called.
When red_client_destory is called, we hit assertion `rcc->send_data.size
== 0'.
Note that if a pipe item is added to the pipe after
red_channel_client_disconnect was called, but without pushing it,
we should hit "spice_assert(rcc->pipe_size == 0)".
2013-07-29 11:35:16 -04:00
Alon Levy
3ef0480658 server/red_channel: fix unused variable
unused variable 'so_unsent_size' [-Werror=unused-variable]
2013-07-28 22:12:01 +03:00
Nahum Shalman
c07ba1cd4f TIOCOUTQ -> SIOCOUTQ and portability ifdefs
The ioctl on sockets is actually named SIOCOUTQ though its value
is identical to TIOCOUTQ which is for terminals.
SIOCOUTQ is linux specific so we add a header check and ifdef based
on the presence of the header
This prevents bogus ioctls on non-Linux platforms
2013-07-22 12:01:59 -04:00
Uri Lublin
1960ebb5b3 red_channel: replace RING_FOREACH with RING_FOREACH_SAFE in some places
This was originally intended to fix the problem fixed by
commit 53488f0275.

What is left are FOREACH loops that are at less risk and maybe safe (no
read/write or disconnect/destroy are called from within them).
2013-07-16 23:37:26 +03:00
David Gibson
53488f0275 Use RING_FOREACH_SAFE in red_channel.c functions which are missing it
Currently, both red_channel_pipes_add_type() and
red_channel_pipes_add_empty_msg() use plaing RING_FOREACH() which is not
safe versus removals from the ring within the loop body.

Although it's rare, such a removal can occur in both cases.  In the case
of red_channel_pipes_add_type() we have:
    red_channel_pipes_add_type()
    -> red_channel_client_pipe_add_type()
        -> red_channel_client_push()

And in the case of red_channel_client_pipes_add_empty_msg() we have:
    red_channel_client_pipes_add_empty_msg()
    -> red_channel_client_pipe_add_empty_msg()
        -> red_channel_client_push()

But red_channel_client_push() can cause a removal from the clients ring if
a network error occurs:
    red_channel_client_push()
    -> red_channel_client_send()
        -> red_peer_handle_outgoing()
            -> handler->cb->on_error callback
            =  red_channel_client_default_peer_on_error()
                -> red_channel_client_disconnect()
                    -> red_channel_remove_client()
                        -> ring_remove()

When this error path does occur, the assertion in RING_FOREACH()'s
ring_next() trips, and the process containing the spice server is aborted.
i.e. your whole VM dies, as a result of an unfortunately timed network
error on the spice channel.

Please apply.

Signed-off-by: David Gibson <dgibson@redhat.com>
2013-07-05 14:59:58 +02:00
Yonit Halperin
1377732805 spice: silencing most of the ping/pong logging
Those messages are too frequent and don't contribute much
2013-06-24 15:22:59 -04:00
Yonit Halperin
b30daf38bf red_channel: replace an assert upon threads mismatch with a warning
The assert:
spice_assert(pthread_equal(pthread_self(), client->thread_id))
and the assert:
spice_assert(pthread_equal(pthread_self(), rcc->channel->thread_id))
were coded in order to protect data that is accessed from the main
context (red_client and most of the channels), from
access by threads of other channels (namely, the display and cursor
channels), and vice versa.
However, some of the calls to the sound channel interface,
and also the char_device interface, can be done from the vcpu thread.
It doesn't endanger these channels internal data, since qemu use global
mutex for the vcpu and io threads.
Thus, pthread_self() can be !=  channel->thread_id, if one of them is
the vcpu thread and the other is the io-thread, and we shouldn't assert.

Future plans: A more complete and complicated solution would be to manage our own thread for
spice-channels, and push input from qemu to this thread, instead of
counting on the global mutex of qemu

rhbz#823472
2013-05-24 16:27:31 -04:00
Yonit Halperin
b82351f711 red_channel: notify and shutdown a channel client when its handle_migrate_data fails 2013-05-08 11:26:50 -04:00
Yonit Halperin
b71ccec83e red_channel: on migration target, start sending ping messages only after the client's migration has completed
The connection to the target server is established before migration
starts. However, the client reads and replies to messages from the server only after
migration completes. Thus, we better not send ping msgs from the target
before migration completes (because the observed roundtrip duration will
be bigger than the real one).
2013-05-01 13:04:15 -04:00
Yonit Halperin
df26036552 red_channel: stop sending ping messages after migration has completed
We mustn't send any msg to the client, besides MSG_MIGRATE_DATA, after
we send MSG_MIGRATE.
2013-05-01 13:01:43 -04:00
Yonit Halperin
f0f8d7dd52 red_channel: fix not handling self pipe items in red_channel_client_release_item
When a client disconnects, red_channel_client_pipe_clear is called.
Releasing pipe items of type == MIGRATE||EMPTY_MSG||PING
wasn't handled, and was passed to channel_cbs.release_item.
There, an error occured since the pipe items were not recognized.
2013-04-30 14:56:35 -04:00
Yonit Halperin
9a62a9a809 red_channel: monitor connection latency using MSG_PING 2013-04-22 16:30:54 -04:00
Alon Levy
3d28317e97 server: freezed->froze, missing whitespace after declarations 2012-08-30 17:08:09 +03:00
Yonit Halperin
e142bd9a61 red_channel: set send_data.last_sent_serial in red_channel_client_set_message_serial
red_channel_client_set_message_serial is called for setting
the serial of the display channel messages after migration (on the
destination side). The serial is retrieved from the migration data.
2012-08-27 09:13:12 +03:00
Yonit Halperin
26027036c0 red_channel: remove unused migrate flag from RedChannel
The relevant flags reside in RedChannelClient and RedClient
2012-08-27 09:13:12 +03:00
Yonit Halperin
08d223beb3 red_channel (dummy): fix not adding dummy RedChannelClient to the client
snd channel wasn't added to be part of the client's channels list.
As a result, when the client was destroyed, or migrated, snd channel
client wasn't destroy, or its migration callback wasn't called.

However, due to adding dummy channels to the client, we need special
handling for calls to disconnecting dummy channel clients.

TODO: we need to refactor snd_worker to use red_channel
2012-08-27 09:13:11 +03:00
Yonit Halperin
3af4b7235d main: send MSG_MIGRATE upon vm migration completion
Before sending the above msg, if there is a pending partial msg that
has been read from the agent, we send it to the client. The alternative
was to keep the msg as part of the migration data, and then
to send it to the destination server via the client and to wait there
for the msg chunk completion, before sending it to the client. Of
course, the latter is less efficient.
2012-08-27 09:13:07 +03:00
Yonit Halperin
157d459d42 red_channel: introduce PIPE_ITEM_TYPE_EMPTY_MSG
The pipe item is used for sending messages that don't have body.
2012-08-27 09:13:06 +03:00
Yonit Halperin
275e4312df seamless migration: migration completion on the destination side
Tracking the channels that wait for migration data. If there
is a new migration process pending, when all the channels have
restored their state, we begin the new migration.
2012-08-27 09:13:00 +03:00
Yonit Halperin
eb4c95b08b red_channel: handle sending SPICE_MSG_MIGRATE
The relevant code is common to all channels.

The patch also contains a fix to the return value for
handle_migrate_data callback: s/uint64_t/int
2012-08-27 09:13:00 +03:00
Yonit Halperin
4f551a3550 red_channel: fix pipe item leak 2012-08-27 09:12:59 +03:00
Yonit Halperin
49a8d68303 red_channel: add red_channel_test_remote_cap
for checking if all the channel clients connected support the cap
2012-08-27 09:04:18 +03:00
Alon Levy
2465a8d801 server/red_channel: s/channle/channel 2012-06-07 12:26:05 +03:00
Yonit Halperin
858a1aaa34 server/red_channel: do not attempt to write if the channel client is disconnected
The red_channel_client_event call to red_channel_client_receive might result
in a disconnected channel client. The following call to
red_channel_client_push may call to red_peer_handle_outgoing with a
disconnected socket.
2012-05-31 09:58:02 +03:00
Yonit Halperin
2d2121a170 server/red_channel: fix possible access to released channel clients
Added ref count for RedChannel and RedChannelClient.

red_channel.c/red_peer_handle_incoming call to
handler->cb->handle_message might lead to the release of the channel
client, and the following call to handler->cb->release_msg_buf will be
a violation.

This bug can be produced by causing main_channel_handle_parsed
call red_client_destory, e.g., by some violation in
reds_on_main_agent_data that will result in a call to reds_disconnect.
2012-05-31 09:39:14 +03:00
Yonit Halperin
c59b2884a2 server/red_channel: remove red_channel_client_item_being_sent
The above routine was risky, since red_channel_client_init_send_data
can also be called with item==NULL. Thus, not all pipe items can be tracked.
The one call that was made for this routine was not necessary.
2012-05-24 11:00:33 +03:00
Yonit Halperin
1b9162b5cf server/red_channel: prevent creating more than one channel client with the same type+id 2012-05-21 09:08:42 +03:00
Marc-André Lureau
b34fd7432d Use the spice-common logging functions
It will abort by default for critical level messages. That behaviour
can be tuned at runtime.
2012-03-25 19:00:00 +02:00
Marc-André Lureau
359fc1cb5d Use the spice-common submodule
This patch will replace the common/ directory with the spice-common
project. It is for now a simple project subdirectory shared with
spice-gtk, but the goal is to make it a proper library later on.

With this change, the spice-server build is broken. The following
commits fix the build, and have been seperated to ease the review.

v2
- moves all the generated marshallers to spice-common library
- don't attempt to fix windows VS build, which should somehow be
  splitted with spice-common (or built from tarball only to avoid
  generation tools/libs deps)
v3
- uses libspice-common-client
- fix a mutex.h inclusion reported by Alon
2012-03-25 18:59:10 +02:00