qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 17/30] virtiofsd: Add main virtio loop


From: Marc-André Lureau
Subject: Re: [PATCH 17/30] virtiofsd: Add main virtio loop
Date: Mon, 21 Oct 2019 16:51:23 +0200

On Mon, Oct 21, 2019 at 1:26 PM Dr. David Alan Gilbert (git)
<address@hidden> wrote:
>
> From: "Dr. David Alan Gilbert" <address@hidden>
>
> Processes incoming requests on the vhost-user fd.

Is there a reason to avoid using glib & its main loop?

>
> Signed-off-by: Dr. David Alan Gilbert <address@hidden>
> ---
>  contrib/virtiofsd/fuse_virtio.c | 42 ++++++++++++++++++++++++++++++---
>  1 file changed, 39 insertions(+), 3 deletions(-)
>
> diff --git a/contrib/virtiofsd/fuse_virtio.c b/contrib/virtiofsd/fuse_virtio.c
> index 22f71d260f..9c58f11634 100644
> --- a/contrib/virtiofsd/fuse_virtio.c
> +++ b/contrib/virtiofsd/fuse_virtio.c
> @@ -11,12 +11,14 @@
>   * See the file COPYING.LIB
>   */
>
> +#include "fuse_virtio.h"
>  #include "fuse_i.h"
>  #include "fuse_kernel.h"
>  #include "fuse_misc.h"
>  #include "fuse_opt.h"
> -#include "fuse_virtio.h"
>
> +#include <assert.h>
> +#include <errno.h>
>  #include <stdint.h>
>  #include <stdio.h>
>  #include <stdlib.h>
> @@ -80,15 +82,49 @@ static const VuDevIface fv_iface = {
>      .queue_is_processed_in_order = fv_queue_order,
>  };
>
> +/*
> + * Main loop; this mostly deals with events on the vhost-user
> + * socket itself, and not actual fuse data.
> + */
>  int virtio_loop(struct fuse_session *se)
>  {
>      fuse_log(FUSE_LOG_INFO, "%s: Entry\n", __func__);
>
> -    while (1) {
> -        /* TODO: Add stuffing */
> +    while (!fuse_session_exited(se)) {
> +        struct pollfd pf[1];
> +        pf[0].fd = se->vu_socketfd;
> +        pf[0].events = POLLIN;
> +        pf[0].revents = 0;
> +
> +        fuse_log(FUSE_LOG_DEBUG, "%s: Waiting for VU event\n", __func__);
> +        int poll_res = ppoll(pf, 1, NULL, NULL);
> +
> +        if (poll_res == -1) {
> +            if (errno == EINTR) {
> +                fuse_log(FUSE_LOG_INFO, "%s: ppoll interrupted, going 
> around\n",
> +                         __func__);
> +                continue;
> +            }
> +            fuse_log(FUSE_LOG_ERR, "virtio_loop ppoll: %m\n");
> +            break;
> +        }
> +        assert(poll_res == 1);
> +        if (pf[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {
> +            fuse_log(FUSE_LOG_ERR, "%s: Unexpected poll revents %x\n", 
> __func__,
> +                     pf[0].revents);
> +            break;
> +        }
> +        assert(pf[0].revents & POLLIN);
> +        fuse_log(FUSE_LOG_DEBUG, "%s: Got VU event\n", __func__);
> +        if (!vu_dispatch(&se->virtio_dev->dev)) {
> +            fuse_log(FUSE_LOG_ERR, "%s: vu_dispatch failed\n", __func__);
> +            break;
> +        }
>      }
>
>      fuse_log(FUSE_LOG_INFO, "%s: Exit\n", __func__);
> +
> +    return 0;
>  }
>
>  int virtio_session_mount(struct fuse_session *se)
> --
> 2.23.0
>
>


-- 
Marc-André Lureau



reply via email to

[Prev in Thread] Current Thread [Next in Thread]