lkml.org 
[lkml]   [2006]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: vmsplice can't work well
On Tue, Aug 29 2006, Yi Yang wrote:
> Hi, Jens
>
> I try to trace vmsplice and find it can't work in both ppc64 and i386,
> it always return -EFAULT because of the address of iovec.iov_base no
> matter it is page alignment or not, I don't know if I should file a
> bug for it, do you test it on i386 or ppc64?

Please provide an strace of the problem, it works fine for me (on x86-64
and x86, I've previously also tested ppc64 and ia64). Also please see
the splice tools here for more examples:

http://brick.kernel.dk/snaps/splice-git-20060711102502.tar.gz

I patched your program to fix the x86-64 syscall number and one/two
bugs, diff attached. Output for me:

axboe@nelson:/home/axboe $ ./f | cat > /dev/null
getpagesize = 4096
page size: 4096 bytes
written len = 4096

--- f.c~ 2006-08-29 16:02:21.000000000 +0200
+++ f.c 2006-08-29 16:04:41.000000000 +0200
@@ -22,7 +22,7 @@
#elif defined(__x86_64__)
#define __NR_splice 275
#define __NR_tee 276
-#define __NR_vmsplice 277
+#define __NR_vmsplice 278
#elif defined(__powerpc__) || defined(__powerpc64__)
#define __NR_splice 283
#define __NR_tee 284
@@ -71,23 +71,26 @@
v.iov_base = buffer;
v.iov_len = len;

- while (len) {
+ while (v.iov_len) {
/*
* in a real app you'd be more clever with poll of course,
* here we are basically just blocking on output room and
* not using the free time for anything interesting.
*/
if (poll(&pfd, 1, -1) < 0)
- return xerror("poll");
+ return xerror("poll");

written = vmsplice(fd, &v, 1, 0);
printf("here: len = %d, written = %d\n", len, written);

- if (written <= 0)
+ if (!written)
+ break;
+ else if (written < 0)
return xerror("vmsplice");
fprintf(stderr, "written len = %d\n", written);

- len -= written;
+ v.iov_len -= written;
+ v.iov_base += written;
}

return 0;
@@ -98,7 +101,7 @@
unsigned char *buffer;
struct stat sb;
long page_size;
- int i, ret;
+ int i;

if (fstat(STDOUT_FILENO, &sb) < 0)
return xerror("stat");
@@ -112,7 +115,7 @@
return xerror("_SC_PAGESIZE");

fprintf(stderr, "getpagesize = %d\n", getpagesize());
- fprintf(stderr, "page size: %d bytes\n", page_size);
+ fprintf(stderr, "page size: %d bytes\n", (int) page_size);

buffer = malloc(2 * 65536);
buffer[0]='A';
--
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-08-29 16:05    [W:7.249 / U:0.032 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site