Go io uring syscall implementation without CGO, rewrite on branch v0.4
Find a file
Nugraha 50fd85fabc
feat(syscall): add madvise, epollctl
Signed-off-by: Nugraha <26342994+ii64@users.noreply.github.com>
2022-02-10 02:16:53 +07:00
assets docs: add graph difference sqpoll 2022-01-26 01:16:08 +07:00
queue fix(perf): direct field access 2022-01-26 01:21:13 +07:00
syscall feat(syscall): add madvise, epollctl 2022-02-10 02:16:53 +07:00
const_value.go feat(opcode): new opcode on Linux 5.16rc 2022-01-24 15:19:14 +07:00
core.go feat: ring with options 2022-02-10 00:53:05 +07:00
core_test.go fix(perf): direct field access 2022-01-26 01:20:07 +07:00
go.mod feat(): initail files 2021-12-20 18:35:33 +07:00
go.sum feat(): initail files 2021-12-20 18:35:33 +07:00
LICENSE feat(docs): update readme, added license 2021-12-22 00:32:32 +07:00
mem_util.go chore: clean prints 2022-02-10 01:48:41 +07:00
options.go feat: ring with options 2022-02-10 00:53:05 +07:00
README.md chore: add readme link, comment 2022-02-09 20:00:10 +07:00
ring.go fix(perf): direct field access 2022-01-26 01:20:07 +07:00
ring_entry.go chore: add readme link, comment 2022-02-09 20:00:10 +07:00
sigset.go feat(): initail files 2021-12-20 18:35:33 +07:00
sysnum.go feat(opcode): new opcode on Linux 5.16rc 2022-01-24 15:19:14 +07:00

gouring

License: MIT Go Reference

Low-level io uring library

go get github.com/ii64/gouring

Example

import "github.com/ii64/gouring"
import "github.com/ii64/gouring/queue"

// io_uring_setup
ring, err := gouring.New(256, nil) // default io uring setup param
if err != nil {
    // ...
}
defer ring.Close() // munmap shared memory, cleanup
var (
    ret int
    err error
)

// io_uring_register
ret, err = ring.Register(gouring.IORING_REGISTER_BUFFERS, addr, nrArg)

// io_uring_enter
ret, err = ring.Enter(toSubmit, minComplete, gouring.IORING_ENTER_GETEVENTS, nil)

// setup param
params := ring.Params()

// ring fd
fd := ring.Fd()

// Submission Queue
sq := ring.SQ()

// Completion Queue
cq := ring.CQ()

/* Using queue package */
q := queue.New(ring)
go func() {
    q.Run(func(cqe *gouring.CQEntry) {
        // cqe processing
        _ = cqe.UserData
        _ = cqe.Res
        _ = cqe.Flags
    })
}()

// buffer
data := []byte("print on stdout\n")

// get sqe
sqe := q.GetSQEntry()
sqe.UserData = 0 // identifier / event id
sqe.Opcode = gouring.IORING_OP_WRITE // op write
sqe.Fd = int32(syscall.Stdout) // fd 1
sqe.Len = uint32(len(data)) // buffer size
sqe.SetOffset(0) // fd offset
sqe.SetAddr(&data[0]) // buffer addr

// submit sqe
submitted, err := q.Submit()
if err != nil {
    // ...
}

Graph

Check out test script here

SQPOLLnon-SQPOLL

graph sqpoll

graph non sqpoll

Referece

github.com/iceber/iouring-go