static void pick_cpu(struct schedproc * proc) { #ifdef CONFIG_SMP unsigned cpu, c; unsigned cpu_load = (unsigned) -1; if (machine.processors_count == 1) { proc->cpu = machine.bsp_id; return; } /* schedule sysytem processes only on the boot cpu */ if (is_system_proc(proc)) { proc->cpu = machine.bsp_id; return; } /* if no other cpu available, try BSP */ cpu = machine.bsp_id; for (c = 0; c < machine.processors_count; c++) { /* skip dead cpus */ if (!cpu_is_available(c)) continue; if (c != machine.bsp_id && cpu_load > cpu_proc[c]) { cpu_load = cpu_proc[c]; cpu = c; } } proc->cpu = cpu; cpu_proc[cpu]++; #else proc->cpu = 0; #endif }
struct cpu_job *__cpu_queue_job(struct cpu_thread *cpu, const char *name, void (*func)(void *data), void *data, bool no_return) { struct cpu_job *job; if (cpu && !cpu_is_available(cpu)) { prerror("CPU: Tried to queue job on unavailable CPU 0x%04x\n", cpu->pir); return NULL; } job = zalloc(sizeof(struct cpu_job)); if (!job) return NULL; job->func = func; job->data = data; job->name = name; job->complete = false; job->no_return = no_return; if (cpu == NULL) { lock(&global_job_queue_lock); list_add_tail(&global_job_queue, &job->link); unlock(&global_job_queue_lock); } else if (cpu != this_cpu()) { lock(&cpu->job_lock); list_add_tail(&cpu->job_queue, &job->link); unlock(&cpu->job_lock); } else { func(data); job->complete = true; } /* XXX Add poking of CPU with interrupt */ return job; }