[Spice-devel] [spice-server v2 1/6] Add RedCharDeviceWriteBufferPrivate

Christophe Fergeau cfergeau at redhat.com
Fri Apr 28 11:45:24 UTC 2017


On Fri, Apr 28, 2017 at 05:25:31AM -0400, Frediano Ziglio wrote:
> > 
> > This is intended to hold the fields that only char-device.c has a use
> > for, but for now this only adds the boilerplate for it, the next commit
> > will move the relevant field there.
> > 
> > Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
> > ---
> >  server/char-device.c | 5 +++++
> >  server/char-device.h | 3 +++
> >  2 files changed, 8 insertions(+)
> > 
> > diff --git a/server/char-device.c b/server/char-device.c
> > index d32593209..fa137e416 100644
> > --- a/server/char-device.c
> > +++ b/server/char-device.c
> > @@ -31,6 +31,9 @@
> >  #define RED_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT 30000
> >  #define MAX_POOL_SIZE (10 * 64 * 1024)
> >  
> > +struct RedCharDeviceWriteBufferPrivate {
> > +};
> > +
> >  typedef struct RedCharDeviceClient RedCharDeviceClient;
> >  struct RedCharDeviceClient {
> >      RedCharDevice *dev;
> > @@ -144,6 +147,7 @@ static void
> > red_char_device_write_buffer_free(RedCharDeviceWriteBuffer *buf)
> >          return;
> >  
> >      free(buf->buf);
> > +    free(buf->priv);
> >      free(buf);
> >  }
> >  
> > @@ -540,6 +544,7 @@ static RedCharDeviceWriteBuffer
> > *__red_char_device_write_buffer_get(
> >          dev->priv->cur_pool_size -= ret->buf_size;
> >      } else {
> >          ret = spice_new0(RedCharDeviceWriteBuffer, 1);
> > +        ret->priv = spice_new0(RedCharDeviceWriteBufferPrivate, 1);
> >      }
> >  
> >      spice_assert(!ret->buf_used);
> 
> Would not be better if this is always allocated here to have a
> public part and a private one after the public to avoid the
> indirection penalty?
> 
> So kind of
> 
> struct RedCharDeviceWriteBufferPrivate {
>    RedCharDeviceWriteBuffer base;
>    .. additional fields here ...
> };
> 
> ...
> 
> ret = &spice_new0(RedCharDeviceWriteBufferPrivate, 1)->base;

I considered playing tricks like
ret = spice_malloc0(sizeof(RedCharDeviceWriteBuffer) +
sizeof(RedCharDeviceWriteBufferPrivate));
ret->priv = &ret[1];

to allocate it, but was not sure it was worth it over the simple version
in this patch.

> 
> > diff --git a/server/char-device.h b/server/char-device.h
> > index 7854086c3..9bfd7c656 100644
> > --- a/server/char-device.h
> > +++ b/server/char-device.h
> > @@ -146,6 +146,7 @@ GType red_char_device_get_type(void) G_GNUC_CONST;
> >   * */
> >  
> >  /* buffer that is used for writing to the device */
> > +typedef struct RedCharDeviceWriteBufferPrivate
> > RedCharDeviceWriteBufferPrivate;
> >  typedef struct RedCharDeviceWriteBuffer {
> >      int origin;
> >      RedClient *client; /* The client that sent the message to the device.
> > @@ -156,6 +157,8 @@ typedef struct RedCharDeviceWriteBuffer {
> >      uint32_t buf_used;
> >      uint32_t token_price;
> >      uint32_t refs;
> > +
> > +    RedCharDeviceWriteBufferPrivate *priv;
> >  } RedCharDeviceWriteBuffer;
> >  
> >  void red_char_device_reset_dev_instance(RedCharDevice *dev,
> 
> I would put client field (patch 3/6) as first to reduce structure size on
> 64 bit.

I kept the same order as in the initial struct. However, moving things
around does not seem to make a difference size-wise, padding is added to the
end rather than just after the first member.

struct RedCharDeviceWriteBufferPrivate {
        RedClient *                client;               /*     0     8 */
        WriteBufferOrigin          origin;               /*     8     4 */
        uint32_t                   token_price;          /*    12     4 */
        uint32_t                   refs;                 /*    16     4 */

        /* size: 24, cachelines: 1, members: 4 */
        /* padding: 4 */
        /* last cacheline: 24 bytes */
};

struct RedCharDeviceWriteBufferPrivate {
        WriteBufferOrigin          origin;               /*     0     4 */

        /* XXX 4 bytes hole, try to pack */

        RedClient *                client;               /*     8     8 */
        uint32_t                   token_price;          /*    16     4 */
        uint32_t                   refs;                 /*    20     4 */

        /* size: 24, cachelines: 1, members: 4 */
        /* sum members: 20, holes: 1, sum holes: 4 */
        /* last cacheline: 24 bytes */
};

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170428/c6fa071d/attachment-0001.sig>


More information about the Spice-devel mailing list