changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / lisp/ffi/ublk/srv.lisp

changeset 687: c2f4e7ee921b
parent: 8e16efedfd76
child: 38e9c3be2392
author: Richard Westhaver <ellis@rwest.io>
date: Mon, 30 Sep 2024 22:27:12 -0400
permissions: -rw-r--r--
description: ffi
1 ;;; ublk/srv.lisp --- ublksrv API
2 
3 ;;
4 
5 ;;; Code:
6 (in-package :ublk)
7 
8 (define-alien-type ublksrv-ctrl-dev (struct ublksrv-ctrl-dev))
9 
10 (define-alien-type ublksrv-queue
11  (struct ublksrv-queue
12  (q-id int)
13  (q-depth int)
14  (ring-ptr (* io-uring))
15  (dev (* ublksrv-dev))
16  (private-data (* t))))
17 
18 (define-alien-type ublk-io-data
19  (struct ublk-io-data
20  (tag int)
21  (pad unsigned-int)
22  (iod (* ublksrv-io-desc))
23  (private-data (* t))))
24 
25 ;; TODO 2024-09-29: add all of these as callbacks :C
26 ;; (define-alien-type ublksrv-tgt-type
27 ;; (struct ublksrv-tgt-type
28 ;; (handle-io-async (function int (* ublksrv-queue) (* ublk-io-data)))
29 ;; (tgt-io-done (function void (* ublksrv-queue) (* ublk-io-data) (* io-uring-cqe)))
30 ;; (handle-event (function void (* ublksrv-queue)))
31 ;; (handle-io-background (function void (* ublksrv-queue) int))
32 ;; (usage-for-add (function void))
33 ;; (init-tgt (function int (* ublksrv-dev) int int (array c-string)))
34 ;; (deinit-tgt (function void (* ublksrv-dev)))
35 ;; (alloc-io-buf (function (* t) (* ublksrv-queue) (* t) int))
36 ;; (idle-fn (function void (* ublksrv-queue) bool))
37 ;; (type int)
38 ;; (ublk-flags unsigned)
39 ;; (ublksrv-flags unsigned)
40 ;; (pad unsigned)
41 ;; (name c-string)
42 ;; (recovery-tgt (function int (* ublksrv-dev) int))
43 ;; (init-queue (function int (* ublksrv-queue) (* (* t))))
44 ;; (deinit-queue (function void (* ublksrv-queue)))
45 ;; (reserved (array unsigned-long 5))))
46 
47 (define-alien-type ublksrv-dev-data
48  (struct ublksrv-dev-data
49  (dev-id int)
50  (max-io-buf-bytes unsigned)
51  (nr-hw-queues unsigned-short)
52  (queue-depth unsigned-short)
53  (tgt-type c-string)
54  (tgt-ops (* ublksrv-tgt-type))
55  (tgt-argc int)
56  (tgt-argv (* (c-string)))
57  (run-dir c-string)
58  (flags unsigned-long)
59  (ublksrv-flags unsigned-long)
60  (reserved (array unsigned-long 7))))
61 
62 (define-alien-type ublksrv-tgt-info
63  (struct ublksrv-tgt-info
64  (dev-size unsigned-long-long)
65  (tgt-ring-depth unsigned-int)
66  (nr-fds unsigned-int)
67  (fds (array int #.+ublksrv-tgt-max-fds+))
68  (tgt-data (* t))
69  (extra-ios unsigned-int)
70  (io-data-size unsigned-int)
71  (ops (* ublksrv-tgt-type))
72  (iowq-max-workers (array unsigned-int 2))
73  (reserved (array unsigned-long 4))))
74 
75 (define-alien-type ublksrv-dev
76  (struct ublksrv-dev
77  (tgt ublksrv-tgt-info)))
78 
79 (define-alien-routine build-user-data (unsigned 64)
80  (tag unsigned)
81  (op unsigned)
82  (tgt-data unsigned)
83  (is-target-io unsigned))
84 
85 (define-alien-routine ublksrv-ctrl-deinit void
86  (dev (* ublksrv-ctrl-dev)))
87 
88 (define-alien-routine ublksrv-ctrl-init (* ublksrv-ctrl-dev)
89  (data (* ublksrv-dev-data)))
90 
91 (define-alien-routine ublksrv-ctrl-get-affinity int
92  (ctrl-dev (* ublksrv-ctrl-dev)))
93 
94 (define-alien-routine ublksrv-ctrl-add-dev int
95  (dev (* ublksrv-ctrl-dev)))
96 
97 (define-alien-routine ublksrv-ctrl-del-dev int
98  (dev (* ublksrv-ctrl-dev)))
99 
100 (define-alien-routine ublksrv-ctrl-get-info int
101  (dev (* ublksrv-ctrl-dev)))
102 
103 (define-alien-routine ublksrv-ctrl-stop-dev int
104  (dev (* ublksrv-ctrl-dev)))
105 
106 (define-alien-routine ublksrv-ctrl-dump void
107  (dev (* ublksrv-ctrl-dev))
108  (buf (* char)))
109 
110 (define-alien-routine ublksrv-ctrl-start-dev int
111  (ctrl-dev (* ublksrv-ctrl-dev))
112  (daemon-pid int))
113 
114 (define-alien-routine ublksrv-ctrl-set-params int
115  (dev (* ublksrv-ctrl-dev))
116  (params (* ublk-params)))
117 
118 (define-alien-routine ublksrv-ctrl-get-params int
119  (dev (* ublksrv-ctrl-dev))
120  (params (* ublk-params)))
121 
122 (define-alien-routine ublksrv-ctrl-start-recovery int
123  (dev (* ublksrv-ctrl-dev)))
124 
125 (define-alien-routine ublksrv-ctrl-end-recovery int
126  (dev (* ublksrv-ctrl-dev))
127  (daemon-pid int))
128 
129 (define-alien-routine ublksrv-ctrl-get-dev-info (* ublksrv-ctrl-dev-info)
130  (dev (* ublksrv-ctrl-dev)))
131 
132 (define-alien-routine ublksrv-ctrl-get-features int
133  (dev (* ublksrv-ctrl-dev))
134  (features (* unsigned-long)))
135 
136 (define-alien-routine ublksrv-ctrl-get-run-dir c-string
137  (dev (* ublksrv-ctrl-dev)))
138 
139 (define-alien-routine ublksrv-ctrl-prep-recovery void
140  (dev (* ublksrv-ctrl-dev))
141  (tgt-type c-string)
142  (tgt-ops (* ublksrv-tgt-type))
143  (recovery-jbuf c-string))
144 
145 (define-alien-routine ublksrv-ctrl-get-recovery-jbuf c-string
146  (dev (* ublksrv-ctrl-dev)))
147 
148 (define-alien-routine ublksrv-is-recovering boolean
149  (ctrl-dev (* ublksrv-ctrl-dev)))
150 
151 (define-alien-routine ublksrv-dev-init (* ublksrv-dev)
152  (ctrl-dev (* ublksrv-ctrl-dev)))
153 
154 (define-alien-routine ublksrv-dev-deinit void
155  (dev (* ublksrv-dev)))
156 
157 (define-alien-routine ublksrv-get-ctrl-dev (* ublksrv-ctrl-dev)
158  (dev (* ublksrv-dev)))
159 
160 (define-alien-routine ublksrv-get-pidfile-fd int
161  (dev (* ublksrv-dev)))
162 
163 (define-alien-routine ublksrv-dev-set-cq-depth void
164  (dev (* ublksrv-dev))
165  (cq-depth int))
166 
167 (define-alien-routine ublksrv-dev-get-cq-depth int
168  (dev (* ublksrv-dev)))
169 
170 (define-alien-routine ublksrv-apply-oom-protection void)
171 
172 (define-alien-type ublksrv-tgt-base-json
173  (struct ublksrv-tgt-base-json
174  (name (array char #.+ublksrv-tgt-name-max-len+))
175  (type int)
176  (pad unsigned-int)
177  (dev-size unsigned-long-long)
178  (reserved (array unsigned-long 8))))
179 
180 (define-alien-routine ublksrv-json-write-dev-info int
181  (dev (* ublksrv-ctrl-dev))
182  (buf (* char))
183  (len int))
184 
185 (define-alien-routine ublksrv-json-read-dev-info int
186  (json-buf (* char))
187  (info (* ublksrv-ctrl-dev-info)))
188 
189 (define-alien-routine ublksrv-json-write-queue-info int
190  (dev (* ublksrv-ctrl-dev))
191  (jbuf (* char))
192  (len int)
193  (qid int)
194  (ubq-daemon-tid int))
195 
196 (define-alien-routine ublksrv-json-read-queue-info int
197  (jbuf (* char))
198  (qid int)
199  (tid (* unsigned))
200  (affinity-buf (* char))
201  (len int))
202 
203 (define-alien-routine ublksrv-json-read-target-info int
204  (jbuf (* char))
205  (tgt-buf (* char))
206  (len int))
207 
208 (define-alien-routine ublksrv-json-read-target-str-info int
209  (jbuf (* char))
210  (len int)
211  (name (* char))
212  (val (* long)))
213 
214 (define-alien-routine ublksrv-json-read-target-ulong-info int
215  (jbuf (* char))
216  (name (* char))
217  (val (* long)))
218 
219 (define-alien-routine ublksrv-json-write-target-str-info int
220  (jbuf (* char))
221  (len int)
222  (name (* char))
223  (val (* char)))
224 
225 (define-alien-routine ublksrv-json-write-target-long-info int
226  (jbuf (* char))
227  (len int)
228  (name (* char))
229  (val long))
230 
231 (define-alien-routine ublksrv-json-write-target-ulong-info int
232  (jbuf (* char))
233  (len int)
234  (name (* char))
235  (val unsigned-long))
236 
237 (define-alien-routine ublksrv-json-dump void
238  (jbuf (* char)))
239 
240 (define-alien-routine ublksrv-json-read-target-base-info int
241  (jbuf (* char))
242  (tgt (* ublksrv-tgt-base-json)))
243 
244 (define-alien-routine ublksrv-json-read-params int
245  (p (* ublk-params))
246  (jbuf (* char)))
247 
248 (define-alien-routine ublksrv-json-write-params int
249  (p (* ublk-params))
250  (jbuf (* char))
251  (len int))
252 
253 (define-alien-routine ublksrv-json-dump-params int
254  (jbuf (* char)))
255 
256 (define-alien-routine ublksrv-json-get-length int (jbuf (* char)))
257 
258 (define-alien-routine ublksrv-io-private-data (* t)
259  (q (* ublksrv-queue))
260  (tag int))
261 
262 (define-alien-routine ublksrv-queue-get-io-data (* ublk-io-data)
263  (q (* ublksrv-queue))
264  (tag int))
265 
266 (define-alien-routine ublksrv-queue-get-io-buf (* t)
267  (q (* ublksrv-queue))
268  (tag int))
269 
270 (define-alien-routine ublksrv-queue-state unsigned-int
271  (q (* ublksrv-queue)))
272 
273 (define-alien-routine ublksrv-queue-init (* ublksrv-queue)
274  (dev (* ublksrv-dev))
275  (d-id unsigned-short)
276  (queue-data (* t)))
277 
278 (define-alien-routine ublksrv-queue-deinit void
279  (q (* ublksrv-queue)))
280 
281 (define-alien-routine ublksrv-queue-unconsumed-cqes int
282  (q (* ublksrv-queue)))
283 
284 (define-alien-routine ublksrv-queue-handled-event int
285  (q (* ublksrv-queue)))
286 
287 (define-alien-routine ublksrv-queue-send-event int
288  (q (* ublksrv-queue)))
289 
290 (define-alien-routine ublksrv-get-queue (* ublksrv-queue)
291  (dev (* ublksrv-dev))
292  (q-id int))
293 
294 (define-alien-routine ublksrv-process-io int
295  (q (* ublksrv-queue)))
296 
297 (define-alien-routine ublksrv-complete-io int
298  (q (* ublksrv-queue))
299  (tag unsigned)
300  (res int))