[PATCH] powerpc: wire up preadv and pwritev

Subrata Modak tosubrata at gmail.com
Tue Apr 7 16:51:18 EST 2009


Hi Stephen,

On Tue, Apr 7, 2009 at 8:49 AM, Stephen Rothwell <sfr at canb.auug.org.au>wrote:

>
> Signed-off-by: Stephen Rothwell <sfr at canb.auug.org.au>
> ---
>  arch/powerpc/include/asm/systbl.h |    2 ++
>  arch/powerpc/include/asm/unistd.h |    4 +++-
>  2 files changed, 5 insertions(+), 1 deletions(-)
>
> Tested on pseries_defconfig (verified using strace{,64} and inspecting
> the files).  Test program (modified from the original because the API and
> ABI changed and I added a test with larger offsets):
>
> #if 0
> set -x
> gcc -Wall -O2 -m32 -o preadv $0
> gcc -Wall -O2 -m32 -D_FILE_OFFSET_BITS=64 -DLARGE_TEST -o preadv32 $0
> gcc -Wall -O2 -m64 -DLARGE_TEST -o preadv64 $0
> ./preadv
> ./preadv32
> ./preadv64
> exit 0
> #endif
> /*
>  * preadv demo / test
>  *
>  * (c) 2008 Gerd Hoffmann <kraxel at redhat.com>
>  * Modified for new ABI and large offset test by Stephen Rothwell
>  *
>  * build with "sh $thisfile"
>  */
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <errno.h>
> #include <inttypes.h>
> #include <sys/uio.h>
>
> /* ----------------------------------------------------------------- */
> /* syscall windup                                                    */
>
> #include <sys/syscall.h>
> #if 1
> /* WARNING: Be sure you know what you are doing if you enable this.
>  * linux syscall code isn't upstream yet, syscall numbers are subject
>  * to change */
> # ifndef __NR_preadv
> #  ifdef __i386__
> #   define __NR_preadv  333
> #   define __NR_pwritev 334
> #  endif
> #  ifdef __x86_64__
> #   define __NR_preadv  295
> #   define __NR_pwritev 296
> #  endif
> #  ifdef __powerpc__
> #   define __NR_preadv  319
> #   define __NR_pwritev 320
> #  endif
> # endif
> #endif
> #ifndef __NR_preadv
> # error preadv/pwritev syscall numbers are unknown
> #endif
>
> #define HALF_BITS (sizeof(unsigned long)*4)
>
> static ssize_t preadv(int fd, const struct iovec *iov, int iovcnt,
>                      off_t offset)
> {
>        return syscall(__NR_preadv, fd, iov, iovcnt,
>                       (unsigned long)offset,
>                       (unsigned long)((offset >> HALF_BITS) >> HALF_BITS));
> }
>
> static ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,
>                       off_t offset)
> {
>        return syscall(__NR_pwritev, fd, iov, iovcnt,
>                       (unsigned long)offset,
>                       (unsigned long)((offset >> HALF_BITS) >> HALF_BITS));
> }
>
> /* ----------------------------------------------------------------- */
> /* demo/test app                                                     */
>
> static char filename[] = "/tmp/preadv-XXXXXX";
> static char outbuf[11] = "0123456789";
> static char inbuf[11]  = "----------";
>
> static struct iovec ovec[2] = {{
>                .iov_base = outbuf + 5,
>                .iov_len  = 5,
>        },{
>                .iov_base = outbuf + 0,
>                .iov_len  = 5,
>        }};
>
> static struct iovec ivec[3] = {{
>                .iov_base = inbuf + 6,
>                .iov_len  = 2,
>        },{
>                .iov_base = inbuf + 4,
>                .iov_len  = 2,
>        },{
>                .iov_base = inbuf + 2,
>                .iov_len  = 2,
>        }};
>
> void cleanup(void)
> {
>        unlink(filename);
> }
>
> int main(int argc, char **argv)
> {
>        int fd, rc;
>
>        fd = mkstemp(filename);
>        if (-1 == fd) {
>                perror("mkstemp");
>                exit(1);
>        }
>        atexit(cleanup);
>
>        /* write to file: "56789-01234" */
>        rc = pwritev(fd, ovec, 2, 0);
>        if (rc < 0) {
>                perror("pwritev");
>                exit(1);
>        }
>
>        /* read from file: "78-90-12" */
>        rc = preadv(fd, ivec, 3, 2);
>        if (rc < 0) {
>                perror("preadv");
>                exit(1);
>        }
>
>        printf("result  : %s\n", inbuf);
>        printf("expected: %s\n", "--129078--");
>
> #ifdef LARGE_TEST
>
>        /* write to file: "56789-01234" */
>        rc = pwritev(fd, ovec, 2, 0x300000000ULL);
>        if (rc < 0) {
>                perror("pwritev");
>                exit(1);
>        }
>
>        /* read from file: "78-90-12" */
>        rc = preadv(fd, ivec, 3, 0x300000000ULL + 2);
>        if (rc < 0) {
>                perror("preadv");
>                exit(1);
>        }
>
>        printf("result  : %s\n", inbuf);
>        printf("expected: %s\n", "--129078--");
>
> #endif
>
>        exit(0);
> }
>

How about contributing the above test to LTP(http://ltp.sourceforge.net/)
under GPL ? If you agree, i would soon send you a Patch integrating the same
to LTP.

Regards--
Subrata


>
> diff --git a/arch/powerpc/include/asm/systbl.h
> b/arch/powerpc/include/asm/systbl.h
> index fe16649..3fb6d9e 100644
> --- a/arch/powerpc/include/asm/systbl.h
> +++ b/arch/powerpc/include/asm/systbl.h
> @@ -322,3 +322,5 @@ SYSCALL_SPU(epoll_create1)
>  SYSCALL_SPU(dup3)
>  SYSCALL_SPU(pipe2)
>  SYSCALL(inotify_init1)
> +COMPAT_SYS_SPU(preadv)
> +COMPAT_SYS_SPU(pwritev)
> diff --git a/arch/powerpc/include/asm/unistd.h
> b/arch/powerpc/include/asm/unistd.h
> index e07d0c7..7e03ebe 100644
> --- a/arch/powerpc/include/asm/unistd.h
> +++ b/arch/powerpc/include/asm/unistd.h
> @@ -341,10 +341,12 @@
>  #define __NR_dup3              316
>  #define __NR_pipe2             317
>  #define __NR_inotify_init1     318
> +#define __NR_preadv            319
> +#define __NR_pwritev           320
>
>  #ifdef __KERNEL__
>
> -#define __NR_syscalls          319
> +#define __NR_syscalls          321
>
>  #define __NR__exit __NR_exit
>  #define NR_syscalls    __NR_syscalls
> --
> 1.6.2.1
>
> --
> Cheers,
> Stephen Rothwell                    sfr at canb.auug.org.au
> http://www.canb.auug.org.au/~sfr/ <http://www.canb.auug.org.au/%7Esfr/>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>



-- 
Regards & Thanks--
Subrata
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20090407/5ce24d92/attachment.htm>


More information about the Linuxppc-dev mailing list