xref: /spdk/lib/iscsi/task.c (revision 90ba272cee71afa2cb11f6de7581b601d2e44cfe)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2d29384bfSBen Walker  *   Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
3a6dbe372Spaul luse  *   Copyright (C) 2016 Intel Corporation.
4d29384bfSBen Walker  *   All rights reserved.
5d29384bfSBen Walker  */
6d29384bfSBen Walker 
78acb3630SZiye Yang #include "spdk/env.h"
8d29384bfSBen Walker #include "spdk/log.h"
919a98714SDaniel Verkamp #include "iscsi/conn.h"
10d29384bfSBen Walker #include "iscsi/task.h"
11*90ba272cSChangqi Lu #include "iscsi/tgt_node.h"
12d29384bfSBen Walker 
13d29384bfSBen Walker static void
iscsi_task_free(struct spdk_scsi_task * scsi_task)14893e02a5SShuhei Matsumoto iscsi_task_free(struct spdk_scsi_task *scsi_task)
15d29384bfSBen Walker {
16*90ba272cSChangqi Lu 	uint64_t tsc_diff;
17356cb233SShuhei Matsumoto 	struct spdk_iscsi_task *task = iscsi_task_from_scsi_task(scsi_task);
1819a98714SDaniel Verkamp 
19*90ba272cSChangqi Lu 	if (task->conn->target->histogram) {
20*90ba272cSChangqi Lu 		tsc_diff = spdk_get_ticks() - task->start_tsc;
21*90ba272cSChangqi Lu 		spdk_histogram_data_tally(task->conn->target->histogram, tsc_diff);
22*90ba272cSChangqi Lu 	}
23*90ba272cSChangqi Lu 
24e45437abSDaniel Verkamp 	if (task->parent) {
25fe5a9696SZiye Yang 		if (task->scsi.dxfer_dir == SPDK_SCSI_DIR_FROM_DEV) {
26fe5a9696SZiye Yang 			assert(task->conn->data_in_cnt > 0);
27fe5a9696SZiye Yang 			task->conn->data_in_cnt--;
28fe5a9696SZiye Yang 		}
29fe5a9696SZiye Yang 
30e45437abSDaniel Verkamp 		spdk_scsi_task_put(&task->parent->scsi);
31e45437abSDaniel Verkamp 		task->parent = NULL;
32e45437abSDaniel Verkamp 	}
33e45437abSDaniel Verkamp 
34ce43ae21SShuhei Matsumoto 	if (iscsi_task_get_mobj(task)) {
35ce43ae21SShuhei Matsumoto 		iscsi_datapool_put(iscsi_task_get_mobj(task));
36ce43ae21SShuhei Matsumoto 	}
37ce43ae21SShuhei Matsumoto 
38356cb233SShuhei Matsumoto 	iscsi_task_disassociate_pdu(task);
3919a98714SDaniel Verkamp 	assert(task->conn->pending_task_cnt > 0);
4019a98714SDaniel Verkamp 	task->conn->pending_task_cnt--;
41be1489b9SShuhei Matsumoto 	spdk_mempool_put(g_iscsi.task_pool, (void *)task);
42d29384bfSBen Walker }
43d29384bfSBen Walker 
44d29384bfSBen Walker struct spdk_iscsi_task *
iscsi_task_get(struct spdk_iscsi_conn * conn,struct spdk_iscsi_task * parent,spdk_scsi_task_cpl cpl_fn)45356cb233SShuhei Matsumoto iscsi_task_get(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *parent,
4641852055SBen Walker 	       spdk_scsi_task_cpl cpl_fn)
47d29384bfSBen Walker {
48d29384bfSBen Walker 	struct spdk_iscsi_task *task;
49d29384bfSBen Walker 
50be1489b9SShuhei Matsumoto 	task = spdk_mempool_get(g_iscsi.task_pool);
518acb3630SZiye Yang 	if (!task) {
52d29384bfSBen Walker 		SPDK_ERRLOG("Unable to get task\n");
53bb8451ccSDaniel Verkamp 		abort();
54d29384bfSBen Walker 	}
55d29384bfSBen Walker 
56fe5a9696SZiye Yang 	assert(conn != NULL);
57d29384bfSBen Walker 	memset(task, 0, sizeof(*task));
58*90ba272cSChangqi Lu 	task->start_tsc = spdk_get_ticks();
5919a98714SDaniel Verkamp 	task->conn = conn;
6019a98714SDaniel Verkamp 	assert(conn->pending_task_cnt < UINT32_MAX);
6119a98714SDaniel Verkamp 	conn->pending_task_cnt++;
62133dc1e6SDaniel Verkamp 	spdk_scsi_task_construct(&task->scsi,
6341852055SBen Walker 				 cpl_fn,
64893e02a5SShuhei Matsumoto 				 iscsi_task_free);
65414b7545SDaniel Verkamp 	if (parent) {
66e45437abSDaniel Verkamp 		parent->scsi.ref++;
67e45437abSDaniel Verkamp 		task->parent = parent;
68414b7545SDaniel Verkamp 		task->tag = parent->tag;
691bec7d57SShuhei Matsumoto 		task->lun_id = parent->lun_id;
70e45437abSDaniel Verkamp 		task->scsi.dxfer_dir = parent->scsi.dxfer_dir;
71e45437abSDaniel Verkamp 		task->scsi.transfer_len = parent->scsi.transfer_len;
72e45437abSDaniel Verkamp 		task->scsi.lun = parent->scsi.lun;
73e45437abSDaniel Verkamp 		task->scsi.cdb = parent->scsi.cdb;
74e45437abSDaniel Verkamp 		task->scsi.target_port = parent->scsi.target_port;
75e45437abSDaniel Verkamp 		task->scsi.initiator_port = parent->scsi.initiator_port;
76fe5a9696SZiye Yang 		if (task->scsi.dxfer_dir == SPDK_SCSI_DIR_FROM_DEV) {
77fe5a9696SZiye Yang 			conn->data_in_cnt++;
78fe5a9696SZiye Yang 		}
79414b7545SDaniel Verkamp 	}
80d29384bfSBen Walker 
81d29384bfSBen Walker 	return task;
82d29384bfSBen Walker }
83