qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 2/2] [RESENT-INLINE] Remove unnecessary CONFIG_E


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH 2/2] [RESENT-INLINE] Remove unnecessary CONFIG_EVENTFD preprocessor conditional to satisfy link
Date: Tue, 03 May 2016 08:59:55 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Christopher Friedt <address@hidden> writes:

> The file ivshmem.c unconditionally references event_notifier_init_fd() in 
> util/event_notifier-posix.c, even if CONFIG_EVENTFD is not defined. On 
> platforms where CONFIG_POSIX is defined, but CONFIG_EVENTFD is not defined, 
> that results in an undefined symbol referenced from ivshmem.c and the link 
> fails. That applies to Mac OS X, but possibly other BSD-based distros.

ivshmem.c cannot work without CONFIG_EVENTFD, and therefore is not
compiled without it.

A link error for event_notifier_init_fd() from ivshmem.o indicates you
got CONFIG_EVENTFD=y for make (since ivshmem.o gets linked), but
!defined(CONFIG_EVENTFD) for C (or else event_notifier_init_fd() would
exist).  Your build tree is messed up, or the makefiles are broken.  Try
starting over with a fresh build tree.

See also
http://lists.nongnu.org/archive/html/qemu-devel/2016-04/msg01437.html

> Note: there is nothing specific to eventfd inside and event_notifier_init() 
> also fails unconditionally if CONFIG_EVENTFD is not defined.

I'm afraid you're misreading the code.

event_notifier_init() has a working fallback: if the host doesn't
support eventfd (!defined(CONFIG_EVENTFD) or eventfd() fails with
ENOSYS), then we emulate eventfd with a pair of pipes.  Possible only
because pipes have special properties.

To support the emulation, we have two file descriptors, @rfd for reading
and @wfd for writing.  Design invariant: if they are the same file
descriptor, it must be a proper eventfd, and if they are different, they
must be a pair of pipes.  The only way to establish the invariant with
event_notifier_init_fd() is passing it an eventfd, as the function's
contract says.  Without CONFIG_EVENTFD, there is no way to use the
function correctly, so defining it would be nothing but a trap.

See also commit 330b583, which added the ifdef.

> Signed-off-by: Christopher Friedt <address@hidden>
> ---
>  util/event_notifier-posix.c | 2 --
>  1 file changed, 2 deletions(-)
>
> diff --git a/util/event_notifier-posix.c b/util/event_notifier-posix.c
> index c1f0d79..c9bb34d 100644
> --- a/util/event_notifier-posix.c
> +++ b/util/event_notifier-posix.c
> @@ -21,7 +21,6 @@
>  #include <sys/eventfd.h>
>  #endif
>  
> -#ifdef CONFIG_EVENTFD
>  /*
>   * Initialize @e with existing file descriptor @fd.
>   * @fd must be a genuine eventfd object, emulation with pipe won't do.
> @@ -31,7 +30,6 @@ void event_notifier_init_fd(EventNotifier *e, int fd)
>      e->rfd = fd;
>      e->wfd = fd;
>  }
> -#endif
>  
>  int event_notifier_init(EventNotifier *e, int active)
>  {

NAK



reply via email to

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