17 Jul, 2012

2 commits

  • The last functionality of the target processing thread is offloading possibly
    long running task management requests from the submitter context. To keep
    TMR semantics the same we need a single threaded ordered queue, which can
    be provided by a per-device workqueue with the right flags.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • Since "target: Drop se_device TCQ queue_depth usage from I/O path" we always
    submit all commands (or back then, tasks) from __transport_execute_tasks.

    That means the the execute list has lots its purpose, as we can simply
    submit the commands that are restarted in transport_complete_task_attr
    directly while we walk the list. In fact doing so also solves a race
    in the way it currently walks to delayed_cmd_list as well.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     

07 May, 2012

5 commits


26 Feb, 2012

3 commits

  • This patch adds initial support for TMR_ABORT_TASK ops for se_cmd
    descriptors using se_sess->sess_cmd_list and se_cmd->cmd_kref counting.

    It will perform an explict abort for all outstanding se_cmd ops based
    upon tmr->ref_task_tag that have not been set CMD_T_COMPLETE.
    It will cancel se_cmd->work and wait for backing I/O to complete before
    attempting to send SAM_STAT_TASK_ABORTED and perform
    target_put_sess_cmd() to release the referenced descriptor.

    It also adds a CMD_T_ABORTED check into transport_complete_task() to
    catch the completion from backend I/O that has been aborted, and
    updates transport_wait_for_tasks() to allow CMD_T_ABORTED usage with
    core_tmr_abort_task() context.

    Reported-by: Roland Dreier
    Cc: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • Change the test for if a cmd is a tmr request to checking if
    SCF_SCSI_TMR_CDB (a new flag) is set in cmd->se_cmd_flags.

    Also remove se_tmr_req_cache usage in favor of kzalloc usage,
    and make core_tmr_alloc_req() return int + setup se_cmd->se_tmr_req
    directly and fix up various fabric module usages

    Cc: Andy Grover
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • Replace various atomic_ts used as flags in struct se_cmd with a single
    transport_state bitmap that requires t_state_lock to be held for modifications.

    In the target core that assumption generally is true, but some recently added
    code in the SRP target had to grow new lock calls. I can't say I like the way
    how it messes with the command state directly, but let's leave that for later.

    (Re-add missing ib_srpt.c changes that nab dropped..)

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     

14 Dec, 2011

5 commits

  • - rename to target_check_cdb_and_preempt
    - use non-safe list_for_each_entry
    - move common check into callee (simplifying callers)

    Signed-off-by: Joern Engel
    Signed-off-by: Nicholas Bellinger

    Jörn Engel
     
  • And make it static afterwards.

    Signed-off-by: Joern Engel
    Signed-off-by: Nicholas Bellinger

    Jörn Engel
     
  • There is no need to make task_state_active an atomic_t given that it is
    always set under the execute_task_lock so we can make it a simple bool.
    Also rename it to t_state_active to be closer to the list it guards,
    and make sure all checks before the list addion/removal actually happen
    under execute_task_lock.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • This reorganized the headers under include/target into:

    - target_core_base.h stays as is with all target-wide data stuctures and defines
    - target_core_backend.h contains the whole interface to I/O backends
    - target_core_fabric.h contains the whole interface to fabric modules

    Except for those only the various configfs macro headers stay around.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • Create a new headers, drivers/target/target_core_internal.h that is supposed
    to hold all target_core-internal prototypes. Move all non-exported includes
    from include/target to it, and merge the smaller prototype-only includes
    inside drivers/target into it as well. Mark functions that were found to
    not be called outside their implementation file static.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     

06 Dec, 2011

