Proc data structure management, env gutting
[akaros.git] / kern / src / resource.c
index d090ecc..1f18c5e 100644 (file)
@@ -15,6 +15,7 @@
 #include <stdio.h>
 #include <assert.h>
 #include <schedule.h>
+#include <hashtable.h>
 
 /* This deals with a request for more cores.  The request is already stored in
  * the proc's amt_wanted (it is compared to amt_granted). 
@@ -45,8 +46,8 @@ ssize_t core_request(struct proc *p)
                env_push_ancillary_state(p);
                proc_set_syscall_retval(&p->env_tf, ESUCCESS);
                // in this case, it's not our job to save contexts or anything
-               proc_take_allcores(p, __death, 0, 0, 0);
-               proc_set_state(p, PROC_RUNNABLE_S);
+               __proc_take_allcores(p, __death, 0, 0, 0);
+               __proc_set_state(p, PROC_RUNNABLE_S);
                schedule_proc(p);
        }
        /* otherwise, see how many new cores are wanted */
@@ -104,7 +105,7 @@ ssize_t core_request(struct proc *p)
                                // will need to give up this core / idle later (sync)
                                need_to_idle = TRUE;
                                // change to runnable_m (it's TF is already saved)
-                               proc_set_state(p, PROC_RUNNABLE_M);
+                               __proc_set_state(p, PROC_RUNNABLE_M);
                                // signals to proc_run that this is a _S to _M transition
                                p->env_flags |= PROC_TRANSITION_TO_M;
                                break;
@@ -119,7 +120,7 @@ ssize_t core_request(struct proc *p)
                                break;
                }
                /* give them the cores.  this will start up the extras if RUNNING_M */
-               proc_give_cores(p, corelist, &num_granted);
+               __proc_give_cores(p, corelist, &num_granted);
                spin_unlock_irqsave(&p->proc_lock);
                /* if there's a race on state (like DEATH), it'll get handled by
                 * proc_run or proc_destroy */
@@ -136,11 +137,12 @@ ssize_t core_request(struct proc *p)
        return num_granted;
 }
 
-error_t resource_req(struct proc *p, int type, size_t amount, uint32_t flags)
+error_t resource_req(struct proc *p, int type, size_t amt_wanted,
+                     size_t amt_wanted_min, uint32_t flags)
 {
        error_t retval;
-       printk("Received request for type: %d, amount: %d, flag: %d\n",
-              type, amount, flags);
+       printk("Received request for type: %d, amt_wanted: %d, amt_wanted_min: %d, "
+              "flag: %d\n", type, amt_wanted, amt_wanted_min, flags);
        if (flags & REQ_ASYNC)
                // We have no sense of time yet, or of half-filling requests
                printk("[kernel] Async requests treated synchronously for now.\n");
@@ -148,12 +150,13 @@ error_t resource_req(struct proc *p, int type, size_t amount, uint32_t flags)
        /* set the desired resource amount in the process's resource list. */
        spin_lock_irqsave(&p->proc_lock);
        size_t old_amount = p->resources[type].amt_wanted;
-       p->resources[type].amt_wanted = amount;
+       p->resources[type].amt_wanted = amt_wanted;
+       p->resources[type].amt_wanted_min = MIN(amt_wanted_min, amt_wanted);
        p->resources[type].flags = flags;
        spin_unlock_irqsave(&p->proc_lock);
 
        // no change in the amt_wanted
-       if (old_amount == amount)
+       if (old_amount == amt_wanted)
                return 0;
 
        switch (type) {
@@ -183,17 +186,21 @@ error_t resource_req(struct proc *p, int type, size_t amount, uint32_t flags)
 void print_resources(struct proc *p)
 {
        printk("--------------------\n");
-       printk("PID: %d\n", p->env_id);
+       printk("PID: %d\n", p->pid);
        printk("--------------------\n");
        for (int i = 0; i < MAX_NUM_RESOURCES; i++)
                printk("Res type: %02d, amt wanted: %08d, amt granted: %08d\n", i,
                       p->resources[i].amt_wanted, p->resources[i].amt_granted);
 }
 
-/* TODO: change this when we get rid of the env array */
 void print_all_resources(void)
 {
-       for (int i = 0; i < NENV; i++)
-               if (envs[i].state != ENV_FREE)
-                       print_resources(&envs[i]);
+       spin_lock(&pid_hash_lock);
+       if (hashtable_count(pid_hash)) {
+               hashtable_itr_t *phtable_i = hashtable_iterator(pid_hash);
+               do {
+                       print_resources(hashtable_iterator_value(phtable_i));
+               } while (hashtable_iterator_advance(phtable_i));
+       }
+       spin_unlock(&pid_hash_lock);
 }