[Mesa-dev] [PATCH 1/2] virgl: Negotiate version with vtest server

Gert Wollny gw.fossdev at gmail.com
Fri Sep 14 09:00:20 UTC 2018


Am Donnerstag, den 13.09.2018, 20:04 -0700 schrieb Gurchetan Singh:
> Reviewed-by: Gurchetan Singh <gurchetansingh at chromium.org>
> 
> Was there a second patch sent out?
Yes, somehow it did reach Dave, but neither the ML nor patchwork 
I'll resend 

Best, 
Gert 



> On Thu, Sep 13, 2018 at 4:24 AM Gert Wollny <gw.fossdev at gmail.com>
> wrote:
> > 
> > From: Tomeu Vizoso <tomeu.vizoso at collabora.com>
> > 
> > Check if server supports version negotation by sending a
> > PING_PROTOCOL_VERSION
> > message right before a dummy RESOURCE_BUSY_WAIT. If we don't get a
> > reply
> > for the first, we know the server doesn't support it.
> > 
> > If it does support it, we can query the max protocol version
> > supported
> > by the server and fall back if needed.
> > 
> > 
> > v2: - Send a new message to negotiate the protocol version,
> > checking if
> >       the server supports this message by immediately sending a
> > busy wait
> >       message. (Dave Airlie)
> > 
> > v3: - Send a zero-arg command PING_PROTOCOL_VERSION so we actually
> > keep
> >       compatibility with older servers. (Code by Dave Airlie)
> > 
> > Signed-off-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
> > Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> > 
> > ---
> >  .../winsys/virgl/vtest/virgl_vtest_socket.c        | 52
> > ++++++++++++++++++++++
> >  .../winsys/virgl/vtest/virgl_vtest_winsys.h        |  2 +
> >  src/gallium/winsys/virgl/vtest/vtest_protocol.h    | 10 +++++
> >  3 files changed, 64 insertions(+)
> > 
> > diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
> > b/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
> > index d25f9a3bd9..4d20a63ad6 100644
> > --- a/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
> > +++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
> > @@ -101,6 +101,57 @@ static int virgl_vtest_send_init(struct
> > virgl_vtest_winsys *vws)
> >     return 0;
> >  }
> > 
> > +static int virgl_vtest_negotiate_version(struct virgl_vtest_winsys
> > *vws)
> > +{
> > +   uint32_t vtest_hdr[VTEST_HDR_SIZE];
> > +   uint32_t version_buf[VCMD_PROTOCOL_VERSION_SIZE];
> > +   uint32_t busy_wait_buf[VCMD_BUSY_WAIT_SIZE];
> > +   uint32_t busy_wait_result[1];
> > +   int ret;
> > +
> > +   vtest_hdr[VTEST_CMD_LEN] = VCMD_PING_PROTOCOL_VERSION_SIZE;
> > +   vtest_hdr[VTEST_CMD_ID] = VCMD_PING_PROTOCOL_VERSION;
> > +   virgl_block_write(vws->sock_fd, &vtest_hdr, sizeof(vtest_hdr));
> > +
> > +   vtest_hdr[VTEST_CMD_LEN] = VCMD_BUSY_WAIT_SIZE;
> > +   vtest_hdr[VTEST_CMD_ID] = VCMD_RESOURCE_BUSY_WAIT;
> > +   busy_wait_buf[VCMD_BUSY_WAIT_HANDLE] = 0;
> > +   busy_wait_buf[VCMD_BUSY_WAIT_FLAGS] = 0;
> > +   virgl_block_write(vws->sock_fd, &vtest_hdr, sizeof(vtest_hdr));
> > +   virgl_block_write(vws->sock_fd, &busy_wait_buf,
> > sizeof(busy_wait_buf));
> > +
> > +   ret = virgl_block_read(vws->sock_fd, vtest_hdr,
> > sizeof(vtest_hdr));
> > +   assert(ret);
> > +
> > +   if (vtest_hdr[VTEST_CMD_ID] == VCMD_PING_PROTOCOL_VERSION) {
> > +     /* Read dummy busy_wait response */
> > +     ret = virgl_block_read(vws->sock_fd, vtest_hdr,
> > sizeof(vtest_hdr));
> > +     assert(ret);
> > +     ret = virgl_block_read(vws->sock_fd, busy_wait_result,
> > sizeof(busy_wait_result));
> > +     assert(ret);
> > +
> > +     vtest_hdr[VTEST_CMD_LEN] = VCMD_PROTOCOL_VERSION_SIZE;
> > +     vtest_hdr[VTEST_CMD_ID] = VCMD_PROTOCOL_VERSION;
> > +     version_buf[VCMD_PROTOCOL_VERSION_VERSION] =
> > VTEST_PROTOCOL_VERSION;
> > +     virgl_block_write(vws->sock_fd, &vtest_hdr,
> > sizeof(vtest_hdr));
> > +     virgl_block_write(vws->sock_fd, &version_buf,
> > sizeof(version_buf));
> > +
> > +     ret = virgl_block_read(vws->sock_fd, vtest_hdr,
> > sizeof(vtest_hdr));
> > +     assert(ret);
> > +     ret = virgl_block_read(vws->sock_fd, version_buf,
> > sizeof(version_buf));
> > +     assert(ret);
> > +     return version_buf[VCMD_PROTOCOL_VERSION_VERSION];
> > +   }
> > +
> > +   /* Read dummy busy_wait response */
> > +   assert(vtest_hdr[VTEST_CMD_ID] == VCMD_RESOURCE_BUSY_WAIT);
> > +   ret = virgl_block_read(vws->sock_fd, busy_wait_result,
> > sizeof(busy_wait_result));
> > +   assert(ret);
> > +
> > +   /* Old server, return version 0 */
> > +   return 0;
> > +}
> > +
> >  int virgl_vtest_connect(struct virgl_vtest_winsys *vws)
> >  {
> >     struct sockaddr_un un;
> > @@ -123,6 +174,7 @@ int virgl_vtest_connect(struct
> > virgl_vtest_winsys *vws)
> > 
> >     vws->sock_fd = sock;
> >     virgl_vtest_send_init(vws);
> > +   vws->protocol_version = virgl_vtest_negotiate_version(vws);
> >     return 0;
> >  }
> > 
> > diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
> > b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
> > index 031037b6b5..3628c74644 100644
> > --- a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
> > +++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
> > @@ -49,6 +49,8 @@ struct virgl_vtest_winsys {
> >     int num_delayed;
> >     unsigned usecs;
> >     mtx_t mutex;
> > +
> > +   unsigned protocol_version;
> >  };
> > 
> >  struct virgl_hw_res {
> > diff --git a/src/gallium/winsys/virgl/vtest/vtest_protocol.h
> > b/src/gallium/winsys/virgl/vtest/vtest_protocol.h
> > index 95bd8c1d0b..8eb904e73f 100644
> > --- a/src/gallium/winsys/virgl/vtest/vtest_protocol.h
> > +++ b/src/gallium/winsys/virgl/vtest/vtest_protocol.h
> > @@ -24,6 +24,7 @@
> >  #define VTEST_PROTOCOL
> > 
> >  #define VTEST_DEFAULT_SOCKET_NAME "/tmp/.virgl_test"
> > +#define VTEST_PROTOCOL_VERSION 1
> > 
> >  /* 32-bit length field */
> >  /* 32-bit cmd field */
> > @@ -53,6 +54,10 @@
> >  /* 0 length cmd */
> >  /* resp VCMD_GET_CAPS + caps */
> > 
> > +#define VCMD_PING_PROTOCOL_VERSION 10
> > +
> > +#define VCMD_PROTOCOL_VERSION 11
> > +
> >  #define VCMD_RES_CREATE_SIZE 10
> >  #define VCMD_RES_CREATE_RES_HANDLE 0
> >  #define VCMD_RES_CREATE_TARGET 1
> > @@ -87,4 +92,9 @@
> >  #define VCMD_BUSY_WAIT_HANDLE 0
> >  #define VCMD_BUSY_WAIT_FLAGS 1
> > 
> > +#define VCMD_PING_PROTOCOL_VERSION_SIZE 1
> > +
> > +#define VCMD_PROTOCOL_VERSION_SIZE 1
> > +#define VCMD_PROTOCOL_VERSION_VERSION 0
> > +
> >  #endif
> > --
> > 2.16.4
> > 
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list