1 commit

  • This patch removes legacy usage of PYX_TRANSPORT_* return codes in a number
    of locations and addresses cases where transport_generic_request_failure()
    was returning the incorrect sense upon CHECK_CONDITION status after the
    v3.1 converson to use errno return codes.

    This includes the conversion of transport_generic_request_failure() to
    process cmd->scsi_sense_reason and handle extra TCM_RESERVATION_CONFLICT
    before calling transport_send_check_condition_and_sense() to queue up
    response status. It also drops PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES legacy
    usgae, and returns TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE w/ a response
    for these cases.

    transport_generic_allocate_tasks(), transport_generic_new_cmd(), backend
    SCF_SCSI_DATA_SG_IO_CDB ->do_task(), and emulated ->execute_task() have
    all been updated to set se_cmd->scsi_sense_reason and return errno codes
    universally upon failure. This includes cmd->scsi_sense_reason assignment
    in target_core_alua.c, target_core_pr.c and target_core_cdb.c emulation code.

    Finally it updates fabric modules to remove the legacy usage, and for
    TFO->new_cmd_map() callers forwards return values outside of fabric code.
    iscsi-target has also been updated to remove a handful of special cases
    related to the cleanup and signaling QUEUE_FULL handling w/ ft_write_pending()

    (v2: Drop extra SCF_SCSI_CDB_EXCEPTION check during failure from
    transport_generic_new_cmd, and re-add missing task->task_error_status
    assignment in transport_complete_task)

    Cc: Christoph Hellwig
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

07 Nov, 2011

1 commit

  • * 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux: (230 commits)
    Revert "tracing: Include module.h in define_trace.h"
    irq: don't put module.h into irq.h for tracking irqgen modules.
    bluetooth: macroize two small inlines to avoid module.h
    ip_vs.h: fix implicit use of module_get/module_put from module.h
    nf_conntrack.h: fix up fallout from implicit moduleparam.h presence
    include: replace linux/module.h with "struct module" wherever possible
    include: convert various register fcns to macros to avoid include chaining
    crypto.h: remove unused crypto_tfm_alg_modname() inline
    uwb.h: fix implicit use of asm/page.h for PAGE_SIZE
    pm_runtime.h: explicitly requires notifier.h
    linux/dmaengine.h: fix implicit use of bitmap.h and asm/page.h
    miscdevice.h: fix up implicit use of lists and types
    stop_machine.h: fix implicit use of smp.h for smp_processor_id
    of: fix implicit use of errno.h in include/linux/of.h
    of_platform.h: delete needless include
    acpi: remove module.h include from platform/aclinux.h
    miscdevice.h: delete unnecessary inclusion of module.h
    device_cgroup.h: delete needless include
    net: sch_generic remove redundant use of
    net: inet_timewait_sock doesnt need
    ...

    Fix up trivial conflicts (other header files, and removal of the ab3550 mfd driver) in
    - drivers/media/dvb/frontends/dibx000_common.c
    - drivers/media/video/{mt9m111.c,ov6650.c}
    - drivers/mfd/ab3550-core.c
    - include/linux/dmaengine.h

    Linus Torvalds
     

02 Nov, 2011

2 commits

  • This patch drops TRANSPORT_FREE_CMD_INTR usage from target core, which
    includes the removal of transport_generic_free_cmd_intr() symbol,
    TRANSPORT_FREE_CMD_INTR usage in transport_processing_thread(), and
    special case LUN_RESET handling to skip TRANSPORT_FREE_CMD_INTR processing
    in core_tmr_drain_cmd_list(). We now expect that fabric modules will
    use an internal workqueue to provide process context when releasing
    se_cmd descriptor resources via transport_generic_free_cmd().

    Reported-by: Christoph Hellwig
    Cc: Christoph Hellwig
    Cc: Roland Dreier
    Cc: Madhuranath Iyengar
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • After the list_del() in core_tmr_drain_tmr_list(),
    core_tmr_release_req() would list_del() the same object again.

    Call graph:
    core_tmr_drain_tmr_list
    transport_cmd_finish_abort_tmr
    transport_generic_remove
    transport_free_se_cmd
    core_tmr_release_req

    So use list_del_init(), as list_del() of an initialized list_head is
    safe and essentially a nop. In the CONFIG_DEBUG_LIST case, list_del()
    actually poisons the list_head, but that is fine as we free the object
    directly afterwards.

    Signed-off-by: Joern Engel
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Joern Engel
     

