Re: [PATCH 10/14] target: Simplify the code for waiting for command completion

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/01/2018 04:26 PM, Bart Van Assche wrote:
> Instead of embedding the completion that is used for waiting for
> command completion in struct se_cmd, let the context that waits for
> command completion allocate it. This makes it possible to have a
> single code path for non-aborted and aborted commands in
> target_release_cmd_kref() and avoids that transport_generic_free_cmd()
> has to call cmd->se_tfo->release_cmd() directly. This patch does not
> change any functionality. Note: transport_generic_free_cmd() only
> waits until the se_cmd reference count has reached zero after it has
> set both CMD_T_FABRIC_STOP and CMD_T_ABORTED.
> 
> Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxx>
> Cc: Hannes Reinecke <hare@xxxxxxxx>
> Cc: Christoph Hellwig <hch@xxxxxx>
> Cc: Mike Christie <mchristi@xxxxxxxxxx>
> ---
>  drivers/target/target_core_transport.c | 24 ++++++++----------------
>  include/target/target_core_base.h      |  2 +-
>  2 files changed, 9 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
> index c8f19a143f5c..d7b0b2f4261e 100644
> --- a/drivers/target/target_core_transport.c
> +++ b/drivers/target/target_core_transport.c
> @@ -1276,7 +1276,7 @@ void transport_init_se_cmd(
>  	INIT_LIST_HEAD(&cmd->se_cmd_list);
>  	INIT_LIST_HEAD(&cmd->state_list);
>  	init_completion(&cmd->t_transport_stop_comp);
> -	init_completion(&cmd->cmd_wait_comp);
> +	cmd->compl = NULL;
>  	spin_lock_init(&cmd->t_state_lock);
>  	INIT_WORK(&cmd->work, NULL);
>  	kref_init(&cmd->cmd_kref);
> @@ -2596,6 +2596,7 @@ static void target_wait_free_cmd(struct se_cmd *cmd, bool *aborted, bool *tas)
>   */
>  int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks)
>  {
> +	DECLARE_COMPLETION_ONSTACK(compl);
>  	int ret = 0;
>  	bool aborted = false, tas = false;
>  
> @@ -2614,12 +2615,13 @@ int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks)
>  		if (cmd->se_lun)
>  			transport_lun_remove_cmd(cmd);
>  	}
> +	if (aborted)

I see that in the current code we always do a wait if the CMD_T_ABORTED
bit was set, so your patch matches that. However, is the original code
correct? In target_release_cmd_kref below we only do a wake up if both
CMD_T_FABRIC_STOP and CMD_T_ABORTED is set. If wait_for_tasks=false and
CMD_T_ABORTED was set, we would end up waiting forever. Is that right or
can it never happen?


........

>  		}
> -
> -		spin_lock(&se_cmd->t_state_lock);
> -		fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP) &&
> -			      (se_cmd->transport_state & CMD_T_ABORTED);
> -		spin_unlock(&se_cmd->t_state_lock);
> -
> -		if (fabric_stop) {
> -			spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
> -			target_free_cmd_mem(se_cmd);
> -			complete(&se_cmd->cmd_wait_comp);
> -			return;
> -		}
--
To unsubscribe from this list: send the line "unsubscribe target-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux