105 ocs_io_pool_t *io_pool;
108 io_pool = ocs_malloc(ocs,
sizeof(*io_pool), OCS_M_ZERO | OCS_M_NOWAIT);
110 ocs_log_err(ocs,
"allocate of IO pool failed\n");
115 io_pool->io_num_ios = num_io;
118 ocs_lock_init(ocs, &io_pool->lock,
"io_pool lock[%d]", ocs->instance_index);
120 io_pool->pool =
ocs_pool_alloc(ocs,
sizeof(ocs_io_t), io_pool->io_num_ios, FALSE);
121 if (!io_pool->pool) {
122 ocs_log_err(ocs,
"allocation of memory IO pool failed\n");
126 for (i = 0; i < io_pool->io_num_ios; i++) {
129 ocs_log_err(ocs,
"ocs_pool_get_instance failed\n");
134 io->instance_index = i;
138 if (ocs->enable_ini) {
141 ocs_log_err(ocs,
"ocs_dma_alloc cmdbuf failed\n");
149 ocs_log_err(ocs,
"ocs_dma_alloc rspbuf failed\n");
154 io->sgl_allocated = num_sgl;
156 io->sgl = ocs_malloc(ocs,
sizeof(*io->sgl) * num_sgl, OCS_M_NOWAIT | OCS_M_ZERO);
158 ocs_log_err(ocs,
"malloc sgl's failed\n");
197 for (i = 0; i < io_pool->io_num_ios; i++) {
207 ocs_free(ocs, io->sgl,
sizeof(*io->sgl) * io->sgl_allocated);
210 io->sgl_allocated = 0;
212 ocs_dma_free(ocs, &io->cmdbuf);
213 ocs_dma_free(ocs, &io->rspbuf);
219 ocs_lock_free(&io_pool->lock);
220 ocs_free(ocs, io_pool,
sizeof(*io_pool));
221 ocs->xport->io_pool = NULL;
227 return io_pool->io_num_ios;
248 ocs_lock(&io_pool->lock);
250 ocs_unlock(&io_pool->lock);
259 io->tgt_task_tag = 0;
260 io->init_task_tag = 0;
262 io->display_name =
"pending";
264 io->els_req_free = 0;
267 ocs_atomic_add_return(&ocs->xport->io_active_count, 1);
268 ocs_atomic_add_return(&ocs->xport->io_total_alloc, 1);
270 ocs_unlock(&io_pool->lock);
286 ocs_hal_io_t *hio = NULL;
292 ocs_lock(&io_pool->lock);
297 ocs_unlock(&io_pool->lock);
302 ocs_atomic_sub_return(&ocs->xport->io_active_count, 1);
303 ocs_atomic_add_return(&ocs->xport->io_total_free, 1);
320 ocs_lock(&node->active_ios_lock);
322 if ((io->cmd_tgt && (io->init_task_tag == ox_id)) &&
323 ((rx_id == 0xffff) || (io->tgt_task_tag == rx_id))) {
326 ocs_unlock(&node->active_ios_lock);
343 ocs_lock(&node->active_ios_lock);
345 if ((io->cmd_ini && (io->init_task_tag == ox_id))) {
349 ocs_unlock(&node->active_ios_lock);
368 ocs_xport_t *xport = ocs->xport;
369 ocs_io_pool_t *io_pool = xport->io_pool;
391 ocs_ddump_value(textbuf,
"ref_count",
"%d", ocs_ref_read_count(&io->ref));
404 #if defined(OCS_INCLUDE_SCST)
454 ocs_io_t *io = (ocs_io_t *)
object;
456 snprintf(qualifier,
sizeof(qualifier),
"%s/io[%d]", parent, io->instance_index);
459 if (ocs_strncmp(name, qualifier, strlen(qualifier)) == 0) {
460 char *unqualified_name = name + strlen(qualifier) +1;
463 if (ocs_strcmp(unqualified_name,
"display_name") == 0) {
466 }
else if (ocs_strcmp(unqualified_name,
"init_task_tag") == 0) {
469 }
else if (ocs_strcmp(unqualified_name,
"tgt_task_tag") == 0) {
472 }
else if (ocs_strcmp(unqualified_name,
"hw_tag") == 0) {
475 }
else if (ocs_strcmp(unqualified_name,
"tag") == 0) {
478 }
else if (ocs_strcmp(unqualified_name,
"transferred") == 0) {
481 }
else if (ocs_strcmp(unqualified_name,
"auto_resp") == 0) {
484 }
else if (ocs_strcmp(unqualified_name,
"exp_xfer_len") == 0) {
487 }
else if (ocs_strcmp(unqualified_name,
"xfer_req") == 0) {
499 ocs_io_t *io = (ocs_io_t *)
object;
int32_t ocs_hal_io_free(ocs_hal_t *hal, ocs_hal_io_t *io)
Free a previously-allocated HAL IO object.
static int32_t ocs_io_busy(ocs_io_t *io)
Test if IO object is busy.
static int32_t ocs_list_on_list(ocs_list_link_t *link)
Test if object is on a list.
int32_t ocs_scsi_tgt_io_exit(ocs_io_t *io)
Un-initialize SCSI IO.
ocs_io_pool_t * ocs_io_pool_create(ocs_t *ocs, uint32_t num_io, uint32_t num_sgl)
Create a pool of IO objects.
ocs_io_t * ocs_io_pool_io_alloc(ocs_io_pool_t *io_pool)
Allocate an object used to track an IO.
void * ocs_pool_get(ocs_pool_t *pool)
Allocate a memory pool item.
int32_t ocs_scsi_tgt_io_init(ocs_io_t *io)
Initialize SCSI IO.
uint32_t ocs_scsi_tgt_io_state(ocs_io_t *io)
Set SCST IO state.
void ocs_mgmt_emit_int(ocs_textbuf_t *textbuf, int mode, const char *name, const char *fmt,...)
Generate a property with an integer value in a management XML document.
void ocs_pool_put_head(ocs_pool_t *pool, void *item)
free memory pool item
ocs_io_t * ocs_io_find_init_els_io(ocs_t *ocs, ocs_node_t *node, uint16_t ox_id)
Find an els I/O given it's node and ox_id.
void ocs_mgmt_io_get_all(ocs_textbuf_t *textbuf, void *io)
void ocs_ddump_section(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section start data.
int32_t ocs_scsi_ini_io_exit(ocs_io_t *io)
Uninitialize SCSI IO.
int const char const char void ocs_mgmt_emit_boolean(ocs_textbuf_t *textbuf, int access, const char *name, const int value)
Generate a property with a boolean value in a management XML document.
ocs_pool_t * ocs_pool_alloc(ocs_os_handle_t os, uint32_t size, uint32_t count, uint32_t use_lock)
Allocate a memory pool.
void ocs_pool_free(ocs_pool_t *pool)
Free a previously allocated memory pool.
int32_t ocs_scsi_ini_io_init(ocs_io_t *io)
Initialize SCSI IO.
void ocs_io_pool_io_free(ocs_io_pool_t *io_pool, ocs_io_t *io)
Free an object used to track an IO.
uint32_t ocs_io_pool_allocated(ocs_io_pool_t *io_pool)
void ocs_mgmt_io_list(ocs_textbuf_t *textbuf, void *io)
ocs_io_t * ocs_io_get_instance(ocs_t *ocs, uint32_t index)
Return IO context given the instance index.
void * ocs_pool_get_instance(ocs_pool_t *pool, uint32_t idx)
Return item given an index.
void ocs_ddump_endsection(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section end data.
ocs_mgmt_get_list_handler get_list_handler
#define SCSI_RSP_BUF_LENGTH
#define SCSI_CMD_BUF_LENGTH
FCP IO context.
void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
void ocs_ddump_io(ocs_textbuf_t *textbuf, ocs_io_t *io)
Generate IO context ddump data.
static ocs_mgmt_functions_t io_mgmt_functions
int32_t ocs_io_pool_free(ocs_io_pool_t *io_pool)
Free IO objects pool.
int ocs_mgmt_io_get(ocs_textbuf_t *textbuf, char *parent, char *name, void *io)
#define ocs_assert(cond,...)
void ocs_mgmt_emit_string(ocs_textbuf_t *textbuf, int access, const char *name, const char *value)
Generate a property with a string value in a management XML document.
ocs_io_t * ocs_io_find_tgt_io(ocs_t *ocs, ocs_node_t *node, uint16_t ox_id, uint16_t rx_id)
Find an I/O given it's node and ox_id.
#define ocs_list_foreach(list, item)
Iterate a linked list.
void ocs_mgmt_emit_property_name(ocs_textbuf_t *textbuf, int access, const char *name)
Generate a property, with no value, in a management XML document.
void ocs_ddump_value(ocs_textbuf_t *textbuf, const char *name, const char *fmt,...)
Generate driver dump data for a given value.
void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)