changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/ffi/uring/uring.lisp

changeset 698: 96958d3eb5b0
parent: 5bd0eb9fa1fa
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
242
37a48c39be02 io_uring factoring
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; uring/uring.lisp --- top-level interface
37a48c39be02 io_uring factoring
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
37a48c39be02 io_uring factoring
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;;
37a48c39be02 io_uring factoring
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
37a48c39be02 io_uring factoring
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
37a48c39be02 io_uring factoring
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :uring)
243
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
7
 
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
8
 (defvar *default-io-entry-count* 256)
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
9
 
243
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
10
 ;; (defconstant +io-syscall-setup+ nr-io-uring-setup) ;425
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
11
 ;; (defconstant +io-syscall-register+ nr-io-uring-register) ;426
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
12
 ;; (defconstant +io-syscall-enter+ nr-io-uring-enter) ;427
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
13
 
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
14
 ;; TODO 2024-04-02: tlab? dynamic-space hacks? there's almost
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
15
 ;; certainly a better way to do this than mmapping regions in
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
16
 ;; package-local structs.
243
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
17
 (defstruct io-memory-map
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
18
   (sq-mmap (make-mmapped-region) :type mmapped-region)
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
19
   (sqe-mmap (make-mmapped-region) :type mmapped-region)
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
20
   (cq-mmap (make-mmapped-region) :type mmapped-region))
243
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
21
 
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
22
 (defun parse-io-uring-params (params)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
23
   "Parse IO-URING-PARAMS foreign struct, return an IO-PARAMS struct."
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
24
   (let ((res 0))
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
25
     (loop while params
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
26
           do (1+ res))
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
27
     res))
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
28
 
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
29
 (defstruct io-params
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
30
   (sq-entries *default-io-entry-count* :type fixnum)
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
31
   (cq-entries *default-io-entry-count* :type fixnum)
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
32
   (flags 0 :type fixnum)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
33
   (sq-thread-cpu 0 :type fixnum)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
34
   (sq-thread-idle 0 :type fixnum)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
35
   (features 0 :type fixnum)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
36
   (wq-fd 0 :type fixnum)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
37
   ;; resv
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
38
   (sq-off (make-submission-queue-offsets) :type submission-queue-offsets) ;; offsets are 40bytes each
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
39
   (cq-off (make-completion-queue-offsets) :type completion-queue-offsets))
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
40
 
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
41
 (defmacro define-io-param-flag (name const)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
42
   "Create a predicate method with NAME which checks for presence of flag
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
43
 CONST in FLAGS slot of IO-PARAMS. A SETF expansion is also defined
245
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
44
 which accepts a boolean value and automatically adjusts the slot."
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
45
   `(progn
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
46
      (defmethod ,name ((self io-params))
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
47
        (not (= 0 (logand (io-params-flags self) ,const))))
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
48
      (defmethod (setf ,name) (val (self io-params))
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
49
        (with-slots (flags) self
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
50
          (setf flags (logior flags ,const))))))
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
51
 
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
52
 (defmacro define-io-param-feature (name const)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
53
   "Create a predicate method with NAME which checks for presence of flag
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
54
 CONST in FEATURES slot of IO-PARAMS. A SETF expansion is also defined
245
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
55
 which accepts a boolean value and automatically adjust the slot."
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
56
   `(progn
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
57
      (defmethod ,name ((self io-params))
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
58
        (not (= 0 (logand (io-params-features self) ,const))))
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
59
      (defmethod (setf ,name) (val (self io-params))
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
60
        (with-slots (features) self
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
61
          (setf features (logior features ,const))))))
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
62
 
245
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
63
 (define-io-param-flag setup-sqpoll-p ioring-setup-sqpoll)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
64
 (define-io-param-flag setup-iopoll-p ioring-setup-iopoll)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
65
 (define-io-param-flag setup-single-issuer-p ioring-setup-single-issuer)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
66
 (define-io-param-feature feat-single-mmap-p ioring-feat-single-mmap)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
67
 (define-io-param-feature feat-nodrop-p ioring-feat-nodrop)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
68
 (define-io-param-feature feat-submit-stable-p ioring-feat-submit-stable)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
