blob: 9d0c460410440ac4eff9250a814f4dcee4edc1db [file] [log] [blame]
/*
* Copyright (c) 2009 The Regents of the University of California
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* Scheduling and dispatching.
*/
#pragma once
#include <ros/common.h>
#include <sys/queue.h>
#include <corerequest.h>
struct proc; /* process.h includes us, but we need pointers now */
TAILQ_HEAD(proc_list, proc); /* Declares 'struct proc_list' */
/* One of these embedded in every struct proc */
struct sched_proc_data {
TAILQ_ENTRY(proc) proc_link;
struct proc_list *cur_list; /* which tailq we're on */
struct core_request_data crd; /* prov/alloc cores */
/* count of lists? */
/* other accounting info */
};
void schedule_init(void);
/************** Process Management Callbacks **************/
/* Tell the ksched about the process, which it will track cradle-to-grave */
void __sched_proc_register(struct proc *p);
/* The proc was an SCP and is becoming an MCP */
void __sched_proc_change_to_m(struct proc *p);
/* The proc is dying */
void __sched_proc_destroy(struct proc *p, uint32_t *pc_arr, uint32_t nr_cores);
/* Makes sure p is runnable. */
void __sched_mcp_wakeup(struct proc *p);
void __sched_scp_wakeup(struct proc *p);
/* Gets called when a pcore becomes idle (like in proc yield). These are 'cg'
* cores, given to MCPs, that have been async returned to the ksched. */
void __sched_put_idle_core(struct proc *p, uint32_t coreid);
void __sched_put_idle_cores(struct proc *p, uint32_t *pc_arr, uint32_t num);
/************** Decision making **************/
/* Call the main scheduling algorithm. Not clear yet if the main kernel will
* ever call this directly. */
void run_scheduler(void);
/* Proc p's resource desires changed, or something in general that would lead to
* a new decision. The process can directly poke the ksched via a syscall, so
* be careful of abuse. */
void poke_ksched(struct proc *p, unsigned int res_type);
/* The calling cpu/core has nothing to do and plans to idle/halt. This is an
* opportunity to pick the nature of that halting (low power state, etc), or
* provide some other work (_Ss on LL cores). */
void cpu_bored(void);
/* Available resources changed (plus or minus). Some parts of the kernel may
* call this if a particular resource that is 'quantity-based' changes. Things
* like available RAM to processes, bandwidth, etc. Cores would probably be
* inappropriate, since we need to know which specific core is now free. */
void avail_res_changed(int res_type, long change);
/************** Provisioning / Allocating *************/
/* This section is specific to a provisioning ksched. Careful calling any of
* this from generic kernel code, since it might not be present in all kernel
* schedulers. */
int provision_core(struct proc *p, uint32_t pcoreid);
/************** Debugging **************/
void sched_diag(void);
void print_resources(struct proc *p);
void print_all_resources(void);
void next_core_to_alloc(uint32_t pcoreid);
void sort_idle_cores(void);