[Spice-devel] [PATCH 6/7] worker: don't use weird RedCompressedBuf nbytes shifting
Fabiano FidĂȘncio
fidencio at redhat.com
Fri Nov 13 04:50:05 PST 2015
On Fri, Nov 13, 2015 at 1:26 PM, Pavel Grunt <pgrunt at redhat.com> wrote:
> On Fri, 2015-11-13 at 06:20 -0500, Frediano Ziglio wrote:
>> ---
>> server/display-channel.h | 9 ++++++++-
>> server/red_worker.c | 41 ++++++++++++++++++++++-------------------
>> 2 files changed, 30 insertions(+), 20 deletions(-)
>>
>> diff --git a/server/display-channel.h b/server/display-channel.h
>> index 12ef60a..7aa73cf 100644
>> --- a/server/display-channel.h
>> +++ b/server/display-channel.h
>> @@ -73,7 +73,14 @@
>> #define RED_COMPRESS_BUF_SIZE (1024 * 64)
>> typedef struct RedCompressBuf RedCompressBuf;
>> struct RedCompressBuf {
>> - uint32_t buf[RED_COMPRESS_BUF_SIZE / 4];
>> + /* This buffer provide space for compression algorithms.
>> + * Some algorithms access the buffer as an array of 32 bit words
>> + * so is defined to make sure is always aligned that way.
>> + */
>> + union {
>> + uint8_t bytes[RED_COMPRESS_BUF_SIZE];
>> + uint32_t words[RED_COMPRESS_BUF_SIZE / 4];
>> + } buf;
>> RedCompressBuf *next;
>> RedCompressBuf *send_next;
>> };
>> diff --git a/server/red_worker.c b/server/red_worker.c
>> index af85591..aad9b4a 100644
>> --- a/server/red_worker.c
>> +++ b/server/red_worker.c
>> @@ -3343,7 +3343,7 @@ static void marshaller_add_compressed(SpiceMarshaller
>> *m,
>> spice_assert(comp_buf);
>> now = MIN(sizeof(comp_buf->buf), max);
>> max -= now;
>> - spice_marshaller_add_ref(m, (uint8_t*)comp_buf->buf, now);
>> + spice_marshaller_add_ref(m, comp_buf->buf.bytes, now);
>> comp_buf = comp_buf->send_next;
>> } while (max);
>> }
>> @@ -3758,7 +3758,10 @@ static void glz_usr_free(GlzEncoderUsrContext *usr,
>> void *ptr)
>> free(ptr);
>> }
>>
>> -static inline int encoder_usr_more_space(EncoderData *enc_data, uint32_t
>> **io_ptr)
>> +/* Allocate more space for compressed buffer.
>> + * The pointer returned in io_ptr is garanteed to be aligned to 4 bytes.
>> + */
>> +static int encoder_usr_more_space(EncoderData *enc_data, uint8_t **io_ptr)
>> {
>> RedCompressBuf *buf;
>>
>> @@ -3768,46 +3771,46 @@ static inline int encoder_usr_more_space(EncoderData
>> *enc_data, uint32_t **io_pt
>> enc_data->bufs_tail->send_next = buf;
>> enc_data->bufs_tail = buf;
>> buf->send_next = NULL;
>> - *io_ptr = buf->buf;
>> - return sizeof(buf->buf) >> 2;
>> + *io_ptr = buf->buf.bytes;
>> + return sizeof(buf->buf);
>> }
>>
>> static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int
>> rows_completed)
>> {
>> EncoderData *usr_data = &(((QuicData *)usr)->data);
>> - return encoder_usr_more_space(usr_data, io_ptr);
>> + return encoder_usr_more_space(usr_data, (uint8_t **)io_ptr) /
>> sizeof(uint32_t);
>> }
>>
>> static int lz_usr_more_space(LzUsrContext *usr, uint8_t **io_ptr)
>> {
>> EncoderData *usr_data = &(((LzData *)usr)->data);
>> - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
>> + return encoder_usr_more_space(usr_data, io_ptr);
>> }
>>
>> static int glz_usr_more_space(GlzEncoderUsrContext *usr, uint8_t **io_ptr)
>> {
>> EncoderData *usr_data = &(((GlzData *)usr)->data);
>> - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
>> + return encoder_usr_more_space(usr_data, io_ptr);
>> }
>>
>> static int jpeg_usr_more_space(JpegEncoderUsrContext *usr, uint8_t **io_ptr)
>> {
>> EncoderData *usr_data = &(((JpegData *)usr)->data);
>> - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
>> + return encoder_usr_more_space(usr_data, io_ptr);
>> }
>>
>> #ifdef USE_LZ4
>> static int lz4_usr_more_space(Lz4EncoderUsrContext *usr, uint8_t **io_ptr)
>> {
>> EncoderData *usr_data = &(((Lz4Data *)usr)->data);
>> - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
>> + return encoder_usr_more_space(usr_data, io_ptr);
>> }
>> #endif
>>
>> static int zlib_usr_more_space(ZlibEncoderUsrContext *usr, uint8_t **io_ptr)
>> {
>> EncoderData *usr_data = &(((ZlibData *)usr)->data);
>> - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
>> + return encoder_usr_more_space(usr_data, io_ptr);
>> }
>>
>> static inline int encoder_usr_more_lines(EncoderData *enc_data, uint8_t
>> **lines)
>> @@ -3882,7 +3885,7 @@ static int zlib_usr_more_input(ZlibEncoderUsrContext
>> *usr, uint8_t** input)
>> return 0;
>> }
>>
>> - *input = (uint8_t*)usr_data->u.compressed_data.next->buf;
>> + *input = usr_data->u.compressed_data.next->buf.bytes;
>> buf_size = MIN(sizeof(usr_data->u.compressed_data.next->buf),
>> usr_data->u.compressed_data.size_left);
>>
>> @@ -4045,7 +4048,7 @@ static inline int
>> red_glz_compress_image(DisplayChannelClient *dcc,
>>
>> glz_size = glz_encode(dcc->glz, type, src->x, src->y,
>> (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN), NULL,
>> 0,
>> - src->stride, (uint8_t*)glz_data->data.bufs_head-
>> >buf,
>> + src->stride, glz_data->data.bufs_head->buf.bytes,
>> sizeof(glz_data->data.bufs_head->buf),
>> glz_drawable_instance,
>> &glz_drawable_instance->glz_instance);
>> @@ -4075,7 +4078,7 @@ static inline int
>> red_glz_compress_image(DisplayChannelClient *dcc,
>> zlib_data->data.u.compressed_data.size_left = glz_size;
>>
>> zlib_size = zlib_encode(worker->zlib, display_channel->zlib_level,
>> - glz_size, (uint8_t*)zlib_data->data.bufs_head-
>> >buf,
>> + glz_size, zlib_data->data.bufs_head->buf.bytes,
>> sizeof(zlib_data->data.bufs_head->buf));
>>
>> // the compressed buffer is bigger than the original data
>> @@ -4150,7 +4153,7 @@ static inline int
>> red_lz_compress_image(DisplayChannelClient *dcc,
>> size = lz_encode(lz, type, src->x, src->y,
>> !!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
>> NULL, 0, src->stride,
>> - (uint8_t*)lz_data->data.bufs_head->buf,
>> + lz_data->data.bufs_head->buf.bytes,
>> sizeof(lz_data->data.bufs_head->buf));
>>
>> // the compressed buffer is bigger than the original data
>> @@ -4263,7 +4266,7 @@ static int red_jpeg_compress_image(DisplayChannelClient
>> *dcc, SpiceImage *dest,
>> }
>> jpeg_size = jpeg_encode(jpeg, display_channel->jpeg_quality,
>> jpeg_in_type,
>> src->x, src->y, NULL,
>> - 0, stride, (uint8_t*)jpeg_data->data.bufs_head-
>> >buf,
>> + 0, stride, jpeg_data->data.bufs_head->buf.bytes,
>> sizeof(jpeg_data->data.bufs_head->buf));
>>
>> // the compressed buffer is bigger than the original data
>> @@ -4289,7 +4292,7 @@ static int red_jpeg_compress_image(DisplayChannelClient
>> *dcc, SpiceImage *dest,
>>
>> comp_head_filled = jpeg_size % sizeof(lz_data->data.bufs_head->buf);
>> comp_head_left = sizeof(lz_data->data.bufs_head->buf) - comp_head_filled;
>> - lz_out_start_byte = ((uint8_t *)lz_data->data.bufs_head->buf) +
>> comp_head_filled;
>> + lz_out_start_byte = lz_data->data.bufs_head->buf.bytes +
>> comp_head_filled;
>>
>> lz_data->data.dcc = dcc;
>>
>> @@ -4372,7 +4375,7 @@ static int red_lz4_compress_image(DisplayChannelClient
>> *dcc, SpiceImage *dest,
>> lz4_data->data.u.lines_data.reverse = 0;
>> lz4_data->usr.more_lines = lz4_usr_more_lines;
>>
>> - lz4_size = lz4_encode(lz4, src->y, src->stride, (uint8_t*)lz4_data-
>> >data.bufs_head->buf,
>> + lz4_size = lz4_encode(lz4, src->y, src->stride, lz4_data->data.bufs_head-
>> >buf.bytes,
>> sizeof(lz4_data->data.bufs_head->buf),
>> src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN, src-
>> >format);
>>
>> @@ -4461,8 +4464,8 @@ static inline int
>> red_quic_compress_image(DisplayChannelClient *dcc, SpiceImage
>> stride = -src->stride;
>> }
>> size = quic_encode(quic, type, src->x, src->y, NULL, 0, stride,
>> - quic_data->data.bufs_head->buf,
>> - sizeof(quic_data->data.bufs_head->buf) >> 2);
>> + quic_data->data.bufs_head->buf.words,
>> + G_N_ELEMENTS(quic_data->data.bufs_head->buf.words));
>>
>> // the compressed buffer is bigger than the original data
>> if ((size << 2) > (src->y * src->stride)) {
>
> Ack, thanks for the comments
>
> Pavel
>
Same here, ACK!
More information about the Spice-devel
mailing list