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"