struct iscsi_thread_set *iscsi_get_thread_set(void) { int allocate_ts = 0; struct completion comp; struct iscsi_thread_set *ts = NULL; /* * If no inactive thread set is available on the first call to * iscsi_get_ts_from_inactive_list(), sleep for a second and * try again. If still none are available after two attempts, * allocate a set ourselves. */ get_set: ts = iscsi_get_ts_from_inactive_list(); if (!ts) { if (allocate_ts == 2) iscsi_allocate_thread_sets(1); init_completion(&comp); wait_for_completion_timeout(&comp, 1 * HZ); allocate_ts++; goto get_set; } ts->delay_inactive = 1; ts->signal_sent = 0; ts->thread_count = 3; init_completion(&ts->rx_restart_comp); init_completion(&ts->tx_restart_comp); init_completion(&ts->deferred_restart_comp); return ts; }
struct iscsi_thread_set *iscsi_get_thread_set(void) { int allocate_ts = 0; struct completion comp; struct iscsi_thread_set *ts = NULL; /* */ get_set: ts = iscsi_get_ts_from_inactive_list(); if (!ts) { if (allocate_ts == 2) iscsi_allocate_thread_sets(1); init_completion(&comp); wait_for_completion_timeout(&comp, 1 * HZ); allocate_ts++; goto get_set; } ts->delay_inactive = 1; ts->signal_sent = 0; ts->thread_count = 2; init_completion(&ts->rx_restart_comp); init_completion(&ts->tx_restart_comp); return ts; }
static void iscsi_check_to_add_additional_sets(void) { int thread_sets_add; spin_lock(&inactive_ts_lock); thread_sets_add = iscsit_global->inactive_ts; spin_unlock(&inactive_ts_lock); if (thread_sets_add == 1) iscsi_allocate_thread_sets(1); }