[libvirt] [PATCH v2 15/21] utils: Write a maximum of MAX_PIPE_FEED_BYTES into a pipe

Marc-André Lureau marcandre.lureau at redhat.com
Wed Jul 10 20:07:17 UTC 2019


On Wed, Jul 10, 2019 at 10:12 PM Stefan Berger
<stefanb at linux.vnet.ibm.com> wrote:
>
> To avoid blocking on a write on a pipe that the receiving process
> does not read from, write only MAX_PIPE_FEED_BYTES into the pipe
> so that we can serve other pipes as well.

why not simply use non-blocking write?

>
> Signed-off-by: Stefan Berger <stefanb at linux.ibm.com>
> ---
>  src/util/vircommand.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/src/util/vircommand.c b/src/util/vircommand.c
> index 898ee0df45..0e367eeeab 100644
> --- a/src/util/vircommand.c
> +++ b/src/util/vircommand.c
> @@ -86,6 +86,8 @@ struct _virCommandSendBuffer {
>      size_t buflen;
>      off_t offset;
>  };
> +/* max. number of bytes we write to pipe to avoid blocking on it */
> +#define MAX_PIPE_FEED_BYTES 1024
>
>  struct _virCommand {
>      int has_error; /* ENOMEM on allocation failure, -1 for anything else.  */
> @@ -2237,7 +2239,7 @@ virCommandProcessIO(virCommandPtr cmd)
>                  int done;
>
>                  done = write(cmd->inpipe, cmd->inbuf + inoff,
> -                             inlen - inoff);
> +                             MIN(inlen - inoff, MAX_PIPE_FEED_BYTES));
>                  if (done < 0) {
>                      if (errno == EPIPE) {
>                          VIR_DEBUG("child closed stdin early, ignoring EPIPE "
> --
> 2.20.1
>




More information about the libvir-list mailing list