changelog shortlog graph tags branches files raw help

Mercurial > core / changeset: prim work on ffi/ublk

changeset 686: 8e16efedfd76
parent 685: ebe3315b7add
child 687: c2f4e7ee921b
author: Richard Westhaver <ellis@rwest.io>
date: Sun, 29 Sep 2024 23:43:03 -0400
files: lisp/ffi/ublk/cmd.lisp lisp/ffi/ublk/pkg.lisp lisp/ffi/ublk/srv.lisp lisp/ffi/ublk/tests.lisp lisp/ffi/ublk/ublk.asd
description: prim work on ffi/ublk
     1.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2+++ b/lisp/ffi/ublk/cmd.lisp	Sun Sep 29 23:43:03 2024 -0400
     1.3@@ -0,0 +1,82 @@
     1.4+;;; cmd.lisp --- Ublk Commands
     1.5+
     1.6+;; 
     1.7+
     1.8+;;; Code:
     1.9+(in-package :ublk)
    1.10+(define-alien-type ublksrv-ctrl-cmd
    1.11+    (struct ublksrv-ctrl-cmd
    1.12+            (dev-id (unsigned 32))
    1.13+            (queue-id (unsigned 16))
    1.14+            (len (unsigned 16))
    1.15+            (addr (unsigned 64))
    1.16+            (data (array (unsigned 64) 1))
    1.17+            (dev-path-len (unsigned 16))
    1.18+            (pad (unsigned 16))
    1.19+            (reserved (unsigned 32))))
    1.20+
    1.21+(define-alien-type ublksrv-ctrl-dev-info
    1.22+    (struct ublksrv-ctrl-dev-info
    1.23+            (nr-hw-queues (unsigned 16))
    1.24+            (queue-depth (unsigned 16))
    1.25+            (state (unsigned 16))
    1.26+            (pad0 (unsigned 16))
    1.27+            (max-io-buf-bytes (unsigned 32))
    1.28+            (dev-id (unsigned 32))
    1.29+            (ublksrv-pid (signed 32))
    1.30+            (pad1 (unsigned 32))
    1.31+            (flags (unsigned 64))
    1.32+            (ublksrv-flags (unsigned 64))
    1.33+            (owner-uid (unsigned 32))
    1.34+            (owner-gid (unsigned 32))
    1.35+            (reserved1 (unsigned 64))
    1.36+            (reserved2 (unsigned 64))))
    1.37+
    1.38+(define-alien-type ublksrv-io-cmd
    1.39+    (struct ublksrv-io-cmd
    1.40+            (q-id (unsigned 16))
    1.41+            (tag (unsigned 16))
    1.42+            (result (signed 32))
    1.43+            (addr (unsigned 64))))
    1.44+
    1.45+(define-alien-type ublksrv-io-desc
    1.46+    (struct ublksrv-io-desc
    1.47+            (op-flags unsigned-int)
    1.48+            (nr-sectors unsigned-int)
    1.49+            (start-sector (unsigned 64))
    1.50+            (addr (unsigned 64))))
    1.51+
    1.52+(define-alien-type ublk-param-basic
    1.53+    (struct ublk-param-basic
    1.54+            (attrs (unsigned 32))
    1.55+            (logical-bs-shift (unsigned 8))
    1.56+            (physical-bs-shift (unsigned 8))
    1.57+            (io-opt-shift (unsigned 8))
    1.58+            (io-min-shift (unsigned 8))
    1.59+            (max-sectors (unsigned 32))
    1.60+            (chunk-sectors (unsigned 32))
    1.61+            (dev-sectors (unsigned 64))
    1.62+            (virt-boundary-mask (unsigned 64))))
    1.63+
    1.64+(define-alien-type ublk-param-discard
    1.65+  (struct ublk-param-discard
    1.66+            (discard-alignment (unsigned 32))
    1.67+            (discard-granularity (unsigned 32))
    1.68+            (max-discard-sectors (unsigned 32))
    1.69+            (max-write-zeroes-sectors (unsigned 32))
    1.70+            (reserved0 (unsigned 16))))
    1.71+
    1.72+(define-alien-type ublk-param-devt
    1.73+    (struct ublk-param-devt
    1.74+            (char-major (unsigned 32))
    1.75+            (char-minor (unsigned 32))
    1.76+            (disk-major (unsigned 32))
    1.77+            (disk-minor (unsigned 32))))
    1.78+
    1.79+(define-alien-type ublk-params
    1.80+    (struct ublk-params
    1.81+            (len (unsigned 32))
    1.82+            (types (unsigned 32))
    1.83+            (basic (struct ublk-param-basic))
    1.84+            (discard (struct ublk-param-discard))
    1.85+            (devt (struct ublk-param-devt))))
     2.1--- a/lisp/ffi/ublk/pkg.lisp	Sun Sep 29 22:44:52 2024 -0400
     2.2+++ b/lisp/ffi/ublk/pkg.lisp	Sun Sep 29 23:43:03 2024 -0400
     2.3@@ -4,81 +4,9 @@
     2.4 
     2.5 ;;; Code:
     2.6 (defpackage :ublk
     2.7-  (:use :cl :std :sb-alien)
     2.8+  (:use :cl :std :sb-alien :uring)
     2.9   (:export ))
    2.10 
    2.11 (in-package :ublk)
    2.12 
    2.13 (define-alien-loader "ublksrv" t)
    2.14-
    2.15-(define-alien-type ublksrv-ctrl-cmd
    2.16-    (struct ublksrv-ctrl-cmd
    2.17-            (dev-id (unsigned 32))
    2.18-            (queue-id (unsigned 16))
    2.19-            (len (unsigned 16))
    2.20-            (addr (unsigned 64))
    2.21-            (data (array (unsigned 64) 1))
    2.22-            (dev-path-len (unsigned 16))
    2.23-            (pad (unsigned 16))
    2.24-            (reserved (unsigned 32))))
    2.25-
    2.26-(define-alien-type ublksrv-ctrl-dev-info
    2.27-    (struct ublksrv-ctrl-dev-info
    2.28-            (nr-hw-queues (unsigned 16))
    2.29-            (queue-depth (unsigned 16))
    2.30-            (state (unsigned 16))
    2.31-            (pad0 (unsigned 16))
    2.32-            (max-io-buf-bytes (unsigned 32))
    2.33-            (dev-id (unsigned 32))
    2.34-            (ublksrv-pid (signed 32))
    2.35-            (pad1 (unsigned 32))
    2.36-            (flags (unsigned 64))
    2.37-            (ublksrv-flags (unsigned 64))
    2.38-            (owner-uid (unsigned 32))
    2.39-            (owner-gid (unsigned 32))
    2.40-            (reserved1 (unsigned 64))
    2.41-            (reserved2 (unsigned 64))))
    2.42-
    2.43-(define-alien-type ublksrv-io-cmd
    2.44-    (struct ublksrv-io-cmd
    2.45-            (q-id (unsigned 16))
    2.46-            (tag (unsigned 16))
    2.47-            (result (signed 32))
    2.48-            (addr (unsigned 64))))
    2.49-
    2.50-(define-alien-type ublk-param-basic
    2.51-    (struct ublk-param-basic
    2.52-            (attrs (unsigned 32))
    2.53-            (logical-bs-shift (unsigned 8))
    2.54-            (physical-bs-shift (unsigned 8))
    2.55-            (io-opt-shift (unsigned 8))
    2.56-            (io-min-shift (unsigned 8))
    2.57-            (max-sectors (unsigned 32))
    2.58-            (chunk-sectors (unsigned 32))
    2.59-            (dev-sectors (unsigned 64))
    2.60-            (virt-boundary-mask (unsigned 64))))
    2.61-
    2.62-(define-alien-type ublk-param-discard
    2.63-  (struct ublk-param-discard
    2.64-            (discard-alignment (unsigned 32))
    2.65-            (discard-granularity (unsigned 32))
    2.66-            (max-discard-sectors (unsigned 32))
    2.67-            (max-write-zeroes-sectors (unsigned 32))
    2.68-            (reserved0 (unsigned 16))))
    2.69-
    2.70-(define-alien-type ublk-param-devt
    2.71-    (struct ublk-param-devt
    2.72-            (char-major (unsigned 32))
    2.73-            (char-minor (unsigned 32))
    2.74-            (disk-major (unsigned 32))
    2.75-            (disk-minor (unsigned 32))))
    2.76-
    2.77-(define-alien-type ublk-params
    2.78-    (struct ublk-params
    2.79-            (len (unsigned 32))
    2.80-            (types (unsigned 32))
    2.81-            (basic (struct ublk-param-basic))
    2.82-            (discard (struct ublk-param-discard))
    2.83-            (devt (struct ublk-param-devt))))
    2.84-
    2.85-;; (define-alien-type ublksrv-dev-data)
     3.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2+++ b/lisp/ffi/ublk/srv.lisp	Sun Sep 29 23:43:03 2024 -0400
     3.3@@ -0,0 +1,86 @@
     3.4+;;; ublk/srv.lisp --- ublksrv API
     3.5+
     3.6+;; 
     3.7+
     3.8+;;; Code:
     3.9+(in-package :ublk)
    3.10+
    3.11+(define-alien-type ublksrv-ctrl-dev (struct ublksrv-ctrl-dev))
    3.12+
    3.13+(define-alien-type ublksrv-queue
    3.14+    (struct ublksrv-queue
    3.15+            (q-id int)
    3.16+            (q-depth int)
    3.17+            (ring-ptr (* io-uring))
    3.18+            (dev (* ublksrv-dev))
    3.19+            (private-data (* t))))
    3.20+
    3.21+(define-alien-type ublk-io-data
    3.22+  (struct ublk-io-data
    3.23+          (tag int)
    3.24+          (pad unsigned-int)
    3.25+          (iod (* ublksrv-io-desc))
    3.26+          (private-data (* t))))
    3.27+
    3.28+;; TODO 2024-09-29: add all of these as callbacks :C
    3.29+;; (define-alien-type ublksrv-tgt-type 
    3.30+;;   (struct ublksrv-tgt-type
    3.31+;;           (handle-io-async (function int (* ublksrv-queue) (* ublk-io-data)))
    3.32+;;           (tgt-io-done (function void (* ublksrv-queue) (* ublk-io-data) (* io-uring-cqe)))
    3.33+;;           (handle-event (function void (* ublksrv-queue)))
    3.34+;;           (handle-io-background (function void (* ublksrv-queue) int))
    3.35+;;           (usage-for-add (function void))
    3.36+;;           (init-tgt (function int (* ublksrv-dev) int int (array c-string)))
    3.37+;;           (deinit-tgt (function void (* ublksrv-dev)))
    3.38+;;           (alloc-io-buf (function (* t) (* ublksrv-queue) (* t) int))
    3.39+;;           (idle-fn (function void (* ublksrv-queue) bool))
    3.40+;;           (type int)
    3.41+;;           (ublk-flags unsigned)
    3.42+;;           (ublksrv-flags unsigned)
    3.43+;;           (pad unsigned)
    3.44+;;           (name c-string)
    3.45+;;           (recovery-tgt (function int (* ublksrv-dev) int))
    3.46+;;           (init-queue (function int (* ublksrv-queue) (* (* t))))
    3.47+;;           (deinit-queue (function void (* ublksrv-queue)))
    3.48+;;           (reserved (array unsigned-long 5))))
    3.49+
    3.50+(define-alien-type ublksrv-dev-data
    3.51+  (struct ublksrv-dev-data
    3.52+          (dev-id int)
    3.53+          (max-io-buf-bytes unsigned)
    3.54+          (nr-hw-queues unsigned-short)
    3.55+          (queue-depth unsigned-short)
    3.56+          (tgt-type c-string)
    3.57+          (tgt-ops (* ublksrv-tgt-type))
    3.58+          (tgt-argc int)
    3.59+          (tgt-argv (* (c-string)))
    3.60+          (run-dir c-string)
    3.61+          (flags unsigned-long)
    3.62+          (ublksrv-flags unsigned-long)
    3.63+          (reserved (array unsigned-long 7))))
    3.64+
    3.65+(define-alien-type ublksrv-tgt-info
    3.66+  (struct ublksrv-tgt-info
    3.67+          (dev-size unsigned-long-long)
    3.68+          (tgt-ring-depth unsigned-int)
    3.69+          (nr-fds unsigned-int)
    3.70+          (fds (array int #.+ublksrv-tgt-max-fds+))
    3.71+          (tgt-data (* t))
    3.72+          (extra-ios unsigned-int)
    3.73+          (io-data-size unsigned-int)
    3.74+          (ops (* ublksrv-tgt-type))
    3.75+          (iowq-max-workers (array unsigned-int 2))
    3.76+          (reserved (array unsigned-long 4))))
    3.77+
    3.78+(define-alien-type ublksrv-dev
    3.79+  (struct ublksrv-dev
    3.80+          (tgt ublksrv-tgt-info)))
    3.81+
    3.82+(define-alien-routine build-user-data (unsigned 64)
    3.83+  (tag unsigned)
    3.84+  (op unsigned)
    3.85+  (tgt-data unsigned)
    3.86+  (is-target-io unsigned))
    3.87+
    3.88+(define-alien-routine ublksrv-ctrl-deinit void
    3.89+  (dev (* ublksrv-ctrl-dev)))
     4.1--- a/lisp/ffi/ublk/tests.lisp	Sun Sep 29 22:44:52 2024 -0400
     4.2+++ b/lisp/ffi/ublk/tests.lisp	Sun Sep 29 23:43:03 2024 -0400
     4.3@@ -10,3 +10,5 @@
     4.4 (in-suite :ublk)
     4.5 
     4.6 (load-ublksrv)
     4.7+
     4.8+(deftest sanity ())
     5.1--- a/lisp/ffi/ublk/ublk.asd	Sun Sep 29 22:44:52 2024 -0400
     5.2+++ b/lisp/ffi/ublk/ublk.asd	Sun Sep 29 23:43:03 2024 -0400
     5.3@@ -15,7 +15,9 @@
     5.4   :in-order-to ((test-op (test-op "ublk/tests")))
     5.5   :components ((:file "pkg")
     5.6                (grovel-constants-file "constants"
     5.7-                                      :package :ublk))
     5.8+                                      :package :ublk)
     5.9+               (:file "cmd")
    5.10+               (:file "srv"))
    5.11   :perform (test-op (op c) (uiop:symbol-call '#:rt '#:do-tests :ublk)))
    5.12 
    5.13 (defsystem "ublk/tests"