]> rtime.felk.cvut.cz Git - frescor/frsh.git/blobdiff - resources/cpu_aquosa/lib/aqcpu_fra.c
Allow specification of the local CPU ID using environment variable
[frescor/frsh.git] / resources / cpu_aquosa / lib / aqcpu_fra.c
index 0a9b82cfeaa4249e3ddffbca4ecc091190c09248..2c6a9a53a5dc2425e58d512a40574a6c03c57709 100644 (file)
@@ -56,6 +56,7 @@
 
 
 #include <ul_log.h>
+#include <ul_logreg.h>
 #include <fra_generic.h>
 
 #include "aquosa/qres_lib.h"
@@ -64,7 +65,8 @@
 #include "aqcpu_contract.h"
 
 UL_LOG_CUST(ulogd_fra_aqcpu);
-//ul_log_domain_t ulogd_fra_aqcpu = {UL_LOGL_MSG, "fra_aqcpu"};
+ul_log_domain_t ulogd_fra_aqcpu = {UL_LOGL_MSG, "fra_aqcpu"};
+UL_LOGREG_SINGLE_DOMAIN_INIT_FUNCTION(fra_aqcpu_logreg_domains, ulogd_fra_aqcpu);
 
 static int aqcpu_initialized = 0;              /* initialization flag */
 
@@ -84,6 +86,11 @@ static int aqcpu_create_vres(fres_vres_t *vres, void *priv)
        qres_sid_t sid;
        qos_rv rv;
 
+       if (vres->priv) {
+               errno = -EINVAL;
+               return -1;
+       }
+
        /* get aqcpu params from contract */
        get_aqcpu_params(vres, &cpu_params);
        /* create cpu vres */
@@ -92,7 +99,7 @@ static int aqcpu_create_vres(fres_vres_t *vres, void *priv)
                return qos_rv_int(rv);  
        }
        