01 Nov, 2011

1 commit


27 Oct, 2011

3 commits

  • This patch adds a handful minor cleanups to core_tmr_drain_tmr_list() that
    remove an unnecessary NULL check, use list_for_each_entry_safe() instead of
    list_entry(), and makes the drain_tmr_list walk use *tmr_p instead of
    directly referencing the passed *tmr function parameter.

    Signed-off-by: Joern Engel
    Cc: Joern Engel
    Reviewed-by: Roland Dreier
    Cc: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Joern Engel
     
  • This patch fixes another bug from LUN_RESET re-org fallout in
    core_tmr_drain_tmr_list() that was adding the wrong se_tmr_req
    into the local drain_tmr_list to be walked + released.

    Signed-off-by: Joern Engel
    Cc: Joern Engel
    Reviewed-by: Roland Dreier
    Cc: Roland Dreier
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Joern Engel
     
  • This patch fixes a bug in core_tmr_drain_tmr_list() where drain_tmr_list
    was using the wrong se_tmr_req for cmd assignment due to a typo during the
    LUN_RESET re-org. This was resulting in general protection faults while
    using the leftover bogus *tmr_p pointer from list_for_each_entry_safe().

    Signed-off-by: Joern Engel
    Cc: Joern Engel
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Joern Engel
     

24 Oct, 2011

