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:
parent
8f4508a832
commit
d3eea9e076
5 changed files with 103 additions and 100 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
|
84
examples/read-write/read_write.go
Normal file
84
examples/read-write/read_write.go
Normal 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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -34,7 +34,7 @@ func IOC(dir, typ, nr, siz int) int {
|
|||
}
|
||||
|
||||
/*
|
||||
IO ops
|
||||
IO ops
|
||||
*/
|
||||
|
||||
//go:nosplit
|
||||
|
|
Loading…
Add table
Reference in a new issue