Skip to content
  • Andy Grover's avatar
    target: Add a user-passthrough backstore · 7c9e7a6f
    Andy Grover authored
    
    
    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: default avatarAndy Grover <agrover@redhat.com>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    7c9e7a6f