10 commits

  • Instead of abusing the target processing thread for offloading I/O
    completion in the backends to user context add a new workqueue. This means
    completions can be processed as fast as available CPU time allows it,
    including in parallel with other completions and more importantly I/O
    submission or QUEUE FULL retries. This should give much better performance
    especially on loaded systems.

    As a fallout we can merge all the completed states into a single
    one.

    On the downside this change complicates lun reset handling a bit by
    requiring us to cancel a work item only for those states that have it
    initialized. The alternative would be to either always initialize the work
    item to a dummy handler, or always use the same handler and do a switch on
    the state. The long term solution will be a flag that says that the command
    has an initialized work item, but that's only going to be useful once we
    have more users.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • We never check for this state, and it makes testing for a completed
    state much harder given that it overrides the existing state.

    Also remove the unused deferred_t_state which is related to it.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • This is a squashed version of the following unnecessary se_task structure
    member removal patches:

    target: remove the task_execute_queue field in se_task

    Instead of using a separate flag we can simply do list_emptry checks
    on t_execute_list if we make sure to always use list_del_init to remove
    a task from the list. Also factor some duplicate code into a new
    __transport_remove_task_from_execute_queue helper.

    target: remove the read-only task_no field in se_task

    The task_no field never was initialized and only used in debug printks,
    so kill it.

    target: remove the task_padded_sg field in se_task

    This field is only check in one place and not actually needed there.

    Rationale:
    - transport_do_task_sg_chain asserts that we have task_sg_chaining
    set early on
    - we only make use of the sg_prev_nents field we calculate based on it
    if there is another sg list that gets chained onto this one, which
    never happens for the last (or only) task.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • Replace various atomic_t variables that were mostly under t_state_lock
    with new flags in task_flags. Note that the execution error path
    didn't take t_state_lock before, so add it there.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • This patch merges transport_cmd_finish_abort_tmr() logic into a single
    transport_cmd_finish_abort() function by adding a cmd->se_tmr_req check
    around transport_lun_remove_cmd(), and updates the single caller within
    core_tmr_drain_tmr_list().

    Reported-by: Christoph Hellwig
    Cc: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • Testing in_interrupt() to know when sleeping is allowed is not really
    reliable (since eg it won't be true if the caller is holding a spinlock).
    Instead have the caller tell core_tmr_alloc_req() what GFP_xxx to use;
    every caller except tcm_qla2xxx can use GFP_KERNEL.

    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     
  • This patch contains a bugfix for TMR LUN_RESET related to TRANSPORT_FREE_CMD_INTR
    operation, where core_tmr_drain_cmd_list() will now skip processing for this
    case to prevent an ABORT_TASK status from being returned for descriptors that
    are already queued up to be released by processing thread context.

    Cc: Roland Dreier
    Cc: Christoph Hellwig
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • This patch is a re-orginzation of core_tmr_lun_reset() logic to properly
    scan the active tmr_list, dev->state_task_list and qobj->qobj_list w/ the
    relivent locks held, and performing a list_move_tail onto seperate local
    scope lists before performing the full drain.

    This involves breaking out the code into three seperate list specific
    functions: core_tmr_drain_tmr_list(), core_tmr_drain_task_list() and
    core_tmr_drain_cmd_list().

    (nab: Include target: Remove non-active tasks from execute list during
    LUN_RESET patch to address original breakage)

    Reported-by: Roland Dreier
    Cc: Roland Dreier
    Cc: Christoph Hellwig
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • This patch addresses a bug with the lio-core-2.6.git conversion of
    transport_add_cmd_to_queue() to use a single embedded list_head, instead
    of individual struct se_queue_req allocations allowing a single se_cmd to
    be added to the queue mulitple times. This was changed in the following:

    commit 2a9e4d5ca5d99f4c600578d6285d45142e7e5208
    Author: Andy Grover
    Date: Tue Apr 26 17:45:51 2011 -0700

    target: Embed qr in struct se_cmd

    The problem is that some target code still assumes performing multiple
    adds is allowed via transport_add_cmd_to_queue(), which ends up causing
    list corruption in qobj->qobj_list code. This patch addresses this
    by removing an existing struct se_cmd from the list before the add, and
    removes an unnecessary list walk in transport_remove_cmd_from_queue()

    It also changes cmd->t_transport_queue_active to use explict sets intead
    of increment/decrement to prevent confusion during exception path handling.

    Signed-off-by: Roland Dreier
    Cc: Andy Grover
    Cc: stable@kernel.org
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     

11 Oct, 2011

1 commit


22 Jul, 2011

6 commits

  • This patch contains the squashed version of forth round series cleanups
    from Andy and Christoph following the post heavy lifting in the preceeding:
    'Eliminate usage of struct se_mem' and 'Make all control CDBs scatter-gather'
    changes. This also includes a conversion of target core and the v3.0
    mainline fabric modules (loopback and tcm_fc) to use pr_debug and the
    CONFIG_DYNAMIC_DEBUG infrastructure!

    These have been squashed into this third and final round for v3.1.

    target: Remove ifdeffed code in t_g_process_write
    target: Remove direct ramdisk code
    target: Rename task_sg_num to task_sg_nents
    target: Remove custom debug macros for pr_debug. Use pr_err().
    target: Remove custom debug macros in mainline fabrics
    target: Set WSNZ=1 in block limits VPD. Abort if WRITE_SAME sectors = 0
    target: Remove transport do_se_mem_map callback
    target: Further simplify transport_free_pages
    target: Redo task allocation return value handling
    target: Remove extra parentheses
    target: change alloc_task call to take *cdb, not *cmd

    (nab: Fix bogus struct file assignments in fd_do_readv and fd_do_writev)

    Signed-off-by: Andy Grover
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • transport_lookup_tmr_lun() can be called from interrupt context and
    therefore needs to use IRQ-safe spinlock functions. Fix this up, and
    to make the locking work, convert the other uses of se_tmr_lock to be
    IRQ-disabling.

    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Roland Dreier
     
  • Signed-off-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Christoph Hellwig
     
  • This patch contains a squashed version of third round series cleanups,
    improvements ,and simplfications from Andy and Christoph ahead of the
    heavy lifting between round 3 -> 4 for the target core SGL conversion.

    This include cleanups to the main target I/O path and other miscellaneous
    updates.

    target: Replace custom sgbuf functions with lib funcs
    target: Simplify sector limiting code
    target: get_cdb should never return NULL
    target: Simplify transport_memcpy_se_mem_read_contig
    target: Use assignment rather than increment for t_task_cdbs
    target: Don't pass dma_size to generic_get_mem
    target: Pass sg with type scatterlist in transport_map_sg_to_mem
    target: Move task_sg_num next to task_sg in struct se_task
    target: inline struct se_transport_task into struct se_cmd
    target: Change name & semantics of transport_get_sectors()
    target: Remove unused members of se_cmd
    target: Rename se_cmd.t_task_cdbs to t_task_list_num
    target: Fix some spelling
    target: Remove unused var from transport_generic_do_tmr
    target: map_sg_to_mem: return sg_count in return value
    target/pscsi: Use min_t for sector limits
    target/pscsi: Unused param for pscsi_get_bio()
    target: Rename get_cdb_count to allocate_tasks
    target: Make transport_generic_new_cmd() available for iscsi-target
    target: Remove fabric callback to allocate iovecs
    target: Fix transport_generic_new_cmd WRITE comment

    (hch: Use __GFP_ZERO usage for alloc_pages() usage)

    Signed-off-by: Andy Grover
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • This patch contains the squashed version of second round of target core
    cleanups and simplifications and Andy and Co. It also contains a handful
    of fixes to address bugs the original series and other minor cleanups.

    Here is the condensed shortlog:

    target: Remove unneeded casts to void*
    target: Rename get_lun_for_{cmd,tmr} to lookup_{cmd,tmr}_lun
    target: Make t_task a member of se_cmd, not a pointer
    target: Handle functions returning "-2"
    target: Use cmd->se_dev over cmd->se_lun->lun_se_dev
    target: Embed qr in struct se_cmd
    target: Replace embedded struct se_queue_req with a list_head
    target: Rename list_heads that are nodes in struct se_cmd to "*_node"
    target: Fold transport_device_setup_cmd() into lookup_{tmr,cmd}_lun()
    target: Make t_mem_list and t_mem_list_bidi members of t_task
    target: Add comment & cleanup transport_map_sg_to_mem()
    target: Remove unneeded checks in transport_free_pages()

    (Roland: Fix se_queue_req removal leftovers OOPs)
    (nab: Fix transport_lookup_tmr_lun failure case)
    (nab: Fix list_empty(&cmd->t_task.t_mem_bidi_list) inversion bugs)

    Signed-off-by: Andy Grover
    Signed-off-by: Roland Dreier
    Signed-off-by: Nicholas Bellinger

    Andy Grover
     
  • This patch contains the squashed version of a number of cleanups and
    minor fixes from Andy's initial series (round 1) for target core this
    past spring. The condensed log looks like:

    target: use errno values instead of returning -1 for everything
    target: Rename transport_calc_sg_num to transport_init_task_sg
    target: Fix leak in error path in transport_init_task_sg
    target/pscsi: Remove pscsi_get_sh() usage
    target: Make two runtime checks into WARN_ONs
    target: Remove hba queue depth and convert to spin_lock_irq usage
    target: dev->dev_status_queue_obj is unused
    target: Make struct se_queue_req.cmd type struct se_cmd *
    target: Remove __transport_get_qr_from_queue()
    target: Rename se_dev->g_se_dev_list to se_dev_node
    target: Remove struct se_global
    target: Simplify scsi mib index table code
    target: Make dev_queue_obj a member of se_device instead of a pointer
    target: remove extraneous returns at end of void functions
    target: Ensure transport_dump_vpd_ident_type returns null-terminated str
    target: Function pointers don't need to use '&' to be assigned
    target: Fix comment in __transport_execute_tasks()
    target: Misc style cleanups
    target: rename struct pr_reservation_template to pr_reservation
    target: Remove #defines that just perform indirection
    target: Inline transport_get_task_from_execute_queue()
    target: Minor header comment fixes

    Signed-off-by: Andy Grover
    Signed-off-by: Nicholas Bellinger

    Andy Grover