qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] linux-user: Drop open-coded fcntl flags conversion in eventf


From: Laurent Vivier
Subject: Re: [PATCH] linux-user: Drop open-coded fcntl flags conversion in eventfd2 syscall
Date: Sat, 25 Apr 2020 10:26:54 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0

Le 24/04/2020 à 22:48, Helge Deller a écrit :
> Drop the open-coded fcntl flags conversion in the eventfd2 syscall and
> replace it with the built-in conversion with fcntl_flags_tbl.
> 
> Signed-off-by: Helge Deller <address@hidden>
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 05f03919ff..ebf0d38321 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -11938,13 +11942,7 @@ static abi_long do_syscall1(void *cpu_env, int num, 
> abi_long arg1,
>  #if defined(TARGET_NR_eventfd2)
>      case TARGET_NR_eventfd2:
>      {
> -        int host_flags = arg2 & (~(TARGET_O_NONBLOCK | TARGET_O_CLOEXEC));
> -        if (arg2 & TARGET_O_NONBLOCK) {
> -            host_flags |= O_NONBLOCK;
> -        }
> -        if (arg2 & TARGET_O_CLOEXEC) {
> -            host_flags |= O_CLOEXEC;
> -        }
> +        int host_flags = target_to_host_bitmask(arg2, fcntl_flags_tbl);
>          ret = get_errno(eventfd(arg1, host_flags));
>          if (ret >= 0) {
>              fd_trans_register(ret, &target_eventfd_trans);
> 

The problem here is eventfd2 doesn't take O_ flags but EFD_ flags.
Most EFD_ flags are mapped to O_ flags, but one is not:

include/linux/eventfd.h:

/*
 * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
 * new flags, since they might collide with O_* ones. We want
 * to re-use O_* flags that couldn't possibly have a meaning
 * from eventfd, in order to leave a free define-space for
 * shared O_* flags.
 */
#define EFD_SEMAPHORE (1 << 0)
#define EFD_CLOEXEC O_CLOEXEC
#define EFD_NONBLOCK O_NONBLOCK

So I think it's better to convert them manually

Perhaps we can defined TARGET_EFD_ flags to make this clearer, I don't know.

Thanks,
Laurent



reply via email to

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