changeset 250: |
80cf0c525294 |
parent 249: |
d874847c85c5 |
child 251: |
85571b4a3fcc |
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Fri, 29 Mar 2024 21:07:03 -0400 |
files: |
lisp/ffi/uring/constants.lisp lisp/ffi/uring/macs.lisp lisp/ffi/uring/opcode.lisp |
description: |
opcodes |
1.1--- a/lisp/ffi/uring/constants.lisp Fri Mar 29 19:04:17 2024 -0400
1.2+++ b/lisp/ffi/uring/constants.lisp Fri Mar 29 21:07:03 2024 -0400
1.3@@ -59,59 +59,6 @@
1.4 (:integer ioring-setup-defer-taskrun "IORING_SETUP_DEFER_TASKRUN")
1.5 (:integer ioring-setup-no-mmap "IORING_SETUP_NO_MMAP")
1.6 (:integer ioring-setup-registered-fd-only "IORING_SETUP_REGISTERED_FD_ONLY")
1.7- (:enum io-uring-op
1.8- (
1.9- (ioring-op-nop "IORING_OP_NOP")
1.10- (ioring-op-ready "IORING_OP_READV")
1.11- (ioring-op-writev "IORING_OP_WRITEV")
1.12- (ioring-op-fsync "IORING_OP_FSYNC")
1.13- (ioring-op-read-fixed "IORING_OP_READ_FIXED")
1.14- (ioring-op-write-fixed "IORING_OP_WRITE_FIXED")
1.15- (ioring-op-poll-add "IORING_OP_POLL_ADD")
1.16- (ioring-op-poll-remove "IORING_OP_POLL_REMOVE")
1.17- (ioring-op-sync-file-range "IORING_OP_SYNC_FILE_RANGE")
1.18- (ioring-op-sendmsg "IORING_OP_SENDMSG")
1.19- (ioring-op-recvmsg "IORING_OP_RECVMSG")
1.20- (ioring-op-timeout "IORING_OP_TIMEOUT")
1.21- (ioring-op-timeout-remove "IORING_OP_TIMEOUT_REMOVE")
1.22- (ioring-op-accept "IORING_OP_ACCEPT")
1.23- (ioring-op-async-cancel "IORING_OP_ASYNC_CANCEL")
1.24- (ioring-op-link-timeout "IORING_OP_LINK_TIMEOUT")
1.25- (ioring-op-connect "IORING_OP_CONNECT")
1.26- (ioring-op-fallocate "IORING_OP_FALLOCATE")
1.27- (ioring-op-openat "IORING_OP_OPENAT")
1.28- (ioring-op-close "IORING_OP_CLOSE")
1.29- (ioring-op-files-update "IORING_OP_FILES_UPDATE")
1.30- (ioring-op-statx "IORING_OP_STATX")
1.31- (ioring-op-read "IORING_OP_READ")
1.32- (ioring-op-write "IORING_OP_WRITE")
1.33- (ioring-op-fadvise "IORING_OP_FADVISE")
1.34- (ioring-op-madvise "IORING_OP_MADVISE")
1.35- (ioring-op-send "IORING_OP_SEND")
1.36- (ioring-op-recv "IORING_OP_RECV")
1.37- (ioring-op-openat2 "IORING_OP_OPENAT2")
1.38- (ioring-op-epoll-ctl "IORING_OP_EPOLL_CTL")
1.39- (ioring-op-splice "IORING_OP_SPLICE")
1.40- (ioring-op-provide-buffers "IORING_OP_PROVIDE_BUFFERS")
1.41- (ioring-op-remove-buffers "IORING_OP_REMOVE_BUFFERS")
1.42- (ioring-op-tee "IORING_OP_TEE")
1.43- (ioring-op-shutdown "IORING_OP_SHUTDOWN")
1.44- (ioring-op-renameat "IORING_OP_RENAMEAT")
1.45- (ioring-op-unlinkat "IORING_OP_UNLINKAT")
1.46- (ioring-op-mkdirat "IORING_OP_MKDIRAT")
1.47- (ioring-op-symlinkat "IORING_OP_SYMLINKAT")
1.48- (ioring-op-linkat "IORING_OP_LINKAT")
1.49- (ioring-op-msg-ring "IORING_OP_MSG_RING")
1.50- (ioring-op-fsetxattr "IORING_OP_FSETXATTR")
1.51- (ioring-op-setxattr "IORING_OP_SETXATTR")
1.52- (ioring-op-fgetxattr "IORING_OP_FGETXATTR")
1.53- (ioring-op-getxattr "IORING_OP_GETXATTR")
1.54- (ioring-op-socket "IORING_OP_SOCKET")
1.55- (ioring-op-uring-cmd "IORING_OP_URING_CMD")
1.56- (ioring-op-send-zc "IORING_OP_SEND_ZC")
1.57- (ioring-op-sendmsg-zc "IORING_OP_SENDMSG_ZC")
1.58- (ioring-op-last "IORING_OP_LAST"))
1.59- t)
1.60 (:integer ioring-uring-cmd-fixed "IORING_URING_CMD_FIXED")
1.61 (:integer ioring-fsync-datasync "IORING_FSYNC_DATASYNC")
1.62 (:integer ioring-timeout-abs "IORING_TIMEOUT_ABS")
1.63@@ -244,7 +191,7 @@
1.64 (unsigned-char ops-len "__u8" "ops_len")
1.65 ;; (unsigned-short resv "__u16" "resv")
1.66 ;; ((array unsigned-int 3) resv2 "__u32" "resv2[3]")
1.67- ((array (struct io-uring-probe-op)) ops "struct io_uring_probe_op" "ops[1]")))
1.68+ ((array (struct io-uring-probe-op)) ops "struct io_uring_probe_op" "ops[0]" :distrust-length t)))
1.69 (:structure io-uring-buf ("struct io_uring_buf"
1.70 (unsigned-long addr "__u64" "addr")
1.71 (unsigned-int len "__u32" "len")
2.1--- a/lisp/ffi/uring/macs.lisp Fri Mar 29 19:04:17 2024 -0400
2.2+++ b/lisp/ffi/uring/macs.lisp Fri Mar 29 21:07:03 2024 -0400
2.3@@ -12,3 +12,25 @@
2.4
2.5 (defmacro def-with-ring (name &body args)
2.6 `(defalien-int ,name (ring (* (struct io-uring))) ,@args))
2.7+
2.8+(defvar *io-opcodes* nil)
2.9+
2.10+;; io_uring_prep_*
2.11+(defmacro def-io-op (val name slots &body builder)
2.12+ "Define a wrapper for an io-uring opcode. This macro will create a
2.13+structure class with NAME and SLOTS. BUILDER is the body of the BUILD
2.14+method for this struct, with CONST bound to VAR."
2.15+ (let ((struct-name (symbolicate "IO-OP-" name))
2.16+ (const-name (symbolicate "+IO-" name "+"))
2.17+ (alien-name (symbolicate "IORING-OP-" name)))
2.18+ `(progn
2.19+ (defconstant ,const-name ,val)
2.20+ (defstruct ,struct-name ,@slots)
2.21+ (defmethod build ((self ,struct-name) &key &allow-other-keys)
2.22+ ,@builder)
2.23+ (pushnew ',alien-name *io-opcodes*))))
2.24+
2.25+(defmacro def-alien-enum-with (name list)
2.26+ `(define-alien-type ,name
2.27+ (enum ,name
2.28+ ,@(symbol-value list))))
3.1--- a/lisp/ffi/uring/opcode.lisp Fri Mar 29 19:04:17 2024 -0400
3.2+++ b/lisp/ffi/uring/opcode.lisp Fri Mar 29 21:07:03 2024 -0400
3.3@@ -9,12 +9,66 @@
3.4 ;;; Code:
3.5 (in-package :uring)
3.6
3.7-(defmacro def-io-op ((name (var const)) slots &body builder)
3.8- "Define a wrapper for an io-uring opcode. This macro will create a
3.9-structure class with NAME and SLOTS. BUILDER is the body of the BUILD
3.10-method for this struct, with CONST bound to VAR."
3.11- `(progn
3.12- (defstruct ,name ,@slots)
3.13- (defmethod build ((self ,name) &key &allow-other-keys)
3.14- (let ((,var ,const))
3.15- ,@builder))))
3.16+(def-io-op 0 nop nil)
3.17+(def-io-op 1 ready nil)
3.18+(def-io-op 2 writev nil)
3.19+(def-io-op 3 fsync nil)
3.20+(def-io-op 4 read-fixed nil)
3.21+(def-io-op 5 write-fixed nil)
3.22+(def-io-op 6 poll-add nil)
3.23+(def-io-op 7 poll-remove nil)
3.24+(def-io-op 8 sync-file-range nil)
3.25+(def-io-op 9 sendmsg nil)
3.26+(def-io-op 10 recvmsg nil)
3.27+(def-io-op 11 timeout nil)
3.28+(def-io-op 12 timeout-remove nil)
3.29+(def-io-op 13 accept nil)
3.30+(def-io-op 14 async-cancel nil)
3.31+(def-io-op 15 link-timeout nil)
3.32+(def-io-op 16 connect nil)
3.33+(def-io-op 17 fallocate nil)
3.34+(def-io-op 18 openat nil)
3.35+(def-io-op 19 close nil)
3.36+(def-io-op 20 files-update nil)
3.37+(def-io-op 21 statx nil)
3.38+(def-io-op 22 read nil)
3.39+(def-io-op 23 write nil)
3.40+(def-io-op 24 fadvise nil)
3.41+(def-io-op 25 madvise nil)
3.42+(def-io-op 26 send nil)
3.43+(def-io-op 27 recv nil)
3.44+(def-io-op 28 openat2 nil)
3.45+(def-io-op 29 epoll-ctl nil)
3.46+(def-io-op 30 splice nil)
3.47+(def-io-op 31 provide-buffers nil)
3.48+(def-io-op 32 remove-buffers nil)
3.49+(def-io-op 33 tee nil)
3.50+(def-io-op 34 shutdown nil)
3.51+(def-io-op 35 renameat nil)
3.52+(def-io-op 36 unlinkat nil)
3.53+(def-io-op 37 mkdirat nil)
3.54+(def-io-op 38 symlinkat nil)
3.55+(def-io-op 39 msg-ring nil)
3.56+(def-io-op 40 fsetxattr nil)
3.57+(def-io-op 41 setxattr nil)
3.58+(def-io-op 42 fgetxattr nil)
3.59+(def-io-op 43 getxattr nil)
3.60+(def-io-op 44 socket nil)
3.61+(def-io-op 45 uring-cmd nil)
3.62+(def-io-op 46 send-zc nil)
3.63+(def-io-op 47 sendmsg-zc nil)
3.64+(def-io-op 48 last nil)
3.65+
3.66+(def-alien-enum-with io-uring-op *io-opcodes*)
3.67+
3.68+(defun opcode-supported-p (op &optional probe)
3.69+ (declare (type octet op))
3.70+ (let ((p (or probe (io-uring-get-probe))))
3.71+ (if (> op (io-uring-probe-last-op p))
3.72+ nil
3.73+ (/= 0
3.74+ (logand
3.75+ (io-uring-probe-op-flags (addr (deref (io-uring-probe-ops p) op)))
3.76+ io-uring-op-supported)))))
3.77+
3.78+