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: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
03aa207060
commit
cdb726651c
@ -489,6 +489,7 @@ static struct iscsit_transport iscsi_target_transport = {
|
|||||||
.iscsit_setup_np = iscsit_setup_np,
|
.iscsit_setup_np = iscsit_setup_np,
|
||||||
.iscsit_accept_np = iscsit_accept_np,
|
.iscsit_accept_np = iscsit_accept_np,
|
||||||
.iscsit_free_np = iscsit_free_np,
|
.iscsit_free_np = iscsit_free_np,
|
||||||
|
.iscsit_alloc_cmd = iscsit_alloc_cmd,
|
||||||
.iscsit_get_login_rx = iscsit_get_login_rx,
|
.iscsit_get_login_rx = iscsit_get_login_rx,
|
||||||
.iscsit_put_login_tx = iscsit_put_login_tx,
|
.iscsit_put_login_tx = iscsit_put_login_tx,
|
||||||
};
|
};
|
||||||
|
@ -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);
|
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 */
|
/* End functions for target_core_fabric_ops */
|
||||||
|
@ -485,6 +485,7 @@ struct iscsi_cmd {
|
|||||||
u32 first_data_sg_off;
|
u32 first_data_sg_off;
|
||||||
u32 kmapped_nents;
|
u32 kmapped_nents;
|
||||||
sense_reason_t sense_reason;
|
sense_reason_t sense_reason;
|
||||||
|
void (*release_cmd)(struct iscsi_cmd *);
|
||||||
} ____cacheline_aligned;
|
} ____cacheline_aligned;
|
||||||
|
|
||||||
struct iscsi_tmr_req {
|
struct iscsi_tmr_req {
|
||||||
|
@ -149,6 +149,18 @@ void iscsit_free_r2ts_from_list(struct iscsi_cmd *cmd)
|
|||||||
spin_unlock_bh(&cmd->r2t_lock);
|
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
|
* May be called from software interrupt (timer) context for allocating
|
||||||
* iSCSI NopINs.
|
* iSCSI NopINs.
|
||||||
@ -157,13 +169,12 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, gfp_t gfp_mask)
|
|||||||
{
|
{
|
||||||
struct iscsi_cmd *cmd;
|
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) {
|
if (!cmd) {
|
||||||
pr_err("Unable to allocate memory for struct iscsi_cmd.\n");
|
pr_err("Unable to allocate memory for struct iscsi_cmd.\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
cmd->conn = conn;
|
||||||
cmd->conn = conn;
|
|
||||||
INIT_LIST_HEAD(&cmd->i_conn_node);
|
INIT_LIST_HEAD(&cmd->i_conn_node);
|
||||||
INIT_LIST_HEAD(&cmd->datain_list);
|
INIT_LIST_HEAD(&cmd->datain_list);
|
||||||
INIT_LIST_HEAD(&cmd->cmd_r2t_list);
|
INIT_LIST_HEAD(&cmd->cmd_r2t_list);
|
||||||
@ -176,6 +187,7 @@ struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *conn, gfp_t gfp_mask)
|
|||||||
|
|
||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(iscsit_allocate_cmd);
|
||||||
|
|
||||||
struct iscsi_seq *iscsit_get_seq_holder_for_datain(
|
struct iscsi_seq *iscsit_get_seq_holder_for_datain(
|
||||||
struct iscsi_cmd *cmd,
|
struct iscsi_cmd *cmd,
|
||||||
@ -690,6 +702,11 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd)
|
|||||||
*/
|
*/
|
||||||
switch (cmd->iscsi_opcode) {
|
switch (cmd->iscsi_opcode) {
|
||||||
case ISCSI_OP_SCSI_CMD:
|
case ISCSI_OP_SCSI_CMD:
|
||||||
|
if (cmd->data_direction == DMA_TO_DEVICE)
|
||||||
|
iscsit_stop_dataout_timer(cmd);
|
||||||
|
/*
|
||||||
|
* Fallthrough
|
||||||
|
*/
|
||||||
case ISCSI_OP_SCSI_TMFUNC:
|
case ISCSI_OP_SCSI_TMFUNC:
|
||||||
transport_generic_free_cmd(&cmd->se_cmd, 1);
|
transport_generic_free_cmd(&cmd->se_cmd, 1);
|
||||||
break;
|
break;
|
||||||
@ -705,7 +722,7 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd)
|
|||||||
}
|
}
|
||||||
/* Fall-through */
|
/* Fall-through */
|
||||||
default:
|
default:
|
||||||
iscsit_release_cmd(cmd);
|
cmd->release_cmd(cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 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_r2t(struct iscsi_r2t *, struct iscsi_cmd *);
|
||||||
extern void iscsit_free_r2ts_from_list(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_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_datain(struct iscsi_cmd *, u32);
|
||||||
extern struct iscsi_seq *iscsit_get_seq_holder_for_r2t(struct iscsi_cmd *);
|
extern struct iscsi_seq *iscsit_get_seq_holder_for_r2t(struct iscsi_cmd *);
|
||||||
|
Loading…
Reference in New Issue
Block a user