All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sagi Grimberg <sagig@mellanox.com>
To: "Nicholas A. Bellinger" <nab@daterainc.com>,
	target-devel <target-devel@vger.kernel.org>
Cc: linux-scsi <linux-scsi@vger.kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	"Martin K. Petersen" <martin.petersen@oracle.com>,
	Christoph Hellwig <hch@lst.de>, Hannes Reinecke <hare@suse.de>,
	Or Gerlitz <ogerlitz@mellanox.com>,
	Nicholas Bellinger <nab@linux-iscsi.org>
Subject: Re: [PATCH 13/14] target/rd: Add DIF protection into rd_execute_rw
Date: Thu, 9 Jan 2014 12:32:26 +0200	[thread overview]
Message-ID: <52CE7ABA.9080403@mellanox.com> (raw)
In-Reply-To: <1389212157-14540-14-git-send-email-nab@daterainc.com>

On 1/8/2014 10:36 PM, Nicholas A. Bellinger wrote:
> From: Nicholas Bellinger <nab@linux-iscsi.org>
>
> This patch adds support for DIF protection into rd_execute_rw() code
> for WRITE/READ I/O using sbc_dif_verify_[write,read]() logic.
>
> It also adds rd_get_prot_table() for locating protection SGLs
> assoicated with the ramdisk backend device.
>
> Cc: Martin K. Petersen <martin.petersen@oracle.com>
> Cc: Christoph Hellwig <hch@lst.de>
> Cc: Hannes Reinecke <hare@suse.de>
> Cc: Sagi Grimberg <sagig@mellanox.com>
> Cc: Or Gerlitz <ogerlitz@mellanox.com>
> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
> ---
>   drivers/target/target_core_rd.c |   67 +++++++++++++++++++++++++++++++++++++++
>   1 file changed, 67 insertions(+)
>
> diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c
> index dd99844..3fd51eb 100644
> --- a/drivers/target/target_core_rd.c
> +++ b/drivers/target/target_core_rd.c
> @@ -363,6 +363,26 @@ static struct rd_dev_sg_table *rd_get_sg_table(struct rd_dev *rd_dev, u32 page)
>   	return NULL;
>   }
>   
> +static struct rd_dev_sg_table *rd_get_prot_table(struct rd_dev *rd_dev, u32 page)
> +{
> +	struct rd_dev_sg_table *sg_table;
> +	u32 i, sg_per_table = (RD_MAX_ALLOCATION_SIZE /
> +				sizeof(struct scatterlist));
> +
> +	i = page / sg_per_table;
> +	if (i < rd_dev->sg_prot_count) {
> +		sg_table = &rd_dev->sg_prot_array[i];
> +		if ((sg_table->page_start_offset <= page) &&
> +		     (sg_table->page_end_offset >= page))
> +			return sg_table;
> +	}
> +
> +	pr_err("Unable to locate struct prot rd_dev_sg_table for page: %u\n",
> +			page);
> +
> +	return NULL;
> +}
> +
>   static sense_reason_t
>   rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
>   	      enum dma_data_direction data_direction)
> @@ -377,6 +397,7 @@ rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
>   	u32 rd_page;
>   	u32 src_len;
>   	u64 tmp;
> +	sense_reason_t rc;
>   
>   	if (dev->rd_flags & RDF_NULLIO) {
>   		target_complete_cmd(cmd, SAM_STAT_GOOD);
> @@ -399,6 +420,29 @@ rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
>   			data_direction == DMA_FROM_DEVICE ? "Read" : "Write",
>   			cmd->t_task_lba, rd_size, rd_page, rd_offset);
>   
> +	if ((cmd->se_cmd_flags & SCF_PROT) && se_dev->dev_attrib.pi_prot_type &&
> +	    data_direction == DMA_TO_DEVICE) {
> +		sector_t sector = cmd->data_length / se_dev->dev_attrib.block_size;
> +		struct rd_dev_sg_table *prot_table;
> +		struct scatterlist *prot_sg;
> +		u32 prot_offset, prot_page;
> +
> +		tmp = cmd->t_task_lba * se_dev->prot_length;
> +		prot_offset = do_div(tmp, PAGE_SIZE);
> +		prot_page = tmp;
> +
> +		prot_table = rd_get_prot_table(dev, prot_page);
> +		if (!prot_table)
> +			return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
> +
> +		prot_sg = &prot_table->sg_table[prot_page - prot_table->page_start_offset];
> +
> +		rc = sbc_dif_verify_write(cmd, cmd->t_task_lba, sector, 0,
> +					  prot_sg, prot_offset);
> +		if (rc)
> +			return rc;
> +	}
> +
>   	src_len = PAGE_SIZE - rd_offset;
>   	sg_miter_start(&m, sgl, sgl_nents,
>   			data_direction == DMA_FROM_DEVICE ?
> @@ -460,6 +504,29 @@ rd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
>   	}
>   	sg_miter_stop(&m);
>   
> +	if ((cmd->se_cmd_flags & SCF_PROT) && se_dev->dev_attrib.pi_prot_type &&
> +	    data_direction == DMA_FROM_DEVICE) {
> +		sector_t sector = cmd->data_length / se_dev->dev_attrib.block_size;
> +		struct rd_dev_sg_table *prot_table;
> +		struct scatterlist *prot_sg;
> +		u32 prot_offset, prot_page;
> +
> +		tmp = cmd->t_task_lba * se_dev->prot_length;
> +		prot_offset = do_div(tmp, PAGE_SIZE);
> +		prot_page = tmp;
> +
> +		prot_table = rd_get_prot_table(dev, prot_page);
> +		if (!prot_table)
> +			return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
> +
> +		prot_sg = &prot_table->sg_table[prot_page - prot_table->page_start_offset];
> +
> +		rc = sbc_dif_verify_read(cmd, cmd->t_task_lba, sector, 0,
> +					 prot_sg, prot_offset);
> +		if (rc)
> +			return rc;
> +	}
> +
>   	target_complete_cmd(cmd, SAM_STAT_GOOD);
>   	return 0;
>   }

