[PATCH] Avoid reading errno in syscall implementations

Joseph Myers joseph@codesourcery.com
Mon Oct 19 17:04:00 GMT 2015


On Mon, 19 Oct 2015, H.J. Lu wrote:

> Reading errno is expensive for x86 PIC.  With INTERNAL_SYSCALL,
> INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO and
> INLINE_SYSCALL_ERROR_RETURN_VALUE, we can avoid reading errno.

I don't follow how this patch works.  How do you ensure that in the cases 
where there is an error that is not ENOSYS, errno does get set as it would 
have been before?

> -  int res = INLINE_SYSCALL (eventfd2, 2, count, flags);
>  # ifndef __ASSUME_EVENTFD2
> -  if (res != -1 || errno != ENOSYS)
> -# endif
> +  INTERNAL_SYSCALL_DECL (err);
> +  int res = INTERNAL_SYSCALL (eventfd2, err, 2, count, flags);
> +  if (!__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (res, err))
> +      || INTERNAL_SYSCALL_ERRNO (res, err) != ENOSYS)
>      return res;

E.g. this appears to be semantically different from the previous code - 
the previous code would have set errno here from a non-ENOSYS error, and 
the new code wouldn't.

(__ASSUME_EVENTFD2 is always defined except on alpha.  Presumably your "no 
code changes" was because code paths used on x86_64 didn't get changed by 
the patch.)

-- 
Joseph S. Myers
joseph@codesourcery.com



More information about the Libc-alpha mailing list