aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroland@purestorage.com <roland@purestorage.com>2012-01-04 18:59:58 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2012-01-18 03:29:57 -0500
commit9db9da332250dbe662995703a4dcdd692112f0c3 (patch)
treebec92f208f928e41e84cc03ff9687e35eda6a062
parent6816966a8418b980481b4dced7eddd1796b145e8 (diff)
target: Don't zero pages used for data buffers
Doing alloc_page(GFP_KERNEL | __GFP_ZERO) to get pages used for data buffers wastes a lot of CPU clearing pages that will be quickly be overwritten by the actual data. However, for emulated control commands such as INQUIRY and so on, the code does assume that the buffer is zeroed. To avoid this CPU overhead, skip the __GFP_ZERO for commands that are actually moving data, ie cmds that have SCF_SCSI_DATA_SG_IO_CDB set. Signed-off-by: Roland Dreier <roland@purestorage.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/target_core_transport.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index d3ddd1361949..289bc0f125f9 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -3516,6 +3516,7 @@ transport_generic_get_mem(struct se_cmd *cmd)
3516 u32 length = cmd->data_length; 3516 u32 length = cmd->data_length;
3517 unsigned int nents; 3517 unsigned int nents;
3518 struct page *page; 3518 struct page *page;
3519 gfp_t zero_flag;
3519 int i = 0; 3520 int i = 0;
3520 3521
3521 nents = DIV_ROUND_UP(length, PAGE_SIZE); 3522 nents = DIV_ROUND_UP(length, PAGE_SIZE);
@@ -3526,9 +3527,11 @@ transport_generic_get_mem(struct se_cmd *cmd)
3526 cmd->t_data_nents = nents; 3527 cmd->t_data_nents = nents;
3527 sg_init_table(cmd->t_data_sg, nents); 3528 sg_init_table(cmd->t_data_sg, nents);
3528 3529
3530 zero_flag = cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB ? 0 : __GFP_ZERO;
3531
3529 while (length) { 3532 while (length) {
3530 u32 page_len = min_t(u32, length, PAGE_SIZE); 3533 u32 page_len = min_t(u32, length, PAGE_SIZE);
3531 page = alloc_page(GFP_KERNEL | __GFP_ZERO); 3534 page = alloc_page(GFP_KERNEL | zero_flag);
3532 if (!page) 3535 if (!page)
3533 goto out; 3536 goto out;
3534 3537