Hi Maxime,

> On Apr 9, 2024, at 19:48, Maxime Coquelin <maxime.coque...@redhat.com> wrote:
> 
> External email: Use caution opening links or attachments
> 
> 
> This patch heavily reworks fdset initialization:
> - fdsets are now dynamically allocated by the FD manager
> - the event dispatcher is now created by the FD manager
> - struct fdset is now opaque to VDUSE and Vhost
> 
> Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
> ---
> lib/vhost/fd_man.c | 177 ++++++++++++++++++++++++++++++++++++++++-----
> lib/vhost/fd_man.h |  39 +---------
> lib/vhost/socket.c |  24 ++----
> lib/vhost/vduse.c  |  29 ++------
> 4 files changed, 177 insertions(+), 92 deletions(-)
> 
> diff --git a/lib/vhost/fd_man.c b/lib/vhost/fd_man.c
> index 0ae481b785..8b47c97d45 100644
> --- a/lib/vhost/fd_man.c
> +++ b/lib/vhost/fd_man.c
> @@ -3,12 +3,16 @@
>  */
> 
> #include <errno.h>
> +#include <pthread.h>
> #include <stdio.h>
> #include <string.h>
> #include <unistd.h>
> 
> #include <rte_common.h>
> #include <rte_log.h>
> +#include <rte_malloc.h>
> +#include <rte_string_fns.h>
> +#include <rte_thread.h>
> 
> #include "fd_man.h"
> 
> @@ -19,6 +23,79 @@ RTE_LOG_REGISTER_SUFFIX(vhost_fdset_logtype, fdset, INFO);
> 
> #define FDPOLLERR (POLLERR | POLLHUP | POLLNVAL)
> 
> +struct fdentry {
> +       int fd;         /* -1 indicates this entry is empty */
> +       fd_cb rcb;      /* callback when this fd is readable. */
> +       fd_cb wcb;      /* callback when this fd is writeable.*/
> +       void *dat;      /* fd context */
> +       int busy;       /* whether this entry is being used in cb. */
> +};
> +
> +struct fdset {
> +       char name[RTE_THREAD_NAME_SIZE];
> +       struct pollfd rwfds[MAX_FDS];
> +       struct fdentry fd[MAX_FDS];
> +       rte_thread_t tid;
> +       pthread_mutex_t fd_mutex;
> +       pthread_mutex_t fd_polling_mutex;
> +       int num;        /* current fd number of this fdset */
> +
> +       union pipefds {
> +               struct {
> +                       int pipefd[2];
> +               };
> +               struct {
> +                       int readfd;
> +                       int writefd;
> +               };
> +       } u;
> +
> +       pthread_mutex_t sync_mutex;
> +       pthread_cond_t sync_cond;
> +       bool sync;
> +       bool destroy;
> +};
> +
> +static int fdset_add_no_sync(struct fdset *pfdset, int fd, fd_cb rcb, fd_cb 
> wcb, void *dat);
> +static uint32_t fdset_event_dispatch(void *arg);
> +
> +#define MAX_FDSETS 8
> +
> +static struct fdset *fdsets[MAX_FDSETS];
> +pthread_mutex_t fdsets_mutex = PTHREAD_MUTEX_INITIALIZER;

Static pthread_mutex_t ?

Thanks,
Chenbo

Reply via email to