7c9e7a6fe1
Add a LIO storage engine that presents commands to userspace for execution. This would allow more complex backstores to be implemented out-of-kernel, and also make experimentation a-la FUSE (but at the SCSI level -- "SUSE"?) possible. It uses a mmap()able UIO device per LUN to share a command ring and data area. The commands are raw SCSI CDBs and iovs for in/out data. The command ring is also reused for returning scsi command status and optional sense data. This implementation is based on Shaohua Li's earlier version but heavily modified. Differences include: * Shared memory allocated by kernel, not locked-down user pages * Single ring for command request and response * Offsets instead of embedded pointers * Generic SCSI CDB passthrough instead of per-cmd specialization in ring format. * Uses UIO device instead of anon_file passed in mailbox. * Optional in-kernel handling of some commands. The main reason for these differences is to permit greater resiliency if the user process dies or hangs. Things not yet implemented (on purpose): * Zero copy. The data area is flexible enough to allow page flipping or backend-allocated pages to be used by fabrics, but it's not clear these are performance wins. Can come later. * Out-of-order command completion by userspace. Possible to add by just allowing userspace to change cmd_id in rsp cmd entries, but currently not supported. * No locks between kernel cmd submission and completion routines. Sounds like it's possible, but this can come later. * Sparse allocation of mmaped area. Current code vmallocs the whole thing. If the mapped area was larger and not fully mapped then the driver would have more freedom to change cmd and data area sizes based on demand. Current code open issues: * The use of idrs may be overkill -- we maybe can replace them with a simple counter to generate cmd_ids, and a hash table to get a cmd_id's associated pointer. * Use of a free-running counter for cmd ring instead of explicit modulo math. This would require power-of-2 cmd ring size. (Add kconfig depends NET - Randy) Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
47 lines
1.3 KiB
Plaintext
47 lines
1.3 KiB
Plaintext
|
|
menuconfig TARGET_CORE
|
|
tristate "Generic Target Core Mod (TCM) and ConfigFS Infrastructure"
|
|
depends on SCSI && BLOCK
|
|
select CONFIGFS_FS
|
|
select CRC_T10DIF
|
|
default n
|
|
help
|
|
Say Y or M here to enable the TCM Storage Engine and ConfigFS enabled
|
|
control path for target_core_mod. This includes built-in TCM RAMDISK
|
|
subsystem logic for virtual LUN 0 access
|
|
|
|
if TARGET_CORE
|
|
|
|
config TCM_IBLOCK
|
|
tristate "TCM/IBLOCK Subsystem Plugin for Linux/BLOCK"
|
|
select BLK_DEV_INTEGRITY
|
|
help
|
|
Say Y here to enable the TCM/IBLOCK subsystem plugin for non-buffered
|
|
access to Linux/Block devices using BIO
|
|
|
|
config TCM_FILEIO
|
|
tristate "TCM/FILEIO Subsystem Plugin for Linux/VFS"
|
|
help
|
|
Say Y here to enable the TCM/FILEIO subsystem plugin for buffered
|
|
access to Linux/VFS struct file or struct block_device
|
|
|
|
config TCM_PSCSI
|
|
tristate "TCM/pSCSI Subsystem Plugin for Linux/SCSI"
|
|
help
|
|
Say Y here to enable the TCM/pSCSI subsystem plugin for non-buffered
|
|
passthrough access to Linux/SCSI device
|
|
|
|
config TCM_USER
|
|
tristate "TCM/USER Subsystem Plugin for Linux"
|
|
depends on UIO && NET
|
|
help
|
|
Say Y here to enable the TCM/USER subsystem plugin for a userspace
|
|
process to handle requests
|
|
|
|
source "drivers/target/loopback/Kconfig"
|
|
source "drivers/target/tcm_fc/Kconfig"
|
|
source "drivers/target/iscsi/Kconfig"
|
|
source "drivers/target/sbp/Kconfig"
|
|
|
|
endif
|