# HG changeset patch # User Richard Westhaver # Date 1727667783 14400 # Node ID 8e16efedfd765ab76c4103753e20cf0f27fb8bde # Parent ebe3315b7add2cbd854c829906f7f2ce1d063fd1 prim work on ffi/ublk diff -r ebe3315b7add -r 8e16efedfd76 lisp/ffi/ublk/cmd.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/ffi/ublk/cmd.lisp Sun Sep 29 23:43:03 2024 -0400 @@ -0,0 +1,82 @@ +;;; cmd.lisp --- Ublk Commands + +;; + +;;; Code: +(in-package :ublk) +(define-alien-type ublksrv-ctrl-cmd + (struct ublksrv-ctrl-cmd + (dev-id (unsigned 32)) + (queue-id (unsigned 16)) + (len (unsigned 16)) + (addr (unsigned 64)) + (data (array (unsigned 64) 1)) + (dev-path-len (unsigned 16)) + (pad (unsigned 16)) + (reserved (unsigned 32)))) + +(define-alien-type ublksrv-ctrl-dev-info + (struct ublksrv-ctrl-dev-info + (nr-hw-queues (unsigned 16)) + (queue-depth (unsigned 16)) + (state (unsigned 16)) + (pad0 (unsigned 16)) + (max-io-buf-bytes (unsigned 32)) + (dev-id (unsigned 32)) + (ublksrv-pid (signed 32)) + (pad1 (unsigned 32)) + (flags (unsigned 64)) + (ublksrv-flags (unsigned 64)) + (owner-uid (unsigned 32)) + (owner-gid (unsigned 32)) + (reserved1 (unsigned 64)) + (reserved2 (unsigned 64)))) + +(define-alien-type ublksrv-io-cmd + (struct ublksrv-io-cmd + (q-id (unsigned 16)) + (tag (unsigned 16)) + (result (signed 32)) + (addr (unsigned 64)))) + +(define-alien-type ublksrv-io-desc + (struct ublksrv-io-desc + (op-flags unsigned-int) + (nr-sectors unsigned-int) + (start-sector (unsigned 64)) + (addr (unsigned 64)))) + +(define-alien-type ublk-param-basic + (struct ublk-param-basic + (attrs (unsigned 32)) + (logical-bs-shift (unsigned 8)) + (physical-bs-shift (unsigned 8)) + (io-opt-shift (unsigned 8)) + (io-min-shift (unsigned 8)) + (max-sectors (unsigned 32)) + (chunk-sectors (unsigned 32)) + (dev-sectors (unsigned 64)) + (virt-boundary-mask (unsigned 64)))) + +(define-alien-type ublk-param-discard + (struct ublk-param-discard + (discard-alignment (unsigned 32)) + (discard-granularity (unsigned 32)) + (max-discard-sectors (unsigned 32)) + (max-write-zeroes-sectors (unsigned 32)) + (reserved0 (unsigned 16)))) + +(define-alien-type ublk-param-devt + (struct ublk-param-devt + (char-major (unsigned 32)) + (char-minor (unsigned 32)) + (disk-major (unsigned 32)) + (disk-minor (unsigned 32)))) + +(define-alien-type ublk-params + (struct ublk-params + (len (unsigned 32)) + (types (unsigned 32)) + (basic (struct ublk-param-basic)) + (discard (struct ublk-param-discard)) + (devt (struct ublk-param-devt)))) diff -r ebe3315b7add -r 8e16efedfd76 lisp/ffi/ublk/pkg.lisp --- a/lisp/ffi/ublk/pkg.lisp Sun Sep 29 22:44:52 2024 -0400 +++ b/lisp/ffi/ublk/pkg.lisp Sun Sep 29 23:43:03 2024 -0400 @@ -4,81 +4,9 @@ ;;; Code: (defpackage :ublk - (:use :cl :std :sb-alien) + (:use :cl :std :sb-alien :uring) (:export )) (in-package :ublk) (define-alien-loader "ublksrv" t) - -(define-alien-type ublksrv-ctrl-cmd - (struct ublksrv-ctrl-cmd - (dev-id (unsigned 32)) - (queue-id (unsigned 16)) - (len (unsigned 16)) - (addr (unsigned 64)) - (data (array (unsigned 64) 1)) - (dev-path-len (unsigned 16)) - (pad (unsigned 16)) - (reserved (unsigned 32)))) - -(define-alien-type ublksrv-ctrl-dev-info - (struct ublksrv-ctrl-dev-info - (nr-hw-queues (unsigned 16)) - (queue-depth (unsigned 16)) - (state (unsigned 16)) - (pad0 (unsigned 16)) - (max-io-buf-bytes (unsigned 32)) - (dev-id (unsigned 32)) - (ublksrv-pid (signed 32)) - (pad1 (unsigned 32)) - (flags (unsigned 64)) - (ublksrv-flags (unsigned 64)) - (owner-uid (unsigned 32)) - (owner-gid (unsigned 32)) - (reserved1 (unsigned 64)) - (reserved2 (unsigned 64)))) - -(define-alien-type ublksrv-io-cmd - (struct ublksrv-io-cmd - (q-id (unsigned 16)) - (tag (unsigned 16)) - (result (signed 32)) - (addr (unsigned 64)))) - -(define-alien-type ublk-param-basic - (struct ublk-param-basic - (attrs (unsigned 32)) - (logical-bs-shift (unsigned 8)) - (physical-bs-shift (unsigned 8)) - (io-opt-shift (unsigned 8)) - (io-min-shift (unsigned 8)) - (max-sectors (unsigned 32)) - (chunk-sectors (unsigned 32)) - (dev-sectors (unsigned 64)) - (virt-boundary-mask (unsigned 64)))) - -(define-alien-type ublk-param-discard - (struct ublk-param-discard - (discard-alignment (unsigned 32)) - (discard-granularity (unsigned 32)) - (max-discard-sectors (unsigned 32)) - (max-write-zeroes-sectors (unsigned 32)) - (reserved0 (unsigned 16)))) - -(define-alien-type ublk-param-devt - (struct ublk-param-devt - (char-major (unsigned 32)) - (char-minor (unsigned 32)) - (disk-major (unsigned 32)) - (disk-minor (unsigned 32)))) - -(define-alien-type ublk-params - (struct ublk-params - (len (unsigned 32)) - (types (unsigned 32)) - (basic (struct ublk-param-basic)) - (discard (struct ublk-param-discard)) - (devt (struct ublk-param-devt)))) - -;; (define-alien-type ublksrv-dev-data) diff -r ebe3315b7add -r 8e16efedfd76 lisp/ffi/ublk/srv.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/ffi/ublk/srv.lisp Sun Sep 29 23:43:03 2024 -0400 @@ -0,0 +1,86 @@ +;;; ublk/srv.lisp --- ublksrv API + +;; + +;;; Code: +(in-package :ublk) + +(define-alien-type ublksrv-ctrl-dev (struct ublksrv-ctrl-dev)) + +(define-alien-type ublksrv-queue + (struct ublksrv-queue + (q-id int) + (q-depth int) + (ring-ptr (* io-uring)) + (dev (* ublksrv-dev)) + (private-data (* t)))) + +(define-alien-type ublk-io-data + (struct ublk-io-data + (tag int) + (pad unsigned-int) + (iod (* ublksrv-io-desc)) + (private-data (* t)))) + +;; TODO 2024-09-29: add all of these as callbacks :C +;; (define-alien-type ublksrv-tgt-type +;; (struct ublksrv-tgt-type +;; (handle-io-async (function int (* ublksrv-queue) (* ublk-io-data))) +;; (tgt-io-done (function void (* ublksrv-queue) (* ublk-io-data) (* io-uring-cqe))) +;; (handle-event (function void (* ublksrv-queue))) +;; (handle-io-background (function void (* ublksrv-queue) int)) +;; (usage-for-add (function void)) +;; (init-tgt (function int (* ublksrv-dev) int int (array c-string))) +;; (deinit-tgt (function void (* ublksrv-dev))) +;; (alloc-io-buf (function (* t) (* ublksrv-queue) (* t) int)) +;; (idle-fn (function void (* ublksrv-queue) bool)) +;; (type int) +;; (ublk-flags unsigned) +;; (ublksrv-flags unsigned) +;; (pad unsigned) +;; (name c-string) +;; (recovery-tgt (function int (* ublksrv-dev) int)) +;; (init-queue (function int (* ublksrv-queue) (* (* t)))) +;; (deinit-queue (function void (* ublksrv-queue))) +;; (reserved (array unsigned-long 5)))) + +(define-alien-type ublksrv-dev-data + (struct ublksrv-dev-data + (dev-id int) + (max-io-buf-bytes unsigned) + (nr-hw-queues unsigned-short) + (queue-depth unsigned-short) + (tgt-type c-string) + (tgt-ops (* ublksrv-tgt-type)) + (tgt-argc int) + (tgt-argv (* (c-string))) + (run-dir c-string) + (flags unsigned-long) + (ublksrv-flags unsigned-long) + (reserved (array unsigned-long 7)))) + +(define-alien-type ublksrv-tgt-info + (struct ublksrv-tgt-info + (dev-size unsigned-long-long) + (tgt-ring-depth unsigned-int) + (nr-fds unsigned-int) + (fds (array int #.+ublksrv-tgt-max-fds+)) + (tgt-data (* t)) + (extra-ios unsigned-int) + (io-data-size unsigned-int) + (ops (* ublksrv-tgt-type)) + (iowq-max-workers (array unsigned-int 2)) + (reserved (array unsigned-long 4)))) + +(define-alien-type ublksrv-dev + (struct ublksrv-dev + (tgt ublksrv-tgt-info))) + +(define-alien-routine build-user-data (unsigned 64) + (tag unsigned) + (op unsigned) + (tgt-data unsigned) + (is-target-io unsigned)) + +(define-alien-routine ublksrv-ctrl-deinit void + (dev (* ublksrv-ctrl-dev))) diff -r ebe3315b7add -r 8e16efedfd76 lisp/ffi/ublk/tests.lisp --- a/lisp/ffi/ublk/tests.lisp Sun Sep 29 22:44:52 2024 -0400 +++ b/lisp/ffi/ublk/tests.lisp Sun Sep 29 23:43:03 2024 -0400 @@ -10,3 +10,5 @@ (in-suite :ublk) (load-ublksrv) + +(deftest sanity ()) diff -r ebe3315b7add -r 8e16efedfd76 lisp/ffi/ublk/ublk.asd --- a/lisp/ffi/ublk/ublk.asd Sun Sep 29 22:44:52 2024 -0400 +++ b/lisp/ffi/ublk/ublk.asd Sun Sep 29 23:43:03 2024 -0400 @@ -15,7 +15,9 @@ :in-order-to ((test-op (test-op "ublk/tests"))) :components ((:file "pkg") (grovel-constants-file "constants" - :package :ublk)) + :package :ublk) + (:file "cmd") + (:file "srv")) :perform (test-op (op c) (uiop:symbol-call '#:rt '#:do-tests :ublk))) (defsystem "ublk/tests"