mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 05:33:09 +00:00
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>
32 lines
903 B
Makefile
32 lines
903 B
Makefile
|
|
target_core_mod-y := target_core_configfs.o \
|
|
target_core_device.o \
|
|
target_core_fabric_configfs.o \
|
|
target_core_fabric_lib.o \
|
|
target_core_hba.o \
|
|
target_core_pr.o \
|
|
target_core_alua.o \
|
|
target_core_tmr.o \
|
|
target_core_tpg.o \
|
|
target_core_transport.o \
|
|
target_core_sbc.o \
|
|
target_core_spc.o \
|
|
target_core_ua.o \
|
|
target_core_rd.o \
|
|
target_core_stat.o \
|
|
target_core_xcopy.o
|
|
|
|
obj-$(CONFIG_TARGET_CORE) += target_core_mod.o
|
|
|
|
# Subsystem modules
|
|
obj-$(CONFIG_TCM_IBLOCK) += target_core_iblock.o
|
|
obj-$(CONFIG_TCM_FILEIO) += target_core_file.o
|
|
obj-$(CONFIG_TCM_PSCSI) += target_core_pscsi.o
|
|
obj-$(CONFIG_TCM_USER) += target_core_user.o
|
|
|
|
# Fabric modules
|
|
obj-$(CONFIG_LOOPBACK_TARGET) += loopback/
|
|
obj-$(CONFIG_TCM_FC) += tcm_fc/
|
|
obj-$(CONFIG_ISCSI_TARGET) += iscsi/
|
|
obj-$(CONFIG_SBP_TARGET) += sbp/
|