All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: elena.ufimtseva@oracle.com
Cc: fam@euphon.net, john.g.johnson@oracle.com,
	swapnil.ingle@nutanix.com, mst@redhat.com, qemu-devel@nongnu.org,
	kraxel@redhat.com, jag.raman@oracle.com, quintela@redhat.com,
	armbru@redhat.com, kanth.ghatraju@oracle.com, felipe@nutanix.com,
	thuth@redhat.com, ehabkost@redhat.com, konrad.wilk@oracle.com,
	dgilbert@redhat.com, alex.williamson@redhat.com,
	stefanha@redhat.com, pbonzini@redhat.com, kwolf@redhat.com,
	mreitz@redhat.com, ross.lagerwall@citrix.com,
	marcandre.lureau@gmail.com, thanos.makatos@nutanix.com
Subject: Re: [PATCH v15 08/20] multi-process: add qio channel read function
Date: Mon, 4 Jan 2021 15:16:53 +0000	[thread overview]
Message-ID: <20210104151653.GM640208@redhat.com> (raw)
In-Reply-To: <42569c768066e334186ea8567847d96c8ebb0ad9.1608702853.git.elena.ufimtseva@oracle.com>

On Tue, Dec 22, 2020 at 10:14:43PM -0800, elena.ufimtseva@oracle.com wrote:
> From: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> 
> Adds qio_channel_readv_full_all() to read both data and FDs.
> Refactors existing code to use this function.
> 
> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
> ---
>  include/io/channel.h | 25 +++++++++++++
>  io/channel.c         | 85 +++++++++++++++++++++++++++++++-------------
>  2 files changed, 85 insertions(+), 25 deletions(-)
> 
> diff --git a/include/io/channel.h b/include/io/channel.h
> index 2378567d4b..429ece9a05 100644
> --- a/include/io/channel.h
> +++ b/include/io/channel.h
> @@ -774,6 +774,31 @@ void qio_channel_set_aio_fd_handler(QIOChannel *ioc,
>                                      IOHandler *io_write,
>                                      void *opaque);
>  
> +/**
> + * qio_channel_readv_full_all:
> + * @ioc: the channel object
> + * @iov: the array of memory regions to read data to
> + * @niov: the length of the @iov array
> + * @fds: an array of file handles to read
> + * @nfds: number of file handles in @fds
> + * @errp: pointer to a NULL-initialized error object
> + *
> + *
> + * Behaves like qio_channel_readv_full but will attempt
> + * to read all data specified (file handles and memory regions).
> + * The function will wait for all requested data
> + * to be read, yielding from the current coroutine
> + * if required.
> + *
> + * Returns: 0 if all bytes were read, or -1 on error
> + */
> +
> +int qio_channel_readv_full_all(QIOChannel *ioc,
> +                                const struct iovec *iov,
> +                                size_t niov,
> +                                int **fds, size_t *nfds,
> +                                Error **errp);

There parameters are one character mis-aligned here.