I wander how we can skip  sbc_dif_verify_xxxx if the transport already 
offloaded DIF verify.
I think that the transport should signal the core layer that it is able 
to offload DIF (ADD/STRIP/PASS/VERIFY), in which case the core should 
turn off the backstore DIF verify emulation to sustain performance. I 
assume that if backstore DIF verify is offloaded as well it does not 
really matter.

Sagi.

  reply	other threads:[~2014-01-09 10:32 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-08 20:15 [PATCH 00/14] target: Initial support for DIF Type1+Type3 emulation Nicholas A. Bellinger
2014-01-08 20:15 ` [PATCH 01/14] target: Add DIF related base definitions Nicholas A. Bellinger
2014-01-09 10:58   ` Sagi Grimberg
2014-01-08 20:15 ` [PATCH 02/14] target: Add DIF CHECK_CONDITION ASC/ASCQ exception cases Nicholas A. Bellinger
2014-01-09 10:43   ` Sagi Grimberg
2014-01-10  6:53     ` Nicholas A. Bellinger
2014-01-14  7:44       ` Sagi Grimberg
2014-01-14  8:53         ` Nicholas A. Bellinger
2014-01-14 10:56           ` Sagi Grimberg
2014-01-08 20:15 ` [PATCH 03/14] target/sbc: Add sbc_check_prot + update sbc_parse_cdb for DIF Nicholas A. Bellinger
2014-01-09 14:58   ` Sagi Grimberg
2014-01-10  7:04     ` Nicholas A. Bellinger
2014-01-12 11:59       ` Sagi Grimberg
2014-01-13 19:23         ` Nicholas A. Bellinger
2014-01-10 20:30   ` Martin K. Petersen
2014-01-08 20:15 ` [PATCH 04/14] target/sbc: Add DIF TYPE1+TYPE3 read/write verify emulation Nicholas A. Bellinger
2014-01-08 20:15 ` [PATCH 05/14] target/spc: Add protection bit to standard INQUIRY output Nicholas A. Bellinger
2014-01-10 20:34   ` Martin K. Petersen
2014-01-08 20:15 ` [PATCH 06/14] target/spc: Add protection related bits to INQUIRY EVPD=0x86 Nicholas A. Bellinger
2014-01-10 20:35   ` Martin K. Petersen
2014-01-08 20:15 ` [PATCH 07/14] target/sbc: Add P_TYPE + PROT_EN bits to READ_CAPACITY_16 Nicholas A. Bellinger
2014-01-09 10:24   ` Sagi Grimberg
2014-01-10  6:21     ` Nicholas A. Bellinger
2014-01-10 19:50       ` Andy Grover
2014-01-10 20:15         ` Nicholas A. Bellinger
2014-01-10 20:46         ` Martin K. Petersen
2014-01-12 11:49           ` Sagi Grimberg
2014-01-10 20:40       ` Martin K. Petersen
2014-01-10 20:39     ` Martin K. Petersen
2014-01-12 12:13       ` Sagi Grimberg
2014-01-12 12:33         ` Martin K. Petersen
2014-01-12 12:47           ` Sagi Grimberg
2014-01-12 12:53             ` Martin K. Petersen
2014-01-12 16:37         ` Douglas Gilbert
2014-01-12 17:21           ` Martin K. Petersen
2014-01-12 18:53             ` Douglas Gilbert
2014-01-13 16:33               ` Sagi Grimberg
2014-01-12 12:13       ` Sagi Grimberg
2014-01-10 20:37   ` Martin K. Petersen
2014-01-08 20:15 ` [PATCH 08/14] target/spc: Expose ATO bit in control mode page Nicholas A. Bellinger
2014-01-10 20:57   ` Martin K. Petersen
2014-01-08 20:15 ` [PATCH 09/14] target/configfs: Expose protection device attributes Nicholas A. Bellinger
2014-01-09 11:01   ` Sagi Grimberg
2014-01-10  7:00     ` Nicholas A. Bellinger
2014-01-12 11:56       ` Sagi Grimberg
2014-01-10 21:01   ` Martin K. Petersen
2014-01-12 12:18     ` Sagi Grimberg
2014-01-12 12:43       ` Martin K. Petersen
2014-01-12 12:52         ` Sagi Grimberg
2014-01-13 18:30     ` Nicholas A. Bellinger
2014-01-13 18:52       ` James Bottomley
2014-01-13 19:27         ` Nicholas A. Bellinger
2014-01-13 19:43           ` James Bottomley
2014-01-13 20:19           ` Martin K. Petersen
2014-01-13 20:24             ` James Bottomley
2014-01-13 20:30               ` Martin K. Petersen
2014-01-08 20:15 ` [PATCH 10/14] target: Add protection SGLs to target_submit_cmd_map_sgls Nicholas A. Bellinger
2014-01-08 20:15 ` [PATCH 11/14] target/rd: Refactor rd_build_device_space + rd_release_device_space Nicholas A. Bellinger
2014-01-08 20:15 ` [PATCH 12/14] target/rd: Add support for protection SGL setup + release Nicholas A. Bellinger
2014-01-08 20:15 ` [PATCH 13/14] target/rd: Add DIF protection into rd_execute_rw Nicholas A. Bellinger
2014-01-09 10:32   ` Sagi Grimberg [this message]
2014-01-10  6:52     ` Nicholas A. Bellinger
2014-01-12 11:53       ` Sagi Grimberg
2014-01-13 19:22         ` Nicholas A. Bellinger
2014-01-10 21:06     ` Martin K. Petersen
2014-01-12 12:23       ` Sagi Grimberg
2014-01-08 20:15 ` [PATCH 14/14] tcm_loop: Enable DIF/DIX modes in SCSI host LLD Nicholas A. Bellinger
2014-01-10 21:09   ` Martin K. Petersen
2014-01-13 18:45     ` Nicholas A. Bellinger
2014-01-13 20:08       ` Martin K. Petersen
2014-01-10  2:00 ` [PATCH 00/14] target: Initial support for DIF Type1+Type3 emulation Martin K. Petersen
2014-01-10  5:57   ` Nicholas A. Bellinger
2014-01-15 18:03 ` sagi grimberg
2014-01-15 21:55   ` Nicholas A. Bellinger
2014-01-16  1:42     ` Martin K. Petersen
2014-01-16  2:32       ` Nicholas A. Bellinger
2014-01-16  3:04         ` Martin K. Petersen
2014-01-16  7:45       ` sagi grimberg

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=52CE7ABA.9080403@mellanox.com \
    --to=sagig@mellanox.com \
    --cc=hare@suse.de \
    --cc=hch@lst.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=nab@daterainc.com \
    --cc=nab@linux-iscsi.org \
    --cc=ogerlitz@mellanox.com \
    --cc=target-devel@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.