static void kthread_init(kthread_context_t *k_ctx) { int cpu_affinity_mask, cur_cpu_apic_id; /* cpuid and kthread_app_func are set by the application * over kthread (eg. gtthread). */ k_ctx->pid = syscall(SYS_getpid); k_ctx->tid = syscall(SYS_gettid); /* For priority co-scheduling */ k_ctx->kthread_sched_timer = ksched_priority; k_ctx->kthread_sched_relay = ksched_cosched; /* XXX: kthread runqueue balancing (TBD) */ k_ctx->kthread_runqueue_balance = NULL; /* Initialize kthread runqueue */ kthread_init_runqueue(&(k_ctx->krunqueue)); cpu_affinity_mask = (1 << k_ctx->cpuid); sched_setaffinity(k_ctx->tid,sizeof(unsigned long),&cpu_affinity_mask); sched_yield(); /* Scheduled on target cpu */ k_ctx->cpu_apic_id = kthread_apic_id(); kthread_cpu_map[k_ctx->cpu_apic_id] = k_ctx; return; }
/* called at every kthread_create(). Assumes pcs_init() has already been * called */ void pcs_kthread_init(kthread_t *k_ctx) { gt_spin_lock(&scheduler.lock); pcs_kthread_t *pcs_kthread = pcs_get_kthread(k_ctx); pcs_kthread->k_ctx = k_ctx; kthread_init_runqueue(&pcs_kthread->k_runqueue); pcs_data_t *pcs_data = SCHED_DATA; pcs_data->pcs_kthread_count++; gt_spin_unlock(&scheduler.lock); }