Subject: Re: [PATCH v2] Add preadv and pwritev system calls.
Date: Friday 12th December 2008 15:29:29 UTC (over 8 years ago)
On Fri, Dec 12, 2008 at 03:00:40PM +0100, Gerd Hoffmann wrote: > The patch sports the actual system call implementation and the windup in > the x86 system call tables. Other archs are TBD. > +asmlinkage ssize_t sys_preadv(unsigned long fd, const struct iovec __user *vec, > + unsigned long vlen, loff_t pos) > +asmlinkage ssize_t sys_pwritev(unsigned long fd, const struct iovec __user *vec, > + unsigned long vlen, loff_t pos) Are these prototypes required? MIPS and PARISC will need wrappers to fix them if they are. These two architectures have an ABI which requires 64-bit arguments to be passed in aligned pairs of registers, but glibc doesn't know that (and given the existence of syscall(3), can't do much about it even if it knew), so some of the arguments end up in the wrong registers. Things will go much better if we can prototype these as: asmlinkage ssize_t sys_preadv(unsigned int fd, const struct iovec __user *vec, loff_t pos, unsigned long vlen); asmlinkage ssize_t sys_pwritev(unsigned int fd, const struct iovec __user *vec, loff_t pos, unsigned long vlen); That way 'pos' ends up split between arg2 and arg3 and vlen ends up in arg4 instead of having vlen in arg2 and pos in arg3 and arg4 which then have to be munged to be in arg4 and arg5 by a compat wrapper. I seem to recall the s390 folks having some concerns with this kind of thing too, but I forget what they are, so I'll let them weigh in on this. By the way, why did you make 'fd' an unsigned long? The rest of the kernel uses unsigned int. -- Matthew Wilcox Intel Open Source Technology Centre "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step."