-       printf("Created AQCPU VRES(sid=%d period=%lld us, budget=%lld us)\n",
+       ul_logdeb("Created AQCPU VRES(sid=%d period=%lld us, budget=%lld us)\n",
                        sid, cpu_params.P, cpu_params.Q);
        if ((vres->priv = malloc(sizeof(qres_sid_t)))) {
                memcpy(vres->priv, &sid, sizeof(qres_sid_t));
@@ -104,8 +111,8 @@ static int aqcpu_create_vres(fres_vres_t *vres, void *priv)
 /*
  * aqcpu_cancel_vres(), cancels vres 
  *
- * The thread bound to the vres are unbound, and so, detached from their
- * AQuoSA resource reservation servers and continue their execution according
+ * The threads bound to the vres are unbound, and so, detached from their
+ * AQuoSA resource reservation server and continue their execution according
  * to the standard Linux scheduler policies.
  *
  */
@@ -114,7 +121,7 @@ static int aqcpu_cancel_vres(fres_vres_t *vres, void *priv)
        qres_sid_t sid;
        qos_rv qrv;
        
-       if (vres->priv) {
+       if (!vres->priv) {
                errno = -EINVAL;
                return -1;
        }
@@ -124,7 +131,7 @@ static int aqcpu_cancel_vres(fres_vres_t *vres, void *priv)
        if (qrv != QOS_OK) {
                return qos_rv_int(qrv);
        }
-       printf("Canceled AQCPU VRES(sid=%d)\n",sid);
+       ul_logdeb("Canceled AQCPU VRES(sid=%d)\n",sid);
        free(vres->priv);
 
        return 0;
@@ -146,7 +153,7 @@ int aqcpu_change_vres(fres_vres_t *vres, void *priv)
        qres_sid_t sid;
        qos_rv qrv;
        
-       if (vres->priv) {
+       if (!vres->priv) {
                errno = -EINVAL;
                return -1;
        }
@@ -157,6 +164,8 @@ int aqcpu_change_vres(fres_vres_t *vres, void *priv)
        
        /* set cpu params */
        qrv = qres_set_params(sid, &cpu_params);
+
+       vres->perceived = vres->new;
        
        ul_logmsg("AQCPU VRES(sid=%d) params changed(period=%lld us,"
                        "budget=%lld us)\n",sid, cpu_params.P,cpu_params.Q);
@@ -173,6 +182,7 @@ static inline void aqcpu_cleanup_wrapper() {
        qres_cleanup();
 }
 
+#if 0
 static
 int aqcpu_fra_exit()
 {
@@ -181,6 +191,7 @@ int aqcpu_fra_exit()
        rv = qres_cleanup();
        return qos_rv_int(rv);
 }
+#endif
 
 static
 int fra_CPU_bind_thread
@@ -295,7 +306,7 @@ int fra_CPU_set_spare_bandwidth(fres_vres_t *vres)
        rv = qsup_reserve_spare(r2bw(cpu_params.Q, cpu_params.P));
        if (rv != QOS_OK) return qos_rv_int(rv);
 
-       printf("Created AQCPU spare (period=%lld us, budget=%lld us)\n",
+       ul_logdeb("Created AQCPU spare (period=%lld us, budget=%lld us)\n",
                        cpu_params.P, cpu_params.Q);
        if ((vres->priv = malloc(sizeof(qres_sid_t)))) {
                memcpy(vres->priv, &fake_sid, sizeof(qres_sid_t));
@@ -367,9 +378,31 @@ int fra_CPU_get_actual_budget
        return 0;
 }
 
+int aqcpu_fra_activate(forb_orb orb)
+{
+       qos_rv qrv;
+       if ((qrv = qres_init()) != QOS_OK) {
+               if (qrv == QOS_E_MISSING_COMPONENT) {
+                       return FRES_ERR_KERNEL_SUPPORT_MISSING;
+               } else
+                       return FRSH_ERR_INTERNAL_ERROR;
+       }
+
+       /* install the cleanup function of th AQuoSA framework as an exit
+        * handler function (quite futile but, for now, it's sufficent) */
+       if (atexit(aqcpu_cleanup_wrapper)) {
+               qres_cleanup();
+               return(FRSH_ERR_INTERNAL_ERROR);
+       }
+
+       aqcpu_initialized = 1;
+
+       return 0;
+}
+
 static struct fres_allocator aqcpu_allocator = {
        .res_type = FRSH_RT_PROCESSOR,
-       .res_id = 0,  /* CPU ID 0 */
+       .res_id = FRSH_CPU_ID_DEFAULT,  /* CPU ID 0 */
        .create_vres = aqcpu_create_vres,
        .cancel_vres = aqcpu_cancel_vres,
        .change_vres = aqcpu_change_vres,
@@ -385,6 +418,8 @@ static struct fres_allocator aqcpu_allocator = {
        .get_desired_budget = fra_CPU_get_desired_budget,
        .set_desired_budget = fra_CPU_set_desired_budget,
        .get_actual_budget = fra_CPU_get_actual_budget,
+
+       .activate_callback = aqcpu_fra_activate,
        
        .priv = NULL
 };
@@ -406,24 +441,13 @@ static struct fres_allocator aqcpu_allocator = {
  */
 int aqcpu_fra_init(void)
 {
-       qos_rv qrv;
        int rv;
 
-       if ((qrv = qres_init()) != QOS_OK) {
-               return -1;
-       }
-
+       aqcpu_allocator.res_id = frsh_get_local_cpu_id();
+               
        if ((rv = fra_register(&aqcpu_allocator))) {
-               qres_cleanup();
                return rv;
        }
        
-       /* install the cleanup function of th AQuoSA framework as an exit
-        * handler function (quite futile but, for now, it's sufficent) */
-       if (atexit(aqcpu_cleanup_wrapper))
-               return(FRSH_ERR_INTERNAL_ERROR);
-
-       aqcpu_initialized = 1;
-
        return 0;
 }