diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-11-30 04:25:21 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-12-14 06:42:13 -0500 |
commit | 65586d51e0986be574118286c3d0007e903a2add (patch) | |
tree | 0684f76d53e666ffe2a2c77f8e3947d263fa1b75 | |
parent | 40be67f4c588fe2f3e2dbd60ae1f470abc5b6ad8 (diff) |
target: Drop se_device TCQ queue_depth usage from I/O path
Historically, pSCSI devices have been the ones that required target-core
to enforce a per se_device->depth_left. This patch changes target-core
to no longer (by default) enforce a per se_device->depth_left or sleep in
transport_tcq_window_closed() when we out of queue slots for all backend
export cases.
Cc: Christoph Hellwig <hch@lst.de>
Cc: Roland Dreier <roland@purestorage.com>
Cc: Joern Engel <joern@logfs.org>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r-- | drivers/target/target_core_device.c | 7 | ||||
-rw-r--r-- | drivers/target/target_core_pscsi.c | 1 | ||||
-rw-r--r-- | drivers/target/target_core_transport.c | 39 | ||||
-rw-r--r-- | include/target/target_core_base.h | 1 |
4 files changed, 2 insertions, 46 deletions
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 1f74de25a92f..0c5992f0d946 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
@@ -1132,8 +1132,6 @@ int se_dev_set_emulate_rest_reord(struct se_device *dev, int flag) | |||
1132 | */ | 1132 | */ |
1133 | int se_dev_set_queue_depth(struct se_device *dev, u32 queue_depth) | 1133 | int se_dev_set_queue_depth(struct se_device *dev, u32 queue_depth) |
1134 | { | 1134 | { |
1135 | u32 orig_queue_depth = dev->queue_depth; | ||
1136 | |||
1137 | if (atomic_read(&dev->dev_export_obj.obj_access_count)) { | 1135 | if (atomic_read(&dev->dev_export_obj.obj_access_count)) { |
1138 | pr_err("dev[%p]: Unable to change SE Device TCQ while" | 1136 | pr_err("dev[%p]: Unable to change SE Device TCQ while" |
1139 | " dev_export_obj: %d count exists\n", dev, | 1137 | " dev_export_obj: %d count exists\n", dev, |
@@ -1167,11 +1165,6 @@ int se_dev_set_queue_depth(struct se_device *dev, u32 queue_depth) | |||
1167 | } | 1165 | } |
1168 | 1166 | ||
1169 | dev->se_sub_dev->se_dev_attrib.queue_depth = dev->queue_depth = queue_depth; | 1167 | dev->se_sub_dev->se_dev_attrib.queue_depth = dev->queue_depth = queue_depth; |
1170 | if (queue_depth > orig_queue_depth) | ||
1171 | atomic_add(queue_depth - orig_queue_depth, &dev->depth_left); | ||
1172 | else if (queue_depth < orig_queue_depth) | ||
1173 | atomic_sub(orig_queue_depth - queue_depth, &dev->depth_left); | ||
1174 | |||
1175 | pr_debug("dev[%p]: SE Device TCQ Depth changed to: %u\n", | 1168 | pr_debug("dev[%p]: SE Device TCQ Depth changed to: %u\n", |
1176 | dev, queue_depth); | 1169 | dev, queue_depth); |
1177 | return 0; | 1170 | return 0; |
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index b73a399cdd54..d35467d42e12 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c | |||
@@ -350,7 +350,6 @@ static struct se_device *pscsi_add_device_to_list( | |||
350 | * scsi_device_put() and the pdv->pdv_sd cleared. | 350 | * scsi_device_put() and the pdv->pdv_sd cleared. |
351 | */ | 351 | */ |
352 | pdv->pdv_sd = sd; | 352 | pdv->pdv_sd = sd; |
353 | |||
354 | dev = transport_add_device_to_core_hba(hba, &pscsi_template, | 353 | dev = transport_add_device_to_core_hba(hba, &pscsi_template, |
355 | se_dev, dev_flags, pdv, | 354 | se_dev, dev_flags, pdv, |
356 | &dev_limits, NULL, NULL); | 355 | &dev_limits, NULL, NULL); |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 1cc7e920ab0b..7c2def7e2593 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -691,12 +691,6 @@ void transport_complete_task(struct se_task *task, int success) | |||
691 | struct se_cmd *cmd = task->task_se_cmd; | 691 | struct se_cmd *cmd = task->task_se_cmd; |
692 | struct se_device *dev = cmd->se_dev; | 692 | struct se_device *dev = cmd->se_dev; |
693 | unsigned long flags; | 693 | unsigned long flags; |
694 | #if 0 | ||
695 | pr_debug("task: %p CDB: 0x%02x obj_ptr: %p\n", task, | ||
696 | cmd->t_task_cdb[0], dev); | ||
697 | #endif | ||
698 | if (dev) | ||
699 | atomic_inc(&dev->depth_left); | ||
700 | 694 | ||
701 | spin_lock_irqsave(&cmd->t_state_lock, flags); | 695 | spin_lock_irqsave(&cmd->t_state_lock, flags); |
702 | task->task_flags &= ~TF_ACTIVE; | 696 | task->task_flags &= ~TF_ACTIVE; |
@@ -971,9 +965,8 @@ void transport_dump_dev_state( | |||
971 | break; | 965 | break; |
972 | } | 966 | } |
973 | 967 | ||
974 | *bl += sprintf(b + *bl, " Execute/Left/Max Queue Depth: %d/%d/%d", | 968 | *bl += sprintf(b + *bl, " Execute/Max Queue Depth: %d/%d", |
975 | atomic_read(&dev->execute_tasks), atomic_read(&dev->depth_left), | 969 | atomic_read(&dev->execute_tasks), dev->queue_depth); |
976 | dev->queue_depth); | ||
977 | *bl += sprintf(b + *bl, " SectorSize: %u MaxSectors: %u\n", | 970 | *bl += sprintf(b + *bl, " SectorSize: %u MaxSectors: %u\n", |
978 | dev->se_sub_dev->se_dev_attrib.block_size, dev->se_sub_dev->se_dev_attrib.max_sectors); | 971 | dev->se_sub_dev->se_dev_attrib.block_size, dev->se_sub_dev->se_dev_attrib.max_sectors); |
979 | *bl += sprintf(b + *bl, " "); | 972 | *bl += sprintf(b + *bl, " "); |
@@ -1328,9 +1321,6 @@ struct se_device *transport_add_device_to_core_hba( | |||
1328 | spin_lock_init(&dev->se_port_lock); | 1321 | spin_lock_init(&dev->se_port_lock); |
1329 | spin_lock_init(&dev->se_tmr_lock); | 1322 | spin_lock_init(&dev->se_tmr_lock); |
1330 | spin_lock_init(&dev->qf_cmd_lock); | 1323 | spin_lock_init(&dev->qf_cmd_lock); |
1331 | |||
1332 | dev->queue_depth = dev_limits->queue_depth; | ||
1333 | atomic_set(&dev->depth_left, dev->queue_depth); | ||
1334 | atomic_set(&dev->dev_ordered_id, 0); | 1324 | atomic_set(&dev->dev_ordered_id, 0); |
1335 | 1325 | ||
1336 | se_dev_set_default_attribs(dev, dev_limits); | 1326 | se_dev_set_default_attribs(dev, dev_limits); |
@@ -1982,18 +1972,6 @@ static void transport_set_supported_SAM_opcode(struct se_cmd *se_cmd) | |||
1982 | spin_unlock_irqrestore(&se_cmd->t_state_lock, flags); | 1972 | spin_unlock_irqrestore(&se_cmd->t_state_lock, flags); |
1983 | } | 1973 | } |
1984 | 1974 | ||
1985 | static inline int transport_tcq_window_closed(struct se_device *dev) | ||
1986 | { | ||
1987 | if (dev->dev_tcq_window_closed++ < | ||
1988 | PYX_TRANSPORT_WINDOW_CLOSED_THRESHOLD) { | ||
1989 | msleep(PYX_TRANSPORT_WINDOW_CLOSED_WAIT_SHORT); | ||
1990 | } else | ||
1991 | msleep(PYX_TRANSPORT_WINDOW_CLOSED_WAIT_LONG); | ||
1992 | |||
1993 | wake_up_interruptible(&dev->dev_queue_obj.thread_wq); | ||
1994 | return 0; | ||
1995 | } | ||
1996 | |||
1997 | /* | 1975 | /* |
1998 | * Called from Fabric Module context from transport_execute_tasks() | 1976 | * Called from Fabric Module context from transport_execute_tasks() |
1999 | * | 1977 | * |
@@ -2126,16 +2104,7 @@ static int __transport_execute_tasks(struct se_device *dev) | |||
2126 | struct se_task *task = NULL; | 2104 | struct se_task *task = NULL; |
2127 | unsigned long flags; | 2105 | unsigned long flags; |
2128 | 2106 | ||
2129 | /* | ||
2130 | * Check if there is enough room in the device and HBA queue to send | ||
2131 | * struct se_tasks to the selected transport. | ||
2132 | */ | ||
2133 | check_depth: | 2107 | check_depth: |
2134 | if (!atomic_read(&dev->depth_left)) | ||
2135 | return transport_tcq_window_closed(dev); | ||
2136 | |||
2137 | dev->dev_tcq_window_closed = 0; | ||
2138 | |||
2139 | spin_lock_irq(&dev->execute_task_lock); | 2108 | spin_lock_irq(&dev->execute_task_lock); |
2140 | if (list_empty(&dev->execute_task_list)) { | 2109 | if (list_empty(&dev->execute_task_list)) { |
2141 | spin_unlock_irq(&dev->execute_task_lock); | 2110 | spin_unlock_irq(&dev->execute_task_lock); |
@@ -2146,10 +2115,7 @@ check_depth: | |||
2146 | __transport_remove_task_from_execute_queue(task, dev); | 2115 | __transport_remove_task_from_execute_queue(task, dev); |
2147 | spin_unlock_irq(&dev->execute_task_lock); | 2116 | spin_unlock_irq(&dev->execute_task_lock); |
2148 | 2117 | ||
2149 | atomic_dec(&dev->depth_left); | ||
2150 | |||
2151 | cmd = task->task_se_cmd; | 2118 | cmd = task->task_se_cmd; |
2152 | |||
2153 | spin_lock_irqsave(&cmd->t_state_lock, flags); | 2119 | spin_lock_irqsave(&cmd->t_state_lock, flags); |
2154 | task->task_flags |= (TF_ACTIVE | TF_SENT); | 2120 | task->task_flags |= (TF_ACTIVE | TF_SENT); |
2155 | atomic_inc(&cmd->t_task_cdbs_sent); | 2121 | atomic_inc(&cmd->t_task_cdbs_sent); |
@@ -2170,7 +2136,6 @@ check_depth: | |||
2170 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | 2136 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); |
2171 | atomic_set(&cmd->t_transport_sent, 0); | 2137 | atomic_set(&cmd->t_transport_sent, 0); |
2172 | transport_stop_tasks_for_cmd(cmd); | 2138 | transport_stop_tasks_for_cmd(cmd); |
2173 | atomic_inc(&dev->depth_left); | ||
2174 | transport_generic_request_failure(cmd); | 2139 | transport_generic_request_failure(cmd); |
2175 | } | 2140 | } |
2176 | 2141 | ||
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 28190dc10eef..cd4caf3a598f 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
@@ -798,7 +798,6 @@ struct se_device { | |||
798 | spinlock_t stats_lock; | 798 | spinlock_t stats_lock; |
799 | /* Active commands on this virtual SE device */ | 799 | /* Active commands on this virtual SE device */ |
800 | atomic_t simple_cmds; | 800 | atomic_t simple_cmds; |
801 | atomic_t depth_left; | ||
802 | atomic_t dev_ordered_id; | 801 | atomic_t dev_ordered_id; |
803 | atomic_t execute_tasks; | 802 | atomic_t execute_tasks; |
804 | atomic_t dev_ordered_sync; | 803 | atomic_t dev_ordered_sync; |