forked from Minki/linux
target: Remove transport_do_task_sg_chain() and associated detritus
Now that all fabrics are converted over to using se_cmd->t_data_sg directly, we can drop the task sg chaining support. With the modern memory allocation in target core, task sg chaining is needless overhead -- we would split up the main cmd sglist into pieces, and then splice those pieces back together instead of just using the original list directly. Signed-off-by: Roland Dreier <roland@purestorage.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
6f9e7f01b6
commit
957525a242
@ -3699,76 +3699,6 @@ static inline sector_t transport_limit_task_sectors(
|
||||
return sectors;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This function can be used by HW target mode drivers to create a linked
|
||||
* scatterlist from all contiguously allocated struct se_task->task_sg[].
|
||||
* This is intended to be called during the completion path by TCM Core
|
||||
* when struct target_core_fabric_ops->check_task_sg_chaining is enabled.
|
||||
*/
|
||||
void transport_do_task_sg_chain(struct se_cmd *cmd)
|
||||
{
|
||||
struct scatterlist *sg_first = NULL;
|
||||
struct scatterlist *sg_prev = NULL;
|
||||
int sg_prev_nents = 0;
|
||||
struct scatterlist *sg;
|
||||
struct se_task *task;
|
||||
u32 chained_nents = 0;
|
||||
int i;
|
||||
|
||||
BUG_ON(!cmd->se_tfo->task_sg_chaining);
|
||||
|
||||
/*
|
||||
* Walk the struct se_task list and setup scatterlist chains
|
||||
* for each contiguously allocated struct se_task->task_sg[].
|
||||
*/
|
||||
list_for_each_entry(task, &cmd->t_task_list, t_list) {
|
||||
if (!task->task_sg)
|
||||
continue;
|
||||
|
||||
if (!sg_first) {
|
||||
sg_first = task->task_sg;
|
||||
chained_nents = task->task_sg_nents;
|
||||
} else {
|
||||
sg_chain(sg_prev, sg_prev_nents, task->task_sg);
|
||||
chained_nents += task->task_sg_nents;
|
||||
}
|
||||
/*
|
||||
* For the padded tasks, use the extra SGL vector allocated
|
||||
* in transport_allocate_data_tasks() for the sg_prev_nents
|
||||
* offset into sg_chain() above.
|
||||
*
|
||||
* We do not need the padding for the last task (or a single
|
||||
* task), but in that case we will never use the sg_prev_nents
|
||||
* value below which would be incorrect.
|
||||
*/
|
||||
sg_prev_nents = (task->task_sg_nents + 1);
|
||||
sg_prev = task->task_sg;
|
||||
}
|
||||
/*
|
||||
* Setup the starting pointer and total t_tasks_sg_linked_no including
|
||||
* padding SGs for linking and to mark the end.
|
||||
*/
|
||||
cmd->t_tasks_sg_chained = sg_first;
|
||||
cmd->t_tasks_sg_chained_no = chained_nents;
|
||||
|
||||
pr_debug("Setup cmd: %p cmd->t_tasks_sg_chained: %p and"
|
||||
" t_tasks_sg_chained_no: %u\n", cmd, cmd->t_tasks_sg_chained,
|
||||
cmd->t_tasks_sg_chained_no);
|
||||
|
||||
for_each_sg(cmd->t_tasks_sg_chained, sg,
|
||||
cmd->t_tasks_sg_chained_no, i) {
|
||||
|
||||
pr_debug("SG[%d]: %p page: %p length: %d offset: %d\n",
|
||||
i, sg, sg_page(sg), sg->length, sg->offset);
|
||||
if (sg_is_chain(sg))
|
||||
pr_debug("SG: %p sg_is_chain=1\n", sg);
|
||||
if (sg_is_last(sg))
|
||||
pr_debug("SG: %p sg_is_last=1\n", sg);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(transport_do_task_sg_chain);
|
||||
|
||||
/*
|
||||
* Break up cmd into chunks transport can handle
|
||||
*/
|
||||
|
@ -572,7 +572,6 @@ struct se_cmd {
|
||||
unsigned char *t_task_cdb;
|
||||
unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE];
|
||||
unsigned long long t_task_lba;
|
||||
u32 t_tasks_sg_chained_no;
|
||||
atomic_t t_fe_count;
|
||||
atomic_t t_se_count;
|
||||
atomic_t t_task_cdbs_left;
|
||||
@ -593,7 +592,6 @@ struct se_cmd {
|
||||
struct completion t_transport_stop_comp;
|
||||
struct completion transport_lun_fe_stop_comp;
|
||||
struct completion transport_lun_stop_comp;
|
||||
struct scatterlist *t_tasks_sg_chained;
|
||||
|
||||
struct work_struct work;
|
||||
|
||||
|
@ -3,12 +3,6 @@
|
||||
|
||||
struct target_core_fabric_ops {
|
||||
struct configfs_subsystem *tf_subsys;
|
||||
/*
|
||||
* Optional to signal struct se_task->task_sg[] padding entries
|
||||
* for scatterlist chaining using transport_do_task_sg_link(),
|
||||
* disabled by default
|
||||
*/
|
||||
bool task_sg_chaining;
|
||||
char *(*get_fabric_name)(void);
|
||||
u8 (*get_fabric_proto_ident)(struct se_portal_group *);
|
||||
char *(*tpg_get_wwn)(struct se_portal_group *);
|
||||
@ -124,7 +118,6 @@ int transport_generic_handle_cdb_map(struct se_cmd *);
|
||||
int transport_generic_handle_data(struct se_cmd *);
|
||||
int transport_generic_map_mem_to_cmd(struct se_cmd *cmd,
|
||||
struct scatterlist *, u32, struct scatterlist *, u32);
|
||||
void transport_do_task_sg_chain(struct se_cmd *);
|
||||
int transport_generic_new_cmd(struct se_cmd *);
|
||||
|
||||
void transport_generic_process_write(struct se_cmd *);
|
||||
|
Loading…
Reference in New Issue
Block a user