[Spice-devel] [PATCH spice-server 2/3] stream: implements flush using TCP_CORK

Christophe Fergeau cfergeau at redhat.com
Thu Apr 12 16:33:57 UTC 2018


On Tue, Jan 16, 2018 at 02:18:14PM +0000, Frediano Ziglio wrote:
> Cork is a system interface implemented by Linux and some *BSD systems to
> tell the system that other data are expected to be written to a socket.
> This allows the system to reduce network fragmentation waiting a network

'waiting for network packets to be complete' I think.

> packet to be complete.
> 
> Using some replay capture and some instrumentation resulted in a
> bandwith reduction of 11% and a packet reduction of 56%.

I would add a link to https://lists.freedesktop.org/archives/spice-devel/2017-February/035577.html
and maybe even copy the data you put in there.

> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/red-stream.c | 34 +++++++++++++++++++++++++++++++++-
>  1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/server/red-stream.c b/server/red-stream.c
> index 4812d8e4..4833077c 100644
> --- a/server/red-stream.c
> +++ b/server/red-stream.c
> @@ -24,6 +24,7 @@
>  #include <unistd.h>
>  #include <sys/socket.h>
>  #include <fcntl.h>
> +#include <netinet/tcp.h>
>  
>  #include <glib.h>
>  
> @@ -83,6 +84,8 @@ struct RedStreamPrivate {
>       * deallocated when main_dispatcher handles the SPICE_CHANNEL_EVENT_DISCONNECTED
>       * event, either from same thread or by call back from main thread. */
>      SpiceChannelEventInfo* info;
> +    bool use_cork;
> +    bool corked;
>  
>      ssize_t (*read)(RedStream *s, void *buf, size_t nbyte);
>      ssize_t (*write)(RedStream *s, const void *buf, size_t nbyte);
> @@ -92,6 +95,15 @@ struct RedStreamPrivate {
>      SpiceCoreInterfaceInternal *core;
>  };
>  
> +/**
> + * Set TCP_CORK on socket
> + */
> +/* NOTE: enabled must be int */

Maybe verify(sizeof(socket) == sizeof(int))?

> +static inline int socket_set_cork(int socket, int enabled)

I'd drop the 'inline'

> +{
> +    return setsockopt(socket, IPPROTO_TCP, TCP_CORK, &enabled, sizeof(enabled));

I suspect we'll need to add a configure check for this? It seems to be
called TCP_NOPUSH in OpenBSD? https://man.openbsd.org/tcp

> +}
> +
>  static ssize_t stream_write_cb(RedStream *s, const void *buf, size_t size)
>  {
>      return write(s->socket, buf, size);
> @@ -205,11 +217,31 @@ bool red_stream_write_all(RedStream *stream, const void *in_buf, size_t n)
>  
>  bool red_stream_set_auto_flush(RedStream *s, bool enable)
>  {
> -    return enable;
> +    if (s->priv->use_cork == !enable) {

Might be slightly more readable if 'enable' is renamed to 'auto_flush'


Acked-by: Christophe Fergeau <cfergeau at redhat.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20180412/726ea68f/attachment.sig>


More information about the Spice-devel mailing list