69
 (define-io-param-feature feat-rw-cur-pos-p ioring-feat-rw-cur-pos)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
70
 (define-io-param-feature feat-cur-personality-p ioring-feat-cur-personality)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
71
 (define-io-param-feature feat-fast-poll-p ioring-feat-fast-poll)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
72
 (define-io-param-feature feat-poll-32bits-p ioring-feat-poll-32bits)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
73
 (define-io-param-feature feat-sqpoll-nonfixed-p ioring-feat-sqpoll-nonfixed)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
74
 (define-io-param-feature feat-ext-arg-p ioring-feat-ext-arg)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
75
 (define-io-param-feature feat-native-workers-p ioring-feat-native-workers)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
76
 (define-io-param-feature feat-rsrc-tags-p ioring-feat-rsrc-tags)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
77
 (define-io-param-feature feat-cqe-skip-p ioring-feat-cqe-skip)
1b20a166dbe1 params and flags
Richard Westhaver <ellis@rwest.io>
parents: 244
diff changeset
78
 (define-io-param-feature feat-linked-file-p ioring-feat-linked-file)
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
79
 
299
cebda1469eb1 comment out missing macros
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
80
 ;; (defmethod build ((self io-params) &key &allow-other-keys)
cebda1469eb1 comment out missing macros
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
81
 ;;   (with-slots (sq-entries cq-entries flags sq-thread-cpu sq-thread-idle features wq-fd sq-off cq-off) self
cebda1469eb1 comment out missing macros
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
82
 ;;     (with-io-uring-params res ((sq-entries sq-entries) (cq-entries cq-entries) (flags flags)
cebda1469eb1 comment out missing macros
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
83
 ;;                                (sq-thread-cpu sq-thread-cpu) (sq-thread-idle sq-thread-idle) (features features)
cebda1469eb1 comment out missing macros
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
84
 ;;                                (wq-fd wq-fd) (sq-off (deref (build sq-off))) (cq-off (deref (build cq-off))))
cebda1469eb1 comment out missing macros
Richard Westhaver <ellis@rwest.io>
parents: 260
diff changeset
85
 ;;       res)))
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
86
 
243
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
87
 ;; io-uring instance
594
5bd0eb9fa1fa rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents: 299
diff changeset
88
 (defvar *default-io-params* (make-io-params))
5bd0eb9fa1fa rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents: 299
diff changeset
89
 
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
90
 (defstruct uring
243
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
91
   (sq nil :type submission-queue)
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
92
   (cq nil :type completion-queue)
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
93
   (fd -1 :type sb-posix:file-descriptor) ;; owned fd
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
94
   (params *default-io-params* :type io-params)
243
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
95
   (memory nil :type io-memory-map))
c86769bdb3a4 more bindings
Richard Westhaver <ellis@rwest.io>
parents: 242
diff changeset
96
 
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
97
 (defstruct uring-builder
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
98
   (params *default-io-params* :type io-params)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
99
   (dontfork nil :type boolean))
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
100
 
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
101
 (defmethod build ((self uring-builder) &key (entries *default-io-entry-count*))
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
102
   (make-uring :sq (make-submission-queue) :cq (make-completion-queue) :memory (make-io-memory-map)))
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
103
 
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
104
 (defun setup-queue (fd p)
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
105
   "Setup a URING struct given a reference to a FILE-DESCRIPTOR and IO-PARAMS.")
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
106
 
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
107
 (defun make-queue (&optional (entries *default-io-entry-count*))
244
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
108
   "Create a new URING instance with default params. N is the size of the
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
109
 queue, which must be a power of two."
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
110
   (build (make-uring-builder) :entries entries))
f89fb3fbffd6 io obsessed
Richard Westhaver <ellis@rwest.io>
parents: 243
diff changeset
111
 
246
c910f8e1b346 qe builders
Richard Westhaver <ellis@rwest.io>
parents: 245
diff changeset
112
 #+nil (make-queue 2)
260
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
113
 (defmethod build-submitter ((self uring-builder))
b9cd591b9c10 io prims
Richard Westhaver <ellis@rwest.io>
parents: 254
diff changeset
114
   (make-io-submitter))