[Spice-devel] [PATCH 5/6] spicevmc: do not use recv_device_from_client_buf sending compressed data
Snir Sheriber
ssheribe at redhat.com
Thu May 19 12:33:30 UTC 2016
Hi,
On 05/17/2016 01:04 PM, Frediano Ziglio wrote:
> Allocate buffer directly from RedCharDevice.
> This avoids to attach a buffer to SpiceVmsState just for detaching in
> the same function.
> RedCharDevice already use pooling on RedCharDeviceWriteBuffer.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/spicevmc.c | 37 +++++++++++++++----------------------
> 1 file changed, 15 insertions(+), 22 deletions(-)
>
> diff --git a/server/spicevmc.c b/server/spicevmc.c
> index 97eb04c..0c8ba51 100644
> --- a/server/spicevmc.c
> +++ b/server/spicevmc.c
> @@ -111,10 +111,6 @@ enum {
> RED_PIPE_ITEM_TYPE_PORT_EVENT,
> };
>
> -static uint8_t *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
> - uint16_t type,
> - uint32_t size);
> -
> static void spicevmc_red_channel_release_msg_rcv_buf(RedChannelClient *rcc,
> uint16_t type,
> uint32_t size,
> @@ -338,16 +334,21 @@ static int spicevmc_channel_client_handle_migrate_data(RedChannelClient *rcc,
> return red_char_device_restore(state->chardev, &mig_data->base);
> }
>
> -static int try_handle_compressed_msg(RedChannelClient *rcc, SpiceMsgCompressedData *compressed_data_msg)
> +static int handle_compressed_msg(SpiceVmcState *state, RedChannelClient *rcc,
> + SpiceMsgCompressedData *compressed_data_msg)
> {
> /* NOTE: *decompressed is free by the char-device */
> - SpiceVmcState *state;
> uint32_t decompressed_size;
> uint8_t *decompressed;
> + RedCharDeviceWriteBuffer *write_buf;
> +
> + write_buf = red_char_device_write_buffer_get(state->chardev, rcc->client,
> + compressed_data_msg->uncompressed_size);
> + if (!write_buf) {
> + return FALSE;
> + }
> + decompressed = write_buf->buf;
>
> - state = spicevmc_red_channel_client_get_state(rcc);
> - decompressed = spicevmc_red_channel_alloc_msg_rcv_buf(rcc,SPICE_MSGC_SPICEVMC_DATA,
> - compressed_data_msg->uncompressed_size);
> switch (compressed_data_msg->type) {
> #ifdef USE_LZ4
> case SPICE_DATA_COMPRESSION_TYPE_LZ4:
> @@ -359,22 +360,16 @@ static int try_handle_compressed_msg(RedChannelClient *rcc, SpiceMsgCompressedDa
> #endif
> default:
> spice_warning("Invalid Compression Type");
> - spicevmc_red_channel_release_msg_rcv_buf(rcc,SPICE_MSGC_SPICEVMC_DATA,
> - compressed_data_msg->uncompressed_size,
> - decompressed);
> + red_char_device_write_buffer_release(state->chardev, &write_buf);
&write_buf should be just write_buf
> return FALSE;
> }
> if (decompressed_size != compressed_data_msg->uncompressed_size) {
> spice_warning("Decompression Error");
> - spicevmc_red_channel_release_msg_rcv_buf(rcc, SPICE_MSGC_SPICEVMC_DATA,
> - compressed_data_msg->uncompressed_size,
> - decompressed);
> + red_char_device_write_buffer_release(state->chardev, &write_buf);
same
> return FALSE;
> }
> - spice_assert(state->recv_from_client_buf->buf == decompressed);
> - state->recv_from_client_buf->buf_used = decompressed_size;
> - red_char_device_write_buffer_add(state->chardev, state->recv_from_client_buf);
> - state->recv_from_client_buf = NULL;
> + write_buf->buf_used = decompressed_size;
> + red_char_device_write_buffer_add(state->chardev, write_buf);
> return TRUE;
> }
>
> @@ -399,9 +394,7 @@ static int spicevmc_red_channel_client_handle_message_parsed(RedChannelClient *r
> state->recv_from_client_buf = NULL;
> break;
> case SPICE_MSGC_SPICEVMC_COMPRESSED_DATA:
> - if (!try_handle_compressed_msg(rcc, (SpiceMsgCompressedData*)msg)) {
> - return FALSE;
> - }
> + return handle_compressed_msg(state, rcc, (SpiceMsgCompressedData*)msg);
> break;
> case SPICE_MSGC_PORT_EVENT:
> if (size != sizeof(uint8_t)) {
Thanks
More information about the Spice-devel
mailing list