target: Avoid extra t_state_lock access in __target_execute_cmd
This patch makes target_execute_cmd() set CMD_T_BUSY|CMD_T_SENT while holding se_cmd->t_state_lock, in order to avoid the extra aquire/release in __target_execute_cmd(). It also clears these bits in case of a target_handle_task_attr() failure. Cc: Christoph Hellwig <hch@lst.de> Cc: Roland Dreier <roland@kernel.org> Cc: Kent Overstreet <koverstreet@google.com> Cc: Or Gerlitz <ogerlitz@mellanox.com> Cc: Moussa Ba <moussaba@micron.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Родитель
c1c35d5225
Коммит
1a398b9731
|
@ -1580,10 +1580,6 @@ static void __target_execute_cmd(struct se_cmd *cmd)
|
||||||
{
|
{
|
||||||
sense_reason_t ret;
|
sense_reason_t ret;
|
||||||
|
|
||||||
spin_lock_irq(&cmd->t_state_lock);
|
|
||||||
cmd->transport_state |= (CMD_T_BUSY|CMD_T_SENT);
|
|
||||||
spin_unlock_irq(&cmd->t_state_lock);
|
|
||||||
|
|
||||||
if (cmd->execute_cmd) {
|
if (cmd->execute_cmd) {
|
||||||
ret = cmd->execute_cmd(cmd);
|
ret = cmd->execute_cmd(cmd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1690,11 +1686,17 @@ void target_execute_cmd(struct se_cmd *cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd->t_state = TRANSPORT_PROCESSING;
|
cmd->t_state = TRANSPORT_PROCESSING;
|
||||||
cmd->transport_state |= CMD_T_ACTIVE;
|
cmd->transport_state |= CMD_T_ACTIVE|CMD_T_BUSY|CMD_T_SENT;
|
||||||
spin_unlock_irq(&cmd->t_state_lock);
|
spin_unlock_irq(&cmd->t_state_lock);
|
||||||
|
|
||||||
if (!target_handle_task_attr(cmd))
|
if (target_handle_task_attr(cmd)) {
|
||||||
__target_execute_cmd(cmd);
|
spin_lock_irq(&cmd->t_state_lock);
|
||||||
|
cmd->transport_state &= ~CMD_T_BUSY|CMD_T_SENT;
|
||||||
|
spin_unlock_irq(&cmd->t_state_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
__target_execute_cmd(cmd);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(target_execute_cmd);
|
EXPORT_SYMBOL(target_execute_cmd);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче