unix: implement Vmsplice, add SPLICE_F_* constants Fixes golang/go#19125 Change-Id: I822b6f260f980178da29a552c6170cb261c8e254 Reviewed-on: https://go-review.googlesource.com/37152 Run-TryBot: Matt Layher <mdlayher@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/unix/mkerrors.sh b/unix/mkerrors.sh index eec533f..374c052 100755 --- a/unix/mkerrors.sh +++ b/unix/mkerrors.sh
@@ -345,6 +345,7 @@ $2 ~ /^CLOCK_/ || $2 ~ /^CAN_/ || $2 ~ /^ALG_/ || + $2 ~ /^SPLICE_/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} @@ -460,7 +461,7 @@ printf("\t%d: \"%s\",\n", e, buf); } printf("}\n\n"); - + printf("\n\n// Signal table\n"); printf("var signals = [...]string {\n"); qsort(signals, nelem(signals), sizeof signals[0], intcmp);
diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index dc711db..326be81 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go
@@ -1118,6 +1118,25 @@ //sys Mlockall(flags int) (err error) //sys Munlockall() (err error) +// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, +// using the specified flags. +func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { + n, _, errno := Syscall6( + SYS_VMSPLICE, + uintptr(fd), + uintptr(unsafe.Pointer(&iovs[0])), + uintptr(len(iovs)), + uintptr(flags), + 0, + 0, + ) + if errno != 0 { + return 0, syscall.Errno(errno) + } + + return int(n), nil +} + /* * Unimplemented */ @@ -1245,7 +1264,6 @@ // Utimensat // Vfork // Vhangup -// Vmsplice // Vserver // Waitid // _Sysctl
diff --git a/unix/zerrors_linux_386.go b/unix/zerrors_linux_386.go index 4cbae25..5759f79 100644 --- a/unix/zerrors_linux_386.go +++ b/unix/zerrors_linux_386.go
@@ -1305,6 +1305,10 @@ SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_amd64.go b/unix/zerrors_linux_amd64.go index abcb07a..88c6ac6 100644 --- a/unix/zerrors_linux_amd64.go +++ b/unix/zerrors_linux_amd64.go
@@ -1306,6 +1306,10 @@ SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_arm.go b/unix/zerrors_linux_arm.go index 8d6b101..2ee1536 100644 --- a/unix/zerrors_linux_arm.go +++ b/unix/zerrors_linux_arm.go
@@ -1229,6 +1229,10 @@ SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_arm64.go b/unix/zerrors_linux_arm64.go index 750fffc..767b166 100644 --- a/unix/zerrors_linux_arm64.go +++ b/unix/zerrors_linux_arm64.go
@@ -1361,6 +1361,10 @@ SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_mips.go b/unix/zerrors_linux_mips.go index ca0f1dc..677abd1 100644 --- a/unix/zerrors_linux_mips.go +++ b/unix/zerrors_linux_mips.go
@@ -1280,6 +1280,10 @@ SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_mips64.go b/unix/zerrors_linux_mips64.go index 3744707..46dba95 100644 --- a/unix/zerrors_linux_mips64.go +++ b/unix/zerrors_linux_mips64.go
@@ -1376,6 +1376,10 @@ SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_mips64le.go b/unix/zerrors_linux_mips64le.go index acb961b..ee94a6e 100644 --- a/unix/zerrors_linux_mips64le.go +++ b/unix/zerrors_linux_mips64le.go
@@ -1376,6 +1376,10 @@ SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_mipsle.go b/unix/zerrors_linux_mipsle.go index 06e009d..974b375 100644 --- a/unix/zerrors_linux_mipsle.go +++ b/unix/zerrors_linux_mipsle.go
@@ -1451,6 +1451,10 @@ SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_ppc64.go b/unix/zerrors_linux_ppc64.go index 8f9cbdb..ce4607d 100644 --- a/unix/zerrors_linux_ppc64.go +++ b/unix/zerrors_linux_ppc64.go
@@ -1429,6 +1429,10 @@ SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_ppc64le.go b/unix/zerrors_linux_ppc64le.go index 54e8627..729ef75 100644 --- a/unix/zerrors_linux_ppc64le.go +++ b/unix/zerrors_linux_ppc64le.go
@@ -1428,6 +1428,10 @@ SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_s390x.go b/unix/zerrors_linux_s390x.go index 50767f2..68c9ec6 100644 --- a/unix/zerrors_linux_s390x.go +++ b/unix/zerrors_linux_s390x.go
@@ -1483,6 +1483,10 @@ SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000
diff --git a/unix/zerrors_linux_sparc64.go b/unix/zerrors_linux_sparc64.go index a66df2e..4c56e2f 100644 --- a/unix/zerrors_linux_sparc64.go +++ b/unix/zerrors_linux_sparc64.go
@@ -1524,6 +1524,10 @@ SO_TIMESTAMPNS = 0x21 SO_TYPE = 0x1008 SO_WIFI_STATUS = 0x25 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000