1
0
Fork 0
mirror of https://github.com/ii64/gouring.git synced 2025-04-26 05:42:48 +02:00

chore: adjust read-write, nvme example

This commit is contained in:
Xeffy Chen 2023-04-16 15:55:19 +07:00
parent 8f4508a832
commit d3eea9e076
Signed by: Xeffy
GPG key ID: E41C08AD390E7C49
5 changed files with 103 additions and 100 deletions
examples
ioctl

View file

@ -10,6 +10,12 @@ import (
"golang.org/x/sys/unix"
)
// NOTICE NOTICE NOTICE NOTICE NOTICE
//
// This example is performing **READ** access to NVMe via low-level control device.
//
// NOTICE NOTICE NOTICE NOTICE NOTICE
var (
// hardcoded device path
// devicePath = "/dev/nvme0n1"
@ -78,10 +84,13 @@ func DoIoUring(devPath string) error {
}
defer unix.Close(fd)
var buf [0x1000]byte
var bufs [10][0x1000]byte
var sqe *uring.IoUringSqe
sqe = ring.GetSqe()
sqe := ring.GetSqe()
uring.PrepRead(sqe, fd, &buf[0], len(buf), 0)
buf := bufs[1]
bufSz := len(buf)
uring.PrepRead(sqe, fd, &buf[0], bufSz, 0)
sqe.SetCmdOp(uint32(nvme.NVME_URING_CMD_IO()))
sqe.Opcode = uring.IORING_OP_URING_CMD
@ -104,8 +113,8 @@ func DoIoUring(devPath string) error {
Nsid: nsid,
Addr: uint64(uintptr(unsafe.Pointer(&buf))),
DataLen: uint32(len(buf)),
Addr: uint64(uintptr(unsafe.Pointer(&buf[0]))),
DataLen: uint32(bufSz),
}
cmdPtr := (*nvme.NvmeUringCmd)(sqe.GetCmd())
*cmdPtr = cmd // copy
@ -119,15 +128,17 @@ func DoIoUring(devPath string) error {
fmt.Println("submitted", submitted)
var cqe *uring.IoUringCqe
// for i := 0; i < 2; i++ {
if err := ring.WaitCqe(&cqe); err != nil {
return err
}
ring.SeenCqe(cqe)
fmt.Printf("CQE:\t%+#v\n", cqe)
cqeExtra := (*[2]uint64)(cqe.GetBigCqe())
fmt.Printf("CQE Extra:\t%+#v\n", cqeExtra)
fmt.Printf("Buffer: %+#v\n", buf)
fmt.Printf("=========\n")
ring.SeenCqe(cqe)
// }
return nil
}

View file

@ -0,0 +1,84 @@
package main
import (
"bytes"
"fmt"
"log"
"syscall"
uring "github.com/ii64/gouring"
"golang.org/x/sys/unix"
)
func main() {
ring, err := uring.New(256, 0)
if err != nil {
log.Fatal(err)
}
defer ring.Close()
fd, err := unix.Open("/tmp/test", unix.O_RDWR|unix.O_CREAT, 0677)
if err != nil {
panic(err)
}
sqe := ring.GetSqe()
b := []byte("hello from io_uring!\n")
uring.PrepWrite(sqe, fd, &b[0], len(b), 0)
sqe.UserData.SetUint64(0x0001)
sqe.Flags |= uring.IOSQE_IO_LINK
sqe = ring.GetSqe()
uring.PrepWrite(sqe, syscall.Stdout, &b[0], len(b), 0)
sqe.UserData.SetUint64(0x0002)
sqe.Flags |= uring.IOSQE_IO_LINK
sqe = ring.GetSqe()
var buf = make([]byte, len(b))
uring.PrepRead(sqe, fd, &buf[0], len(buf), 0)
sqe.UserData.SetUint64(0x0003)
sqe.Flags |= uring.IOSQE_IO_LINK
sqe = ring.GetSqe()
uring.PrepClose(sqe, fd)
sqe.UserData.SetUint64(0x0004)
const N = 4
submitted, err := ring.SubmitAndWait(N)
if err != nil { /*...*/
log.Fatal(err)
}
println(submitted) // 1
var cqe *uring.IoUringCqe
for i := 1; i <= N; i++ {
err = ring.WaitCqe(&cqe)
if err != nil {
log.Fatal(err)
} // check also EINTR
if cqe == nil {
log.Fatal("CQE is NULL!")
}
log.Printf("CQE: %+#v\n", cqe)
if uring.UserData(i) != cqe.UserData {
panic("UNORDERED")
}
if cqe.Res < 0 {
panic(syscall.Errno(-cqe.Res))
}
if i == 0x0003 {
retvb := buf[:cqe.Res]
fmt.Printf("retv buf %+#v\n", retvb)
if !bytes.Equal(b, retvb) {
panic("RET BUF NOT EQ")
}
}
ring.SeenCqe(cqe)
}
_ = cqe.UserData
_ = cqe.Res
_ = cqe.Flags
}

View file

@ -1,48 +0,0 @@
package main
import (
"log"
"github.com/ii64/gouring"
"golang.org/x/sys/unix"
)
func main() {
h, err := gouring.New(256, 0)
if err != nil {
log.Fatal(err)
}
defer h.Close()
fd, err := unix.Open("/tmp/test", unix.O_RDWR, 0677)
sqe := h.GetSqe()
b := make([]byte, 20)
gouring.PrepRead(sqe, fd, &b[0], len(b), 0)
log.Println("Buffer: ", b)
submitted, err := h.SubmitAndWait(1)
if err != nil {
log.Fatal(err)
}
println(submitted) // 1
var cqe *gouring.IoUringCqe
err = h.WaitCqe(&cqe)
if err != nil {
log.Fatal(err)
} // check also EINTR
if cqe == nil {
log.Fatal("CQE is NULL!")
}
h.SeenCqe(cqe)
log.Println("CQE: ", cqe)
log.Println("Buffer: ", b)
log.Println("Buffer: ", string(b))
_ = cqe.UserData
_ = cqe.Res
_ = cqe.Flags
}

View file

@ -1,44 +0,0 @@
package main
import (
"log"
"github.com/ii64/gouring"
"golang.org/x/sys/unix"
)
func main() {
h, err := gouring.New(256, 0)
if err != nil {
log.Fatal(err)
}
defer h.Close()
fd, err := unix.Open("/tmp/test", unix.O_RDWR, 0677)
sqe := h.GetSqe()
b := []byte("hello from io_uring!\n")
gouring.PrepWrite(sqe, fd, &b[0], len(b), 0)
submitted, err := h.SubmitAndWait(1)
if err != nil { /*...*/
log.Fatal(err)
}
println(submitted) // 1
var cqe *gouring.IoUringCqe
err = h.WaitCqe(&cqe)
if err != nil {
log.Fatal(err)
} // check also EINTR
if cqe == nil {
log.Fatal("CQE is NULL!")
}
log.Println(cqe)
h.SeenCqe(cqe)
_ = cqe.UserData
_ = cqe.Res
_ = cqe.Flags
}

View file

@ -34,7 +34,7 @@ func IOC(dir, typ, nr, siz int) int {
}
/*
IO ops
IO ops
*/
//go:nosplit