[Devel] [PATCH 1/4] target: Move scsi_port_stats from se_port to se_lun

Andrei Vagin avagin at virtuozzo.com
Thu Dec 28 05:30:45 MSK 2017


For all patches:

Acked-by: Andrei Vagin <avagin at virtuozzo.com>

On Wed, Dec 20, 2017 at 01:10:11PM +0300, Andrey Grafin wrote:
> This patch moves scsi_port_stats from se_port to se_lun
> and changes stats counters type to atomic_long_t.
> 
> This changes remove the next superfluous actions in collecting stats:
> - the check for the existence se_port;
> - spin_lock usage.
> 
> This patch is based on the mainstream patches adf653f92f38e and
> 4cc987eaff914 that can't be backported directly because there are
> too many changes before them. But the idea of that patches
> simplifies stats collecting.
> 
> Signed-off-by: Andrey Grafin <Andrey.Grafin at acronis.com>
> ---
>  drivers/target/target_core_stat.c      | 41 ++++++++++------------------------
>  drivers/target/target_core_tpg.c       |  3 +++
>  drivers/target/target_core_transport.c | 30 +++++++------------------
>  include/target/target_core_base.h      | 15 +++++++------
>  4 files changed, 31 insertions(+), 58 deletions(-)
> 
> diff --git a/drivers/target/target_core_stat.c b/drivers/target/target_core_stat.c
> index 59830a27f50..8dacf57620f 100644
> --- a/drivers/target/target_core_stat.c
> +++ b/drivers/target/target_core_stat.c
> @@ -794,17 +794,12 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_in_cmds(
>  	struct se_port_stat_grps *pgrps, char *page)
>  {
>  	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
> -	struct se_port *sep;
> -	ssize_t ret;
> +	ssize_t ret = -ENODEV;
>  
>  	spin_lock(&lun->lun_sep_lock);
> -	sep = lun->lun_sep;
> -	if (!sep) {
> -		spin_unlock(&lun->lun_sep_lock);
> -		return -ENODEV;
> -	}
> -
> -	ret = snprintf(page, PAGE_SIZE, "%llu\n", sep->sep_stats.cmd_pdus);
> +	if (lun->lun_sep)
> +		ret = snprintf(page, PAGE_SIZE, "%lu\n",
> +			atomic_long_read(&lun->lun_stats.cmd_pdus));
>  	spin_unlock(&lun->lun_sep_lock);
>  	return ret;
>  }
> @@ -814,18 +809,12 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_write_mbytes(
>  	struct se_port_stat_grps *pgrps, char *page)
>  {
>  	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
> -	struct se_port *sep;
> -	ssize_t ret;
> +	ssize_t ret = -ENODEV;
>  
>  	spin_lock(&lun->lun_sep_lock);
> -	sep = lun->lun_sep;
> -	if (!sep) {
> -		spin_unlock(&lun->lun_sep_lock);
> -		return -ENODEV;
> -	}
> -
> -	ret = snprintf(page, PAGE_SIZE, "%u\n",
> -			(u32)(sep->sep_stats.rx_data_octets >> 20));
> +	if (lun->lun_sep)
> +		ret = snprintf(page, PAGE_SIZE, "%lu\n",
> +			atomic_long_read(&lun->lun_stats.rx_data_octets) >> 20);
>  	spin_unlock(&lun->lun_sep_lock);
>  	return ret;
>  }
> @@ -835,18 +824,12 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_read_mbytes(
>  	struct se_port_stat_grps *pgrps, char *page)
>  {
>  	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
> -	struct se_port *sep;
> -	ssize_t ret;
> +	ssize_t ret = -ENODEV;
>  
>  	spin_lock(&lun->lun_sep_lock);
> -	sep = lun->lun_sep;
> -	if (!sep) {
> -		spin_unlock(&lun->lun_sep_lock);
> -		return -ENODEV;
> -	}
> -
> -	ret = snprintf(page, PAGE_SIZE, "%u\n",
> -			(u32)(sep->sep_stats.tx_data_octets >> 20));
> +	if (lun->lun_sep)
> +		ret = snprintf(page, PAGE_SIZE, "%lu\n",
> +			atomic_long_read(&lun->lun_stats.tx_data_octets) >> 20);
>  	spin_unlock(&lun->lun_sep_lock);
>  	return ret;
>  }
> diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
> index 0696de9553d..7ee2a94463b 100644
> --- a/drivers/target/target_core_tpg.c
> +++ b/drivers/target/target_core_tpg.c
> @@ -832,6 +832,9 @@ int core_tpg_add_lun(
>  	}
>  
>  	spin_lock(&tpg->tpg_lun_lock);
> +	atomic_long_set(&lun->lun_stats.cmd_pdus, 0);
> +	atomic_long_set(&lun->lun_stats.rx_data_octets, 0);
> +	atomic_long_set(&lun->lun_stats.tx_data_octets, 0);
>  	lun->lun_access = lun_access;
>  	lun->lun_status = TRANSPORT_LUN_STATUS_ACTIVE;
>  	spin_unlock(&tpg->tpg_lun_lock);
> diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
> index 25b5581ad78..4675bcc70cb 100644
> --- a/drivers/target/target_core_transport.c
> +++ b/drivers/target/target_core_transport.c
> @@ -1243,10 +1243,7 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb)
>  
>  	cmd->se_cmd_flags |= SCF_SUPPORTED_SAM_OPCODE;
>  
> -	spin_lock(&cmd->se_lun->lun_sep_lock);
> -	if (cmd->se_lun->lun_sep)
> -		cmd->se_lun->lun_sep->sep_stats.cmd_pdus++;
> -	spin_unlock(&cmd->se_lun->lun_sep_lock);
> +	atomic_long_inc(&cmd->se_lun->lun_stats.cmd_pdus);
>  	return 0;
>  }
>  EXPORT_SYMBOL(target_setup_cmd_from_cdb);
> @@ -2028,12 +2025,9 @@ static void target_complete_ok_work(struct work_struct *work)
>  queue_rsp:
>  	switch (cmd->data_direction) {
>  	case DMA_FROM_DEVICE:
> -		spin_lock(&cmd->se_lun->lun_sep_lock);
> -		if (cmd->se_lun->lun_sep) {
> -			cmd->se_lun->lun_sep->sep_stats.tx_data_octets +=
> -					cmd->data_length;
> -		}
> -		spin_unlock(&cmd->se_lun->lun_sep_lock);
> +		atomic_long_add(cmd->data_length,
> +			&cmd->se_lun->lun_stats.tx_data_octets);
> +
>  		/*
>  		 * Perform READ_STRIP of PI using software emulation when
>  		 * backend had PI enabled, if the transport will not be
> @@ -2057,22 +2051,14 @@ queue_rsp:
>  			goto queue_full;
>  		break;
>  	case DMA_TO_DEVICE:
> -		spin_lock(&cmd->se_lun->lun_sep_lock);
> -		if (cmd->se_lun->lun_sep) {
> -			cmd->se_lun->lun_sep->sep_stats.rx_data_octets +=
> -				cmd->data_length;
> -		}
> -		spin_unlock(&cmd->se_lun->lun_sep_lock);
> +		atomic_long_add(cmd->data_length,
> +			&cmd->se_lun->lun_stats.rx_data_octets);
>  		/*
>  		 * Check if we need to send READ payload for BIDI-COMMAND
>  		 */
>  		if (cmd->se_cmd_flags & SCF_BIDI) {
> -			spin_lock(&cmd->se_lun->lun_sep_lock);
> -			if (cmd->se_lun->lun_sep) {
> -				cmd->se_lun->lun_sep->sep_stats.tx_data_octets +=
> -					cmd->data_length;
> -			}
> -			spin_unlock(&cmd->se_lun->lun_sep_lock);
> +			atomic_long_add(cmd->data_length,
> +				&cmd->se_lun->lun_stats.tx_data_octets);
>  			ret = cmd->se_tfo->queue_data_in(cmd);
>  			if (ret)
>  				goto queue_full;
> diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
> index 189b73b514c..3010f63e085 100644
> --- a/include/target/target_core_base.h
> +++ b/include/target/target_core_base.h
> @@ -710,6 +710,12 @@ struct se_port_stat_grps {
>  	struct config_group scsi_transport_group;
>  };
>  
> +struct scsi_port_stats {
> +	atomic_long_t	cmd_pdus;
> +	atomic_long_t	tx_data_octets;
> +	atomic_long_t	rx_data_octets;
> +};
> +
>  struct se_lun {
>  #define SE_LUN_LINK_MAGIC			0xffff7771
>  	u32			lun_link_magic;
> @@ -729,6 +735,8 @@ struct se_lun {
>  	struct se_port_stat_grps port_stat_grps;
>  	struct completion	lun_ref_comp;
>  	struct percpu_ref	lun_ref;
> +
> +	struct scsi_port_stats	lun_stats;
>  };
>  
>  struct se_dev_stat_grps {
> @@ -835,19 +843,12 @@ struct se_hba {
>  	struct se_subsystem_api *transport;
>  };
>  
> -struct scsi_port_stats {
> -       u64     cmd_pdus;
> -       u64     tx_data_octets;
> -       u64     rx_data_octets;
> -};
> -
>  struct se_port {
>  	/* RELATIVE TARGET PORT IDENTIFER */
>  	u16		sep_rtpi;
>  	int		sep_tg_pt_secondary_stat;
>  	int		sep_tg_pt_secondary_write_md;
>  	u32		sep_index;
> -	struct scsi_port_stats sep_stats;
>  	/* Used for ALUA Target Port Groups membership */
>  	atomic_t	sep_tg_pt_secondary_offline;
>  	/* Used for PR ALL_TG_PT=1 */
> -- 
> 2.11.0
> 


More information about the Devel mailing list