aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorQuinn Tran <quinn.tran@qlogic.com>2014-03-28 19:05:27 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-04-07 04:48:53 -0400
commit9d2e59f2a778328a41771fe9a0098dadbc4314ba (patch)
tree3a921494b5de360dda42f639bab92cdc03d427e1 /drivers/target
parentd444edc679e7713412f243b792b1f964e5cff1e1 (diff)
target/rd: T10-Dif: RAM disk is allocating more space than required.
Ram disk is allocating 8x more space than required for diff data. For large RAM disk test, there is small potential for memory starvation. (Use block_size when calculating total_sg_needed - sagi + nab) Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: Quinn Tran <quinn.tran@qlogic.com> Cc: <stable@vger.kernel.org> #3.14+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_rd.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c
index 66a5aba5a0d9..b920db3388cd 100644
--- a/drivers/target/target_core_rd.c
+++ b/drivers/target/target_core_rd.c
@@ -242,7 +242,7 @@ static void rd_release_prot_space(struct rd_dev *rd_dev)
242 rd_dev->sg_prot_count = 0; 242 rd_dev->sg_prot_count = 0;
243} 243}
244 244
245static int rd_build_prot_space(struct rd_dev *rd_dev, int prot_length) 245static int rd_build_prot_space(struct rd_dev *rd_dev, int prot_length, int block_size)
246{ 246{
247 struct rd_dev_sg_table *sg_table; 247 struct rd_dev_sg_table *sg_table;
248 u32 total_sg_needed, sg_tables; 248 u32 total_sg_needed, sg_tables;
@@ -252,8 +252,13 @@ static int rd_build_prot_space(struct rd_dev *rd_dev, int prot_length)
252 252
253 if (rd_dev->rd_flags & RDF_NULLIO) 253 if (rd_dev->rd_flags & RDF_NULLIO)
254 return 0; 254 return 0;
255 255 /*
256 total_sg_needed = rd_dev->rd_page_count / prot_length; 256 * prot_length=8byte dif data
257 * tot sg needed = rd_page_count * (PGSZ/block_size) *
258 * (prot_length/block_size) + pad
259 * PGSZ canceled each other.
260 */
261 total_sg_needed = (rd_dev->rd_page_count * prot_length / block_size) + 1;
257 262
258 sg_tables = (total_sg_needed / max_sg_per_table) + 1; 263 sg_tables = (total_sg_needed / max_sg_per_table) + 1;
259 264
@@ -606,7 +611,8 @@ static int rd_init_prot(struct se_device *dev)
606 if (!dev->dev_attrib.pi_prot_type) 611 if (!dev->dev_attrib.pi_prot_type)
607 return 0; 612 return 0;
608 613
609 return rd_build_prot_space(rd_dev, dev->prot_length); 614 return rd_build_prot_space(rd_dev, dev->prot_length,
615 dev->dev_attrib.block_size);
610} 616}
611 617
612static void rd_free_prot(struct se_device *dev) 618static void rd_free_prot(struct se_device *dev)