示例#1
0
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;
}
示例#2
0
/* 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);
}