Coverage report: /home/ellis/comp/core/ffi/ublk/srv.lisp

KindCoveredAll%
expression0120 0.0
branch00nil
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
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-enum (ublk-f unsigned)
11
   :support-zero-copy +ublk-f-support-zero-copy+
12
   :uring-cmd-comp-in-task +ublk-f-uring-cmd-comp-in-task+
13
   :need-get-date +ublk-f-need-get-data+
14
   :user-recovery +ublk-f-user-recovery+
15
   :user-recover-reissue +ublk-f-user-recovery-reissue+
16
   :unprivileged-dev +ublk-f-unprivileged-dev+
17
   :cmd-ioctl-encode +ublk-f-cmd-ioctl-encode+
18
   :user-copy +ublk-f-user-copy+)
19
 
20
 (define-alien-enum (ublksrv-f unsigned)
21
   :need-eventfd +ublksrv-f-need-eventfd+)
22
 
23
 (define-alien-enum (ublk-s-dev unsigned)
24
   :dead +ublk-s-dev-dead+
25
   :live +ublk-s-dev-live+
26
   :quiesced +ublk-s-dev-quiesced+)
27
 
28
 (define-alien-enum (ublk-io-op unsigned)
29
   :read +ublk-io-op-read+
30
   :write +ublk-io-op-write+
31
   :flush +ublk-io-op-flush+
32
   :discard +ublk-io-op-discard+
33
   :write-same +ublk-io-op-write-same+
34
   :write-zeroes +ublk-io-op-write-zeroes+)
35
 
36
 (define-alien-enum (ublk-io-f unsigned)
37
   :failfast-dev +ublk-io-f-failfast-dev+
38
   :failfast-transport +ublk-io-f-failfast-transport+
39
   :failfast-driver +ublk-io-f-failfast-driver+
40
   :meta +ublk-io-f-meta+
41
   :fua +ublk-io-f-fua+
42
   :nounmap +ublk-io-f-nounmap+
43
   :swap +ublk-io-f-swap+)
44
 
45
 (define-alien-enum (ublk-attr unsigned)
46
   :read-only +ublk-attr-read-only+
47
   :rotational +ublk-attr-rotational+
48
   :volatile-cache +ublk-attr-volatile-cache+
49
   :fua +ublk-attr-fua+)
50
 
51
 (define-alien-enum (ublk-io-res unsigned)
52
   :ok +ublk-io-res-ok+
53
   :need-get-data +ublk-io-res-need-get-data+
54
   :abort +ublk-io-res-abort+)
55
 
56
 ;; early def
