57 ocs_log_debug(NULL,
"%s: ramd running %p\n", mythread->name, thr->
cmd_queue);
58 while (!ocs_thread_terminate_requested(mythread)) {
70 ocs_log_test(NULL,
"ocs_scsi_recv_cmd_common returned %d\n", rc);
79 ocs_log_test(NULL,
"_scsi_dataphase_cb returned %d\n", rc);
88 ocs_log_test(NULL,
"_scsi_io_cb returned %d\n", rc);
108 uint32_t num_cpus = ocs_get_num_cpus();
122 ocs_log_err(NULL,
"ocs_cbuf_alloc cmd_free_queue failed\n");
130 ramd_threads = ocs_malloc(NULL, num_cpus *
sizeof(
ocs_ramd_thread_t*), OCS_M_ZERO | OCS_M_NOWAIT);
131 for (i = 0; i < num_cpus; i++) {
135 for (i = 0; i < num_cpus; i++) {
139 for (cpuidx = 0; cpuidx < num_cpus; cpuidx++) {
142 pthr = &ramd_threads[cpuidx][thridx];
147 ocs_log_err(NULL,
"ocs_cbuf_alloc failed\n");
153 ocs_snprintf(name,
sizeof(name),
"ocs_ramd:%d:%d", cpuidx, thridx);
156 pthr, OCS_THREAD_CREATE);
158 ocs_log_err(NULL,
"ocs_thread_create failed: %d\n", rc);
166 rc = ocs_thread_setcpu(&pthr->
thread, cpuidx);
168 ocs_log_debug(NULL,
"thread %s locked to cpu %d\n", pthr->
thread.name,
169 pthr->
thread.cpu_affinity);
174 for (cpuidx = 0; cpuidx < num_cpus; cpuidx++) {
177 pthr = &ramd_threads[cpuidx][thridx];
179 ocs_thread_start(&pthr->
thread);
189 uint32_t num_cpus = ocs_get_num_cpus();
197 for (cpuidx = 0; cpuidx < num_cpus; cpuidx++) {
199 pthr = &ramd_threads[cpuidx][thridx];
201 rc = ocs_thread_terminate(&pthr->
thread);
203 ocs_log_test(NULL,
"ocs_thread_terminate failed: %d\n", rc);
212 ocs_free(NULL, ramd_threads, num_cpus *
sizeof(*ramd_threads));
223 uint32_t num_cpus = ocs_get_num_cpus();
230 if (ramd_threads != NULL) {
232 for (instance = 0., cpuidx = 0; cpuidx < num_cpus; cpuidx++) {
234 pthr = &ramd_threads[cpuidx][thridx];
275 uint32_t num_cpus = ocs_get_num_cpus();
285 ocs_log_test(io->ocs,
"ocs_cbuf_get() free queue failed\n");
298 cpuidx = io->init_task_tag % num_cpus;
301 pthr = &ramd_threads[cpuidx][idx];
304 io->tgt_io.thr = pthr;
308 ocs_log_test(io->ocs,
"ocs_cbuf_put() failed: %d\n", rc);
323 if (io->tgt_io.thr == NULL) {
329 ocs_log_test(io->ocs,
"ocs_cbuf_get() free queue failed\n");
339 pthr = io->tgt_io.thr;
343 ocs_log_test(io->ocs,
"ocs_cbuf_put failed: %d\n", rc);
357 if (io->tgt_io.thr == NULL) {
363 ocs_log_test(io->ocs,
"ocs_cbuf_get() free queue failed\n");
373 pthr = io->tgt_io.thr;
377 ocs_log_test(io->ocs,
"ocs_cbuf_put failed: %d\n", rc);
397 cpu = ox_id % ocs_get_num_cpus();
401 ocs_log_test(NULL,
"ocs_cbuf_get() free queue failed\n");
410 pthr = &ramd_threads[cpu][idx];
414 ocs_log_test(NULL,
"ocs_cbuf_put failed: %d\n", rc);
static uint32_t threads_per_cpu
ocs_ramd_cmd_io_cb_t io_cb
void ocs_ramd_tgt_bounce(void(*fctn)(void *arg), void *arg, uint32_t s_id, uint32_t d_id, uint32_t ox_id)
uint32_t ocs_ramd_get_enable_ramd_threading(void)
int32_t _scsi_io_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
Response phase callback.
void ocs_cbuf_free(ocs_cbuf_t *cbuf)
Free a circular buffer.
int32_t _ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags)
Receive an FCP SCSI command.
static uint32_t thread_cmds
ocs_scsi_io_status_e scsi_status
int32_t _scsi_dataphase_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
Command data phase callback.
static ocs_cbuf_t * ramd_cmd_free_queue
void ocs_ddump_section(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section start data.
static uint32_t enable_ramd_threading
ocs_ramd_cmd_e ramd_cmd_type
void ocs_ramd_stop_threads(void)
uint32_t cmd_count[OCS_RAMD_CMD_MAX]
void ocs_ramd_thread_ddump(ocs_textbuf_t *textbuf)
int32_t ocs_ramd_start_threads(uint32_t threading_mode, uint32_t arg_thread_cmds)
ocs_array_t * ocs_array_alloc(ocs_os_handle_t os, uint32_t size, uint32_t count)
Allocate an array object.
void ocs_array_free(ocs_array_t *array)
Free an array object.
void * ocs_cbuf_get(ocs_cbuf_t *cbuf, int32_t timeout_usec)
Get pointer to buffer.
int32_t ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags)
void ocs_ddump_endsection(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section end data.
int32_t scsi_io_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
int32_t ocs_cbuf_prime(ocs_cbuf_t *cbuf, ocs_array_t *array)
Prime a circular buffer data.
static int32_t ocs_ramd_server_thread(ocs_thread_t *mythread)
static ocs_atomic_t * ramd_threads_next
ocs_ramd_cmd_dataphase_cb_t dataphase_cb
ocs_cbuf_t * ocs_cbuf_alloc(ocs_os_handle_t os, uint32_t entry_count)
Initialize a circular buffer queue.
static ocs_ramd_thread_t ** ramd_threads
static ocs_array_t * ramd_cmd_array
ocs_scsi_io_status_e scsi_status
#define ocs_assert(cond,...)
int32_t ocs_cbuf_put(ocs_cbuf_t *cbuf, void *elem)
write a buffer
ocs_ramd_cmd_recv_cmd_t recv_cmd
int32_t scsi_dataphase_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
union ocs_ramd_cmd_t::@55 ramd_cmd
ocs_ramd_cmd_bounce_t bounce
void ocs_ddump_value(ocs_textbuf_t *textbuf, const char *name, const char *fmt,...)
Generate driver dump data for a given value.