[Spice-devel] [spice PATCH v1 2/3] char-device: Define a memory pool limit

Fabiano FidĂȘncio fidencio at redhat.com
Thu Nov 12 08:13:28 PST 2015


On Thu, Nov 12, 2015 at 5:00 PM, Victor Toso <victortoso at redhat.com> wrote:
> Otherwise the amount of unused memory could grow while transfering big
> chunks of data. This change only means that once the memory was used it
> will not be stored again after the limit was reached.
>
> Related: https://bugs.freedesktop.org/show_bug.cgi?id=91350
> ---
>  server/char_device.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/server/char_device.c b/server/char_device.c
> index ee52e90..5eda89c 100644
> --- a/server/char_device.c
> +++ b/server/char_device.c
> @@ -27,6 +27,7 @@
>
>  #define CHAR_DEVICE_WRITE_TO_TIMEOUT 100
>  #define SPICE_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT 30000
> +#define MAX_POOL_SIZE (10 * 64 * 1024)
>
>  typedef struct SpiceCharDeviceClientState SpiceCharDeviceClientState;
>  struct SpiceCharDeviceClientState {
> @@ -52,6 +53,7 @@ struct SpiceCharDeviceState {
>
>      Ring write_queue;
>      Ring write_bufs_pool;
> +    uint64_t cur_pool_size;
>      SpiceCharDeviceWriteBuffer *cur_write_buf;
>      uint8_t *cur_write_buf_pos;
>      SpiceTimer *write_to_dev_timer;
> @@ -114,10 +116,12 @@ static void write_buffers_queue_free(Ring *write_queue)
>  static void spice_char_device_write_buffer_pool_add(SpiceCharDeviceState *dev,
>                                                      SpiceCharDeviceWriteBuffer *buf)
>  {
> -    if (buf->refs == 1) {
> +    if (buf->refs == 1 &&
> +        dev->cur_pool_size < MAX_POOL_SIZE) {
>          buf->buf_used = 0;
>          buf->origin = WRITE_BUFFER_ORIGIN_NONE;
>          buf->client = NULL;
> +        dev->cur_pool_size += buf->buf_size;
>          ring_add(&dev->write_bufs_pool, &buf->link);
>          return;
>      }
> @@ -529,6 +533,7 @@ static SpiceCharDeviceWriteBuffer *__spice_char_device_write_buffer_get(
>      if ((item = ring_get_tail(&dev->write_bufs_pool))) {
>          ret = SPICE_CONTAINEROF(item, SpiceCharDeviceWriteBuffer, link);
>          ring_remove(item);
> +        dev->cur_pool_size -= ret->buf_size;
>      } else {
>          ret = spice_new0(SpiceCharDeviceWriteBuffer, 1);
>      }
> @@ -569,6 +574,7 @@ static SpiceCharDeviceWriteBuffer *__spice_char_device_write_buffer_get(
>      ret->refs = 1;
>      return ret;
>  error:
> +    dev->cur_pool_size += ret->buf_size;
>      ring_add(&dev->write_bufs_pool, &ret->link);
>      return NULL;
>  }
> @@ -739,6 +745,7 @@ void spice_char_device_state_destroy(SpiceCharDeviceState *char_dev)
>      }
>      write_buffers_queue_free(&char_dev->write_queue);
>      write_buffers_queue_free(&char_dev->write_bufs_pool);
> +    char_dev->cur_pool_size = 0;
>      spice_char_device_write_buffer_free(char_dev->cur_write_buf);
>
>      while (!ring_is_empty(&char_dev->clients)) {
> --
> 2.5.0
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel

Looks good, ACK!


More information about the Spice-devel mailing list