From: Mike Christie <michael.christie@oracle.com>
To: Yu Zhang <yuz08559@gmail.com>, mkp@kernel.org
Cc: d.bogdanov@yadro.com, linux-scsi@vger.kernel.org,
target-devel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] scsi: target: Disable interrupts while holding delayed_cmd_lock
Date: Tue, 6 Oct 2026 19:22:47 -0500 [thread overview]
Message-ID: <ebf6b4a2-5dc5-43da-a19d-3d9774b28825@oracle.com> (raw)
In-Reply-To: <20260927091329.13482-1-yuz08559@gmail.com>
On 9/27/26 4:13 AM, Yu Zhang wrote:
> target_do_delayed_work() takes dev->delayed_cmd_lock with a plain spin_lock(). It runs from system_percpu_wq, so interrupts stay enabled while the lock is held. Every other acquisition of that lock uses spin_lock_irqsave(): target_handle_task_attr()
>
>
> target_do_delayed_work() takes dev->delayed_cmd_lock with a plain
> spin_lock(). It runs from system_percpu_wq, so interrupts stay enabled
> while the lock is held. Every other acquisition of that lock uses
> spin_lock_irqsave(): target_handle_task_attr() and
> transport_complete_ordered_sync() in target_core_transport.c, and
> target_non_ordered_release() in target_core_device.c.
>
> That was safe while every caller of transport_complete_task_attr() ran
> in process context: target_complete_ok_work() from
> target_completion_wq, transport_complete_qf() from dev->qf_work_queue,
> and transport_generic_request_failure() from the submit and execute
> paths.
>
> Since commit 06933066d88a ("scsi: target: Add support for completing
> commands from backend context") that is no longer true. With
> complete_type=1 on a fabric that sets direct_compl_supp,
> target_complete() runs target_complete_ok_work() inline in the
> backend's completion context, which target_complete_cmd_with_sense()
> documents as "May be called from interrupt context". For iblock that
> is the bio end_io.
>
> target_complete_ok_work() starts with transport_complete_task_attr(),
> which takes delayed_cmd_lock in two ways:
>
> - Every ORDERED command is put on dev->delayed_cmd_list by
> target_handle_task_attr() and dispatched from there by
> target_do_delayed_work(), which marks it SCF_TASK_ORDERED_SYNC.
> Its completion therefore goes through
> transport_complete_ordered_sync().
>
> - A SIMPLE command that completes while an ORDERED command is pending
> drops the last reference to the killed dev->non_ordered, and
> percpu_ref_put() then runs target_non_ordered_release() in the
> completing context.
>
> Both take the lock and, if commands are waiting, call
> schedule_work(&dev->delayed_cmd_work), which queues on
> system_percpu_wq, i.e. on the CPU that took the completion. Further
> completions for the same queue are typically delivered there too, so
> one arriving while the work holds the lock spins on it forever.
>
> Reaching this needs complete_type=1, which is not the default
> (vhost-scsi, the only fabric with direct_compl_supp, defaults to
> TARGET_QUEUE_COMPL), a backend whose I/O completes from interrupt
> context, and ORDERED commands from the initiator. Linux virtio_scsi
> guests send only VIRTIO_SCSI_S_SIMPLE and never take the ordered path;
> any guest that uses the ORDERED task attribute, which vhost-scsi
> accepts, does.
>
> target_do_delayed_work() is a work item and always runs in process
> context, so spin_lock_irq() is sufficient.
>
> Found by inspection; no runtime report. A single ORDERED command goes
> through both acquisitions, so with CONFIG_PROVE_LOCKING the first one
> completed through direct completion should produce an inconsistent
> lock state report on delayed_cmd_lock (hardirq or softirq, depending on
> where the backend completes).
>
> Fixes: 06933066d88a ("scsi: target: Add support for completing commands from backend context")
> Signed-off-by: Yu Zhang <yuz08559@gmail.com>
Reviewed-by: Mike Christie <michael.christie@oracle.com>
prev parent reply other threads:[~2026-10-07 0:22 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-27 9:13 Yu Zhang
2026-10-07 0:22 ` Mike Christie [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ebf6b4a2-5dc5-43da-a19d-3d9774b28825@oracle.com \
--to=michael.christie@oracle.com \
--cc=d.bogdanov@yadro.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=mkp@kernel.org \
--cc=target-devel@vger.kernel.org \
--cc=yuz08559@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®