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