]> 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 c9acd50f8d4c70561d4eec0dbae1c5af1fb2867a..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;
@@ -139,13 +146,14 @@ static int aqcpu_cancel_vres(fres_vres_t *vres, void *priv)
  * possible.
  *
  */
+static
 int aqcpu_change_vres(fres_vres_t *vres, void *priv)
 {
        aqcpu_params_t cpu_params;
        qres_sid_t sid;
        qos_rv qrv;
        
-       if (vres->priv) {
+       if (!vres->priv) {
                errno = -EINVAL;
                return -1;
        }
@@ -156,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);
@@ -163,15 +173,6 @@ int aqcpu_change_vres(fres_vres_t *vres, void *priv)
        return 0;
 }
 
-static struct fres_allocator aqcpu_allocator = {
-       .res_type = FRSH_RT_PROCESSOR,
-       .res_id = 0,  /* CPU ID 0 */
-       .create_vres = aqcpu_create_vres,
-       .cancel_vres = aqcpu_cancel_vres,
-       .change_vres = aqcpu_change_vres,
-       .priv = NULL
-};
-
 /*
  * installed as an exit handler (with 'atexit()') by the initialization
  * code... For now it only calls the cleanup function of the AQuoSA
@@ -181,45 +182,8 @@ static inline void aqcpu_cleanup_wrapper() {
        qres_cleanup();
 }
 
-/*
- * aqcpu_fra_init(), initialize FRSH for the calling process
- *
- * Must be called before starting using the framework.
- * No FRSH call will be successful if this routine is not invoked
- *
- * Note that no BACKGROUND is created and negotiated and the caller thread
- * is bound to no BACKGROUND vres, since no way is provided in order of
- * specifying the contract label and get back the vres id!
- *
- * Note also that, since in this implementation the threads/processes with
- * backgound contracts are left into the default Linux scheduler hands' and
- * not attached to any AQuoSA server, while we're violating what D-AC2v1
- * (pag. 14) says, we achieve exactly the same behaviour!!
- */
-int aqcpu_fra_init(void)
-{
-       qos_rv qrv;
-       int rv;
-
-       if ((qrv = qres_init()) != QOS_OK) {
-               return -1;
-       }
-
-       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;
-}
-
+#if 0
+static
 int aqcpu_fra_exit()
 {
        qos_rv rv;
@@ -227,9 +191,11 @@ int aqcpu_fra_exit()
        rv = qres_cleanup();
        return qos_rv_int(rv);
 }
+#endif
 
+static
 int fra_CPU_bind_thread
-  (const fres_vres_t *vres,
+  (fres_vres_t *vres,
    const fosa_thread_id_t thread)
 {
        qos_rv  qrv;
@@ -244,6 +210,7 @@ err:
        return -1;
 }
 
+static
 int fra_CPU_unbind_thread(const fosa_thread_id_t thread)
 {
        qos_rv  qrv;
@@ -261,6 +228,7 @@ err:
        return -1;
 }
 
+static
 int fra_CPU_get_usage
   (const fres_vres_t *vres,
    fosa_rel_time_t *spent)
@@ -280,6 +248,7 @@ int fra_CPU_get_usage
        return 0;
 }
 
+static
 int fra_CPU_get_job_usage
   (const fres_vres_t *vres,
    fosa_rel_time_t *spent)
@@ -302,6 +271,7 @@ int fra_CPU_get_job_usage
        return 0;
 }
 
+static
 int fra_CPU_get_remaining_budget
   (const fres_vres_t *vres,
    fosa_rel_time_t *budget)
@@ -321,6 +291,7 @@ int fra_CPU_get_remaining_budget
        return 0;
 }
 
+static
 int fra_CPU_set_spare_bandwidth(fres_vres_t *vres)
 {
        qres_sid_t fake_sid = (qres_sid_t) -1;
@@ -335,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));
@@ -344,6 +315,7 @@ int fra_CPU_set_spare_bandwidth(fres_vres_t *vres)
        return 0;
 }
 
+static
 int fra_CPU_get_desired_budget
   (fres_vres_t *vres,
    frsh_rel_time_t *p_budget_out)
@@ -363,6 +335,7 @@ int fra_CPU_get_desired_budget
        return 0;
 }
 
+static
 int fra_CPU_set_desired_budget
   (fres_vres_t *vres,
    fosa_rel_time_t *p_budget_in)
@@ -385,6 +358,7 @@ int fra_CPU_set_desired_budget
        return 0;
 }
 
+static
 int fra_CPU_get_actual_budget
   (fres_vres_t *vres,
    fosa_rel_time_t *budget)
@@ -404,3 +378,76 @@ 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 = FRSH_CPU_ID_DEFAULT,  /* CPU ID 0 */
+       .create_vres = aqcpu_create_vres,
+       .cancel_vres = aqcpu_cancel_vres,
+       .change_vres = aqcpu_change_vres,
+
+       .bind_thread = fra_CPU_bind_thread,
+       .unbind_thread = fra_CPU_unbind_thread,
+
+       .vres_get_usage = fra_CPU_get_usage,
+       .vres_get_job_usage = fra_CPU_get_job_usage,
+       .vres_get_remaining_budget = fra_CPU_get_remaining_budget,
+
+       .set_spare_bandwidth = fra_CPU_set_spare_bandwidth,
+       .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
+};
+
+/*
+ * aqcpu_fra_init(), initialize FRSH for the calling process
+ *
+ * Must be called before starting using the framework.
+ * No FRSH call will be successful if this routine is not invoked
+ *
+ * Note that no BACKGROUND is created and negotiated and the caller thread
+ * is bound to no BACKGROUND vres, since no way is provided in order of
+ * specifying the contract label and get back the vres id!
+ *
+ * Note also that, since in this implementation the threads/processes with
+ * backgound contracts are left into the default Linux scheduler hands' and
+ * not attached to any AQuoSA server, while we're violating what D-AC2v1
+ * (pag. 14) says, we achieve exactly the same behaviour!!
+ */
+int aqcpu_fra_init(void)
+{
+       int rv;
+
+       aqcpu_allocator.res_id = frsh_get_local_cpu_id();
+               
+       if ((rv = fra_register(&aqcpu_allocator))) {
+               return rv;
+       }
+       
+       return 0;
+}