> diff --git a/io/channel.c b/io/channel.c
> index bde1f6d0f4..5edaea1fac 100644
> --- a/io/channel.c
> +++ b/io/channel.c
> @@ -91,11 +91,49 @@ int qio_channel_readv_all_eof(QIOChannel *ioc,
>                                const struct iovec *iov,
>                                size_t niov,
>                                Error **errp)
> +{
> +    int ret = qio_channel_readv_full_all(ioc, iov, niov, NULL, NULL, errp);
> +
> +    if (ret == -ECANCELED) {
> +        error_prepend(errp,
> +                      "Unexpected end-of-file before all bytes were read: ");
> +        ret = -1;
> +    }
> +
> +    return ret;
> +}
> +
> +int qio_channel_readv_all(QIOChannel *ioc,
> +                          const struct iovec *iov,
> +                          size_t niov,
> +                          Error **errp)
> +{
> +    int ret = qio_channel_readv_all_eof(ioc, iov, niov, errp);
> +
> +    if (ret == 0) {
> +        error_setg(errp,
> +                   "Unexpected end-of-file before all bytes were read");
> +        return -1;
> +    }
> +    if (ret == 1) {
> +        return 0;
> +    }
> +
> +    return ret;
> +}
> +
> +int qio_channel_readv_full_all(QIOChannel *ioc,
> +                                const struct iovec *iov,
> +                                size_t niov,
> +                                int **fds, size_t *nfds,
> +                                Error **errp)
>  {
>      int ret = -1;
>      struct iovec *local_iov = g_new(struct iovec, niov);
>      struct iovec *local_iov_head = local_iov;
>      unsigned int nlocal_iov = niov;
> +    int **local_fds = fds;
> +    size_t *local_nfds = nfds;

It doesn't look like we actually need these as local variables,
as opposed to just replacing the parameters.

>      bool partial = false;
>  
>      nlocal_iov = iov_copy(local_iov, nlocal_iov,
> @@ -104,7 +142,8 @@ int qio_channel_readv_all_eof(QIOChannel *ioc,
>  
>      while (nlocal_iov > 0) {
>          ssize_t len;
> -        len = qio_channel_readv(ioc, local_iov, nlocal_iov, errp);
> +        len = qio_channel_readv_full(ioc, local_iov, nlocal_iov, local_fds,
> +                                     local_nfds, errp);
>          if (len == QIO_CHANNEL_ERR_BLOCK) {
>              if (qemu_in_coroutine()) {
>                  qio_channel_yield(ioc, G_IO_IN);
> @@ -112,20 +151,33 @@ int qio_channel_readv_all_eof(QIOChannel *ioc,
>                  qio_channel_wait(ioc, G_IO_IN);
>              }
>              continue;
> -        } else if (len < 0) {
> -            goto cleanup;
> -        } else if (len == 0) {
> -            if (partial) {
> -                error_setg(errp,
> -                           "Unexpected end-of-file before all bytes were read");
> +        }
> +
> +        if (len <= 0) {
> +            size_t fd_idx = nfds ? *nfds : 0;
> +            if (partial && (len == 0)) {
> +                ret = -ECANCELED;

As Marc-Andre mentioned, we intentionally avoid returning 'errno' from
any of the QIO functions, so I definitely don't want to see this added.

If I look at the current set of APIs:

qio_channel_readv_full

qio_channel_readv
qio_channel_readv_all
qio_channel_readv_all_eof

qio_channel_read
qio_channel_read_all
qio_channel_read_all_eof

I think the problem is that you're introducing just 1 new function,
when we really should have two in order to complete the code pattern
we have. ie

  qio_channel_readv_full_all
  qio_channel_readv_full_all_eof

the former should call the latter.


>              } else {
> -                ret = 0;
> +                ret = len;
> +            }
> +
> +            while (fds && fd_idx) {
> +                close(*fds[fd_idx - 1]);
> +                fd_idx--;
> +            }
> +
> +            if (fds) {
> +                g_free(*fds);
>              }
> +
>              goto cleanup;
>          }
>  
>          partial = true;
>          iov_discard_front(&local_iov, &nlocal_iov, len);
> +
> +        local_fds = NULL;
> +        local_nfds = 0;
>      }
>  
>      ret = 1;
> @@ -135,23 +187,6 @@ int qio_channel_readv_all_eof(QIOChannel *ioc,
>      return ret;
>  }
>  
> -int qio_channel_readv_all(QIOChannel *ioc,
> -                          const struct iovec *iov,
> -                          size_t niov,
> -                          Error **errp)
> -{
> -    int ret = qio_channel_readv_all_eof(ioc, iov, niov, errp);
> -
> -    if (ret == 0) {
> -        ret = -1;
> -        error_setg(errp,
> -                   "Unexpected end-of-file before all bytes were read");
> -    } else if (ret == 1) {
> -        ret = 0;
> -    }
> -    return ret;
> -}
> -

Try not to mix in code movement with functional changes, as it obscures
the diffs. IOW, if you want to re-arrange funtions in the file, do this
as a separate patch first.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



  parent reply	other threads:[~2021-01-04 15:18 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-23  6:14 [PATCH v15 00/20] Initial support for multi-process Qemu elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 01/20] multi-process: add the concept description to docs/devel/qemu-multiprocess elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 02/20] multi-process: add configure and usage information elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 03/20] memory: alloc RAM from file at offset elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 04/20] multi-process: Add config option for multi-process QEMU elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 05/20] multi-process: setup PCI host bridge for remote device elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 06/20] multi-process: setup a machine object for remote device process elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 07/20] multi-process: add qio channel write function elena.ufimtseva
2021-01-04 15:02   ` Daniel P. Berrangé
2020-12-23  6:14 ` [PATCH v15 08/20] multi-process: add qio channel read function elena.ufimtseva
2020-12-23 11:24   ` Marc-André Lureau
2020-12-23 21:57     ` Jag Raman
2021-01-04 15:16   ` Daniel P. Berrangé [this message]
2020-12-23  6:14 ` [PATCH v15 09/20] multi-process: define MPQemuMsg format and transmission functions elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 10/20] multi-process: Initialize message handler in remote device elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 11/20] multi-process: Associate fd of a PCIDevice with its object elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 12/20] multi-process: setup memory manager for remote device elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 13/20] multi-process: introduce proxy object elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 14/20] multi-process: add proxy communication functions elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 15/20] multi-process: Forward PCI config space acceses to the remote process elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 16/20] multi-process: PCI BAR read/write handling for proxy & remote endpoints elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 17/20] multi-process: Synchronize remote memory elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 18/20] multi-process: create IOHUB object to handle irq elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 19/20] multi-process: Retrieve PCI info from remote process elena.ufimtseva
2020-12-23  6:14 ` [PATCH v15 20/20] multi-process: perform device reset in the " elena.ufimtseva

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210104151653.GM640208@redhat.com \
    --to=berrange@redhat.com \
    --cc=alex.williamson@redhat.com \
    --cc=armbru@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=elena.ufimtseva@oracle.com \
    --cc=fam@euphon.net \
    --cc=felipe@nutanix.com \
    --cc=jag.raman@oracle.com \
    --cc=john.g.johnson@oracle.com \
    --cc=kanth.ghatraju@oracle.com \
    --cc=konrad.wilk@oracle.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=marcandre.lureau@gmail.com \
    --cc=mreitz@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=ross.lagerwall@citrix.com \
    --cc=stefanha@redhat.com \
    --cc=swapnil.ingle@nutanix.com \
    --cc=thanos.makatos@nutanix.com \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.