Refactor to move prov stuff to coreprov.c (1/4)
[akaros.git] / kern / src / coreprov.c
1 /* Copyright (c) 2009, 2012, 2015 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * Valmon Leymarie <leymariv@berkeley.edu>
4  * Kevin Klues <klueska@cs.berkeley.edu>
5  * See LICENSE for details.
6  */
7
8 #include <env.h>
9 #include <schedule.h>
10
11 /* Provision a core to proc p. This code assumes that the scheduler that uses
12  * it holds a lock for the duration of the call. */
13 void __provision_core(struct proc *p, struct sched_pcore *spc)
14 {
15         struct sched_pcore_tailq *prov_list;
16         /* If the core is already prov to someone else, take it away.  (last write
17          * wins, some other layer or new func can handle permissions). */
18         if (spc->prov_proc) {
19                 /* the list the spc is on depends on whether it is alloced to the
20                  * prov_proc or not */
21                 prov_list = (spc->alloc_proc == spc->prov_proc ?
22                              &spc->prov_proc->ksched_data.crd.prov_alloc_me :
23                              &spc->prov_proc->ksched_data.crd.prov_not_alloc_me);
24                 TAILQ_REMOVE(prov_list, spc, prov_next);
25         }
26         /* Now prov it to p.  Again, the list it goes on depends on whether it is
27          * alloced to p or not.  Callers can also send in 0 to de-provision. */
28         if (p) {
29                 if (spc->alloc_proc == p) {
30                         TAILQ_INSERT_TAIL(&p->ksched_data.crd.prov_alloc_me, spc,
31                                           prov_next);
32                 } else {
33                         /* this is be the victim list, which can be sorted so that we pick
34                          * the right victim (sort by alloc_proc reverse priority, etc). */
35                         TAILQ_INSERT_TAIL(&p->ksched_data.crd.prov_not_alloc_me, spc,
36                                           prov_next);
37                 }
38         }
39         spc->prov_proc = p;
40 }
41