This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Consolidate Linux readahead() implementations


On Fri, Sep 23, 2016 at 10:32:35AM -0300, Adhemerval Zanella wrote:
> 
> 
> On 23/09/2016 09:44, Yury Norov wrote:
> > On Fri, Sep 23, 2016 at 08:08:19AM +0200, Florian Weimer wrote:
> >> * Yury Norov:
> >>
> >>> On Thu, Sep 22, 2016 at 06:36:22PM -0300, Adhemerval Zanella wrote:
> >>>> Hi Yury, some comments below.
> >>>>
> >>>> On 22/09/2016 17:44, Yury Norov wrote:
> >>>> I think we can use SYSCALL_LL64 plus __ALIGNMENT_ARG here.  The tricky is to pass
> >>>> the correct argument size, since it used by the macro to select the correct 
> >>>> arch-dependent one.  This is exactly why I proposed the patch to add
> >>>> {INTERNAL,INLINE}_SYSCALL_CALL [1], readahead will be simplified to just:
> >>>>
> >>>> ssize_t
> >>>> __readahead (int fd, off64_t offset, size_t count)
> >>>> {
> >>>>   return INLINE_SYSCALL_CALL (readahead, fd,
> >>>> 			      __ALIGNMENT_ARG SYSCALL_LL64 (offset));
> >>>> }
> >>>>
> >>>> I suggest you to wait the {INTERNAL,INLINE}_SYSCALL_CALL patch to land and
> >>>> based this one on it.  I think I addressed most of Florian comments, I just
> >>>> need to check if assembly generated using the new macros is the same as
> >>>> before (which I expect to).
> >>>>
> >>>> [1] https://sourceware.org/ml/libc-alpha/2016-09/msg00452.html
> >>>
> >>> __ALIGNMENT_ARG is controlled by __ASSUME_ALIGNED_REGISTER_PAIRS,
> >>> as well as __ALIGNMENT_COUNT(). Currently we have 4 ports that
> >>> enable it: mips, arm, powerpc and tile. Mips and arm pass 5 arguments,
> >>> so __ASSUME_ALIGNED_REGISTER_PAIRS is what they need. Powerpc uses
> >>> syscalls.list (thanks for pointing it), and so is not affected by this
> >>> change. But tile is still in case. Is my understanding correct that it
> >>> uses linux/readahead.c as implementation? If so, this patch will break
> >>> tile ABI. That's why I introduced new option.
> >>>
> >>> So, as for me we cannot use __ASSUME_ALIGNED_REGISTER_PAIRS because of
> >>> tile. Is it correct?
> >>
> >> Does readahead even work on tile today?  Maybe it's already broken and
> >> this change fixes it. :)
> >>
> >> Chris?
> > 
> > In kernel 32-bit tile expects 4 arguments:
> > 
> > arch/tile/kernel/sys.c:
> > 61 #if !defined(__tilegx__) || defined(CONFIG_COMPAT)
> > 62 
> > 63 #ifdef __BIG_ENDIAN
> > 64 #define SYSCALL_PAIR(name) u32 name ## _hi, u32 name ## _lo
> > 65 #else
> > 66 #define SYSCALL_PAIR(name) u32 name ## _lo, u32 name ## _hi
> > 67 #endif
> > 68 
> > 69 ssize_t sys32_readahead(int fd, SYSCALL_PAIR(offset), u32 count)
> > 70 {
> > 71         return sys_readahead(fd, ((loff_t)offset_hi << 32) | offset_lo, count);
> > 72 }
> > 73 
> > 74 int sys32_fadvise64_64(int fd, SYSCALL_PAIR(offset),
> > 75                        SYSCALL_PAIR(len), int advice)
> > 76 {
> > 77         return sys_fadvise64_64(fd, ((loff_t)offset_hi << 32) | offset_lo,
> > 78                                 ((loff_t)len_hi << 32) | len_lo, advice);
> > 79 }
> > 80 
> > 81 #endif /* 32-bit syscall wrappers */
> >  
> > So it seems we have no chance to consolidate getdents() completely w/o
> > new option. If no objections, I'll send v2 with removing getdents from
> > powerpc syscalls.list, and rework new option in more suitable way.
> > Objections?
> > 
> > Yury.
> > 
> 
> Indeed, unfortunately tile seems to get its own readahead definition.
> However I think it should not prevent us to use my previous strategy,
> we can follow the SH example for pread (where it adds a dummy argument
> before offset), and do something as:
> 
> sysdeps/unix/sysv/linux/tile/readahead.c
> 
> #include <sysdep.h>
> 
> #ifndef _LP64
> /* Although tile 32-bit ABI passed 64-bit arguments in even registers,
>    readahead interface does not follow this convention.  */
> # undef __ALIGNMENT_ARG
> #endif
> 
> #include <sysdeps/unix/sysv/linux/readhead.c>

