Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cdb72665 authored by Nicholas Bellinger's avatar Nicholas Bellinger
Browse files

iscsi-target: Add per transport iscsi_cmd alloc/free



This patch converts struct iscsi_cmd memory allocation + free to use
->iscsit_alloc_cmd() iscsit_transport API caller, and export
iscsit_allocate_cmd() symbols

Also add iscsi_cmd->release_cmd() to be used seperately from
iscsit_transport for connection/session shutdown.

v2 changes:

- Remove unnecessary checks in iscsit_alloc_cmd (asias)
- Drop iscsit_transport->iscsit_free_cmd() usage
- Drop iscsit_transport->iscsit_unmap_cmd() usage
- Add iscsi_cmd->release_cmd()
- Convert lio_release_cmd() to use iscsi_cmd->release_cmd()

Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 03aa2070
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -489,6 +489,7 @@ static struct iscsit_transport iscsi_target_transport = {
	.iscsit_setup_np	= iscsit_setup_np,
	.iscsit_accept_np	= iscsit_accept_np,
	.iscsit_free_np		= iscsit_free_np,
	.iscsit_alloc_cmd	= iscsit_alloc_cmd,
	.iscsit_get_login_rx	= iscsit_get_login_rx,
	.iscsit_put_login_tx	= iscsit_put_login_tx,
};
+2 −1
Original line number Diff line number Diff line
@@ -1700,7 +1700,8 @@ static void lio_release_cmd(struct se_cmd *se_cmd)
{
	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);

	iscsit_release_cmd(cmd);
	pr_debug("Entering lio_release_cmd for se_cmd: %p\n", se_cmd);
	cmd->release_cmd(cmd);
}

/* End functions for target_core_fabric_ops */
+1 −0
Original line number Diff line number Diff line
@@ -485,6 +485,7 @@ struct iscsi_cmd {
	u32			first_data_sg_off;
	u32			kmapped_nents;
	sense_reason_t		sense_reason;
	void (*release_cmd)(struct iscsi_cmd *);
}  ____cacheline_aligned;

struct iscsi_tmr_req {
+21 −4
Original line number Diff line number Diff line
@@ -149,6 +149,18 @@ void iscsit_free_r2ts_from_list(struct iscsi_cmd *cmd)
	spin_unlock_bh(&cmd->r2t_lock);
}

struct iscsi_cmd *iscsit_alloc_cmd(struct iscsi_conn *conn, gfp_t gfp_mask)
{
	struct iscsi_cmd *cmd;

	cmd = kmem_cache_zalloc(lio_cmd_cache, gfp_mask);
	if (!cmd)
		return NULL;

	cmd->release_cmd = &iscsit_release_cmd;
	return cmd;
}

/*
 * May be called from software interrupt (timer) context for allocating
 * iSCSI NopINs.
@@ -157,12 +169,11 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, gfp_t gfp_mask)
{
	struct iscsi_cmd *cmd;

	cmd = kmem_cache_zalloc(lio_cmd_cache, gfp_mask);
	cmd = conn->conn_transport->iscsit_alloc_cmd(conn, gfp_mask);
	if (!cmd) {
		pr_err("Unable to allocate memory for struct iscsi_cmd.\n");
		return NULL;
	}

	cmd->conn = conn;
	INIT_LIST_HEAD(&cmd->i_conn_node);
	INIT_LIST_HEAD(&cmd->datain_list);
@@ -176,6 +187,7 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, gfp_t gfp_mask)

	return cmd;
}
EXPORT_SYMBOL(iscsit_allocate_cmd);

struct iscsi_seq *iscsit_get_seq_holder_for_datain(
	struct iscsi_cmd *cmd,
@@ -690,6 +702,11 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd)
	 */
	switch (cmd->iscsi_opcode) {
	case ISCSI_OP_SCSI_CMD:
		if (cmd->data_direction == DMA_TO_DEVICE)
			iscsit_stop_dataout_timer(cmd);
		/*
		 * Fallthrough
		 */
	case ISCSI_OP_SCSI_TMFUNC:
		transport_generic_free_cmd(&cmd->se_cmd, 1);
		break;
@@ -705,7 +722,7 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd)
		}
		/* Fall-through */
	default:
		iscsit_release_cmd(cmd);
		cmd->release_cmd(cmd);
		break;
	}
}
+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ extern struct iscsi_r2t *iscsit_get_r2t_for_eos(struct iscsi_cmd *, u32, u32);
extern struct iscsi_r2t *iscsit_get_r2t_from_list(struct iscsi_cmd *);
extern void iscsit_free_r2t(struct iscsi_r2t *, struct iscsi_cmd *);
extern void iscsit_free_r2ts_from_list(struct iscsi_cmd *);
extern struct iscsi_cmd *iscsit_alloc_cmd(struct iscsi_conn *, gfp_t);
extern struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *, gfp_t);
extern struct iscsi_seq *iscsit_get_seq_holder_for_datain(struct iscsi_cmd *, u32);
extern struct iscsi_seq *iscsit_get_seq_holder_for_r2t(struct iscsi_cmd *);