57
 (define-alien-type ublksrv-tgt-info
58
   (struct ublksrv-tgt-info
59
           (dev-size unsigned-long-long)
60
           (tgt-ring-depth unsigned-int)
61
           (nr-fds unsigned-int)
62
           (fds (array int #.+ublksrv-tgt-max-fds+))
63
           (tgt-data (* t))
64
           (extra-ios unsigned-int)
65
           (io-data-size unsigned-int)
66
           (ops (* (struct nil)))
67
           (iowq-max-workers (array unsigned-int 2))
68
           (reserved (array unsigned-long 4))))
69
 
70
 (define-alien-type ublksrv-dev
71
   (struct ublksrv-dev
72
           (tgt ublksrv-tgt-info)))
73
 
74
 (define-alien-type ublksrv-queue
75
     (struct ublksrv-queue
76
             (q-id int)
77
             (q-depth int)
78
             (ring-ptr (* io-uring))
79
             (dev (* ublksrv-dev))
80
             (private-data (* t))))
81
 
82
 (std:eval-always
83
   (define-alien-type ublk-io-data
84
       (struct ublk-io-data
85
               (tag int)
86
               (pad unsigned-int)
87
               (iod (* ublksrv-io-desc))
88
               (private-data (* t))))
89
   (define-alien-type ublksrv-handle-io-async-function (function int (* ublksrv-queue) (* ublk-io-data)))
90
   (define-alien-type ublksrv-tgt-io-done-function (function void (* ublksrv-queue) (* ublk-io-data) (* io-uring-cqe)))
91
   (define-alien-type ublksrv-handle-event-function (function void (* ublksrv-queue)))
92
   (define-alien-type ublksrv-handle-io-background-function (function void (* ublksrv-queue) int))
93
   (define-alien-type ublksrv-usage-for-add-function (function void))
94
   (define-alien-type ublksrv-init-tgt-function (function int (* ublksrv-dev) int int (array c-string)))
95
   (define-alien-type ublksrv-deinit-tgt-function (function void (* ublksrv-dev)))
96
   (define-alien-type ublksrv-alloc-io-buf-function (function (* t) (* ublksrv-queue) (* t) int))
97
   (define-alien-type ublksrv-idle-function (function void (* ublksrv-queue) boolean))
98
   (define-alien-type ublksrv-recovery-tgt-function (function int (* ublksrv-dev) int))
99
   (define-alien-type ublksrv-init-queue-function (function int (* ublksrv-dev) (* (* t))))
100
   (define-alien-type ublksrv-deinit-queue-function (function void (* ublksrv-queue)))
101
   (define-alien-type ublksrv-tgt-type 
102
       (struct ublksrv-tgt-type
103
               (handle-io-async (* ublksrv-handle-io-async-function))
104
               (tgt-io-done (* ublksrv-tgt-io-done-function))
105
               (handle-event (* ublksrv-handle-event-function))
106
               (handle-io-background (* ublksrv-handle-io-background-function))
107
               (usage-for-add (* ublksrv-usage-for-add-function))
108
               (init-tgt (* ublksrv-init-tgt-function))
109
               (deinit-tgt (* ublksrv-deinit-tgt-function))
110
               (alloc-io-buf (* ublksrv-alloc-io-buf-function))
111
               (idle-fn (* ublksrv-idle-function))
112
               (type int)
113
               (ublk-flags unsigned)
114
               (ublksrv-flags unsigned)
115
               (pad unsigned)
116
               (name c-string)
117
               (recovery-tgt (* ublksrv-recovery-tgt-function))
118
               (init-queue (* ublksrv-init-queue-function))
119
               (deinit-queue (* ublksrv-deinit-queue-function))
120
               (reserved (array unsigned-long 5)))))
121
 
122
 (define-alien-type ublksrv-dev-data
123
   (struct ublksrv-dev-data
124
           (dev-id int)
125
           (max-io-buf-bytes unsigned)
126
           (nr-hw-queues unsigned-short)
127
           (queue-depth unsigned-short)
128
           (tgt-type c-string)
129
           (tgt-ops (* (struct ublksrv-tgt-type)))
130
           (tgt-argc int)
131
           (tgt-argv (* (c-string)))
132
           (run-dir c-string)
133
           (flags unsigned-long)
134
           (ublksrv-flags unsigned-long)
135
           (reserved (array unsigned-long 7))))
136
 
137
 (defun make-ublksrv-dev-data (dev-id &key (max-io-buf-bytes (floor +max-buf-size+ 4))
138
                                      (nr-hw-queues (floor +max-nr-hw-queues+ 4))
139
                                      (queue-depth (floor +max-qd+ 4))
140
                                      (type "loop")
141
                                      ops
142
                                      args
143
                                      (dir (namestring *default-pathname-defaults*))
144
                                      (flags 0)
145
                                      (ublksrv-flags 0))
146
     (let ((dat (make-alien ublksrv-dev-data)))
147
       (setf (slot dat 'dev-id) dev-id
148
             (slot dat 'max-io-buf-bytes) max-io-buf-bytes
149
             (slot dat 'nr-hw-queues) nr-hw-queues
150
             (slot dat 'queue-depth) queue-depth
151
             (slot dat 'tgt-type) type
152
             (slot dat 'tgt-ops) ops
153
             (slot dat 'tgt-argc) (length args)
154
             (slot dat 'tgt-argv) (clone-strings args t)
155
             (slot dat 'run-dir) (make-alien-string dir)
156
             (slot dat 'flags) flags
157
             (slot dat 'ublksrv-flags) ublksrv-flags)
158
       dat))
159
 
160
 (defar build-user-data (unsigned 64)
161
   (tag unsigned)
162
   (op unsigned)
163
   (tgt-data unsigned)
164
   (is-target-io unsigned))
165
 
166
 (defar ublksrv-ctrl-deinit void
167
   (dev (* ublksrv-ctrl-dev)))
168
 
169
 (defar ublksrv-ctrl-init (* ublksrv-ctrl-dev)
170
   (data (* ublksrv-dev-data)))
171
 
172
 (defar ublksrv-ctrl-get-affinity int
173
   (ctrl-dev (* ublksrv-ctrl-dev)))
174
 
175
 (defar ublksrv-ctrl-add-dev int
176
   (dev (* ublksrv-ctrl-dev)))
177
 
178
 (defar ublksrv-ctrl-del-dev int
179
   (dev (* ublksrv-ctrl-dev)))
180
 
181
 (defar ublksrv-ctrl-get-info int
182
   (dev (* ublksrv-ctrl-dev)))
183
 
184
 (defar ublksrv-ctrl-stop-dev int
185
   (dev (* ublksrv-ctrl-dev)))
186
 
187
 (defar ublksrv-ctrl-dump void
188
   (dev (* ublksrv-ctrl-dev))
189
   (buf (* char)))
190
 
191
 (defar ublksrv-ctrl-start-dev int
192
   (ctrl-dev (* ublksrv-ctrl-dev))
193
   (daemon-pid int))
194
 
195
 (defar ublksrv-ctrl-set-params int
196
   (dev (* ublksrv-ctrl-dev))
197
   (params (* ublk-params)))
198
 
199
 (defar ublksrv-ctrl-get-params int
200
   (dev (* ublksrv-ctrl-dev))
201
   (params (* ublk-params)))
202
 
203
 (defar ublksrv-ctrl-start-recovery int
204
   (dev (* ublksrv-ctrl-dev)))
205
 
206
 (defar ublksrv-ctrl-end-recovery int
207
   (dev (* ublksrv-ctrl-dev))
208
   (daemon-pid int))
209
 
210
 (defar ublksrv-ctrl-get-dev-info (* ublksrv-ctrl-dev-info)
211
   (dev (* ublksrv-ctrl-dev)))
212
   
213
 (defar ublksrv-ctrl-get-features int
214
   (dev (* ublksrv-ctrl-dev))
215
   (features (* unsigned-long)))
216
 
217
 (defar ublksrv-ctrl-get-run-dir c-string
218
   (dev (* ublksrv-ctrl-dev)))
219
 
220
 (defar ublksrv-ctrl-prep-recovery void
221
   (dev (* ublksrv-ctrl-dev))
222
   (tgt-type c-string)
223
   (tgt-ops (* (struct ublksrv-tgt-type)))
224
   (recovery-jbuf c-string))
225
 
226
 (defar ublksrv-ctrl-get-recovery-jbuf c-string
227
   (dev (* ublksrv-ctrl-dev)))
228
 
229
 (defar ublksrv-is-recovering boolean
230
   (ctrl-dev (* ublksrv-ctrl-dev)))
231
 
232
 (defar ublksrv-dev-init (* ublksrv-dev)
233
   (ctrl-dev (* ublksrv-ctrl-dev)))
234
 
235
 (defar ublksrv-dev-deinit void
236
   (dev (* ublksrv-dev)))
237
 
238
 (defar ublksrv-get-ctrl-dev (* ublksrv-ctrl-dev)
239
   (dev (* ublksrv-dev)))
240
 
241
 (defar ublksrv-get-pidfile-fd int
242
   (dev (* ublksrv-dev)))
243
 
244
 (defar ublksrv-dev-set-cq-depth void
245
   (dev (* ublksrv-dev))
246
   (cq-depth int))
247
 
248
 (defar ublksrv-dev-get-cq-depth int
249
   (dev (* ublksrv-dev)))
250
 
251
 (defar ublksrv-apply-oom-protection void)
252
 
253
 (define-alien-type ublksrv-tgt-base-json
254
   (struct ublksrv-tgt-base-json
255
           (name (array char #.+ublksrv-tgt-name-max-len+))
256
           (type int)
257
           (pad unsigned-int)
258
           (dev-size unsigned-long-long)
259
           (reserved (array unsigned-long 8))))
260
 
261
 (defar ublksrv-json-write-dev-info int
262
   (dev (* ublksrv-ctrl-dev))
263
   (buf (* char))
264
   (len int))
265
 
266
 (defar ublksrv-json-read-dev-info int
267
   (json-buf (* char))
268
   (info (* ublksrv-ctrl-dev-info)))
269
 
270
 (defar ublksrv-json-write-queue-info int
271
   (dev (* ublksrv-ctrl-dev))
272
   (jbuf (* char))
273
   (len int)
274
   (qid int)
275
   (ubq-daemon-tid int))
276
 
277
 (defar ublksrv-json-read-queue-info int
278
   (jbuf (* char))
279
   (qid int)
280
   (tid (* unsigned))
281
   (affinity-buf (* char))
282
   (len int))
283
 
284
 (defar ublksrv-json-read-target-info int
285
   (jbuf (* char))
286
   (tgt-buf (* char))
287
   (len int))
288
 
289
 (defar ublksrv-json-read-target-str-info int
290
   (jbuf (* char))
291
   (len int)
292
   (name (* char))
293
   (val (* long)))
294
 
295
 (defar ublksrv-json-read-target-ulong-info int
296
   (jbuf (* char))
297
   (name (* char))
298
   (val (* long)))
299
 
300
 (defar ublksrv-json-write-target-str-info int
301
   (jbuf (* char))
302
   (len int)
303
   (name (* char))
304
   (val (* char)))
305
 
306
 (defar ublksrv-json-write-target-long-info int
307
   (jbuf (* char))
308
   (len int)
309
   (name (* char))
310
   (val long))
311
 
312
 (defar ublksrv-json-write-target-ulong-info int
313
   (jbuf (* char))
314
   (len int)
315
   (name (* char))
316
   (val unsigned-long))
317
 
318
 (defar ublksrv-json-dump void
319
   (jbuf (* char)))
320
 
321
 (defar ublksrv-json-read-target-base-info int
322
   (jbuf (* char))
323
   (tgt (* ublksrv-tgt-base-json)))
324
 
325
 (defar ublksrv-json-read-params int
326
   (p (* ublk-params))
327
   (jbuf (* char)))
328
 
329
 (defar ublksrv-json-write-params int
330
   (p (* ublk-params))
331
   (jbuf (* char))
332
   (len int))
333
 
334
 (defar ublksrv-json-dump-params int
335
   (jbuf (* char)))
336
 
337
 (defar ublksrv-json-get-length int (jbuf (* char)))
338
 
339
 (defar ublksrv-io-private-data (* t)
340
   (q (* ublksrv-queue))
341
   (tag int))
342
 
343
 (defar ublksrv-queue-get-io-data (* ublk-io-data)
344
   (q (* ublksrv-queue))
345
   (tag int))
346
 
347
 (defar ublksrv-queue-get-io-buf (* t)
348
   (q (* ublksrv-queue))
349
   (tag int))
350
 
351
 (defar ublksrv-queue-state unsigned-int
352
   (q (* ublksrv-queue)))
353
 
354
 (defar ublksrv-queue-init (* ublksrv-queue)
355
   (dev (* ublksrv-dev))
356
   (d-id unsigned-short)
357
   (queue-data (* t)))
358
 
359
 (defar ublksrv-queue-deinit void
360
   (q (* ublksrv-queue)))
361
 
362
 (defar ublksrv-queue-unconsumed-cqes int
363
   (q (* ublksrv-queue)))
364
 
365
 (defar ublksrv-queue-handled-event int
366
   (q (* ublksrv-queue)))
367
 
368
 (defar ublksrv-queue-send-event int
369
   (q (* ublksrv-queue)))
370
 
371
 (defar ublksrv-get-queue (* ublksrv-queue)
372
   (dev (* ublksrv-dev))
373
   (q-id int))
374
 
375
 (defar ublksrv-process-io int
376
   (q (* ublksrv-queue)))
377
 
378
 (defar ublksrv-complete-io int
379
   (q (* ublksrv-queue))
380
   (tag unsigned)
381
   (res int))