Currently it looks like this to me (see below). If you think that separated file
is better than new option - I'm OK with it, but I think it's strange because in
other patches of series you introduce options (if I'm not mistake).

We also have 2 another implementations - in linux/wordsize-64/syscalls.list
and linux/mips/mips64/n32/syscalls.list.

I think wordsize-64 is safe to generalize, but I'm worry about mips64. If we'll
choose adding new options and so having a single file, it seems, we'll have to
add another option for mips64/n32, like this:

#if __ASSUME_READAHEAD_NO_PAIRS
# define SYSCALL_LL64(val) (val)
#endif

If we choose 3 implementations, we can introduce no option, but have
generic, tile and mips separated versions.

Yury.

--
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
index 71ce57a..ba7d745 100644
--- a/sysdeps/unix/sysv/linux/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
@@ -50,6 +50,11 @@
 #define __ASSUME_ST_INO_64_BIT		1
 #endif
 
+#ifndef __ASSUME_READAHEAD_ALIGN
+/* readahead() adds padding to registers if this control is enabled.  */
+# define __ASSUME_READAHEAD_ALIGN	1
+#endif
+
 /* The statfs64 syscalls are available in 2.5.74 (but not for alpha).  */
 #define __ASSUME_STATFS64	1
 
diff --git a/sysdeps/unix/sysv/linux/readahead.c b/sysdeps/unix/sysv/linux/readahead.c
index 92e5428..eea3142 100644
--- a/sysdeps/unix/sysv/linux/readahead.c
+++ b/sysdeps/unix/sysv/linux/readahead.c
@@ -23,16 +23,20 @@
 #include <sysdep.h>
 #include <sys/syscall.h>
 
+#include <kernel-features.h>
 
 #ifdef __NR_readahead
 
+#if !__ASSUME_READAHEAD_ALIGN
+# undef __ALIGNMENT_ARG
+# define __ALIGNMENT_ARG
+#endif
+
 ssize_t
 __readahead (int fd, off64_t offset, size_t count)
 {
-  return INLINE_SYSCALL (readahead, 4, fd,
-			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					   (off_t) (offset & 0xffffffff)),
-			 count);
+  return INLINE_SYSCALL_CALL (readahead, fd, __ALIGNMENT_ARG
+			      SYSCALL_LL64 (offset));
 }
 #else
 ssize_t
diff --git a/sysdeps/unix/sysv/linux/tile/kernel-features.h b/sysdeps/unix/sysv/linux/tile/kernel-features.h
index ded0e43..15ad2d3 100644
--- a/sysdeps/unix/sysv/linux/tile/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/tile/kernel-features.h
@@ -24,4 +24,5 @@
 #ifndef _LP64
 # define __ASSUME_ALIGNED_REGISTER_PAIRS	1
 # define __ASSUME_FADVISE64_64_NO_ALIGN		1
+# define __ASSUME_READAHEAD_ALIGN		0
 #endif
-- 
2.7.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]