00001 #ifndef __QMGR_GW_KS_H__
00002 #define __QMGR_GW_KS_H__
00003
00012 #include <linux/aquosa/qos_kernel_dep.h>
00013
00014 #include <linux/kernel.h>
00015 #include <linux/module.h>
00016 #include <asm/uaccess.h>
00017 #include <linux/sched.h>
00018
00019 #include <linux/aquosa/qos_debug.h>
00020 #include <linux/aquosa/qos_types.h>
00021 #include <linux/aquosa/qos_prof.h>
00022
00023 #include <linux/aquosa/qmgr_config.h>
00024 #include <linux/aquosa/qmgr_gw.h>
00025 #include <linux/aquosa/qmgr_base.h>
00026 #include <linux/aquosa/qmgr_params.h>
00027 #include <linux/aquosa/qmgr_time.h>
00028 #include <linux/aquosa/rres_interface.h>
00029
00030 typedef struct {
00031 qres_server_t qres;
00032 qmgr_t qmgr;
00033 } qmgr_server_t;
00034
00035 qos_rv qmgr_init_ks(void);
00036
00037 qos_rv qmgr_cleanup_ks(void);
00038
00039 qos_rv qmgr_start_ks(qmgr_params_t *params);
00040 qos_rv qmgr_stop_ks(void);
00041
00042 static inline qmgr_server_t *qmgr_find_by_task(struct task_struct *tsk) {
00043 server_t *srv = rres_find_by_task(tsk);
00044 if (srv == NULL)
00045 return NULL;
00046 return (qmgr_server_t *) srv;
00047 }
00048
00049 static inline qos_rv qmgr_end_cycle_ks(int skip, qres_time_t *p_sched_error) {
00050 qos_rv rv;
00051 struct task_struct *tsk;
00052 qmgr_server_t *srv;
00053 qmgr_t *qmgr;
00054 qos_bw_t new_bw;
00055 qres_params_t params;
00056
00057 qos_log_debug("Starting function (skip=%d)", skip);
00058
00059 tsk = get_current();
00060 srv = qmgr_find_by_task(tsk);
00061 if (srv == NULL) {
00062 qos_log_err("Could not find server");
00063 return QOS_E_NOSERVER;
00064 }
00065 qmgr = &srv->qmgr;
00066
00067 qos_log_debug("Calling qmgr_ctrl_end_cycle()");
00068 new_bw = qmgr_ctrl_end_cycle(qmgr->ctrl, skip, p_sched_error);
00069 qos_log_debug("new_bw=" QOS_BW_FMT, new_bw);
00070 qos_log_debug("Calling qres_get_params_ks()");
00071 rv = qres_get_params(&srv->qres, ¶ms);
00072 if (rv != QOS_OK) {
00073 qos_log_err("qres_get_params_ks() failed: %s", qos_strerror(rv));
00074 return rv;
00075 }
00076 params.Q = bw2Q(new_bw, params.P);
00077 qos_log_debug("Calling qres_set_params_ks()");
00078 rv = qres_set_params(qres_find_by_rres(rres_find_by_task(tsk)), ¶ms);
00079 if (rv != QOS_OK) {
00080 qos_log_err("qres_get_params_ks() failed: %s", qos_strerror(rv));
00081 return rv;
00082 }
00083
00084 qos_log_debug("Ending function");
00085 return QOS_OK;
00086 }
00087
00091 static inline qos_rv qmgr_pause_ks(void) {
00092 qos_log_debug("Starting qmgr_pause_ks()");
00093 return QOS_OK;
00094 }
00095
00096 static inline qos_rv qmgr_continue_ks(void) {
00097 struct task_struct *tsk;
00098 qmgr_server_t *srv;
00099
00100 tsk = get_current();
00101 srv = qmgr_find_by_task(tsk);
00102 if (srv == NULL) {
00103 qos_log_err("Could not find server");
00104 return QOS_E_NOSERVER;
00105 }
00106
00107 qmgr_time_init(&srv->qmgr.ctrl->time);
00108
00109 return QOS_OK;
00110 }
00111
00112 static inline qos_rv qmgr_sync_ks(void) {
00113 struct task_struct *tsk;
00114 qmgr_server_t *srv;
00115
00116 qos_log_debug("Starting function");
00117
00118 tsk = get_current();
00119 srv = qmgr_find_by_task(tsk);
00120 if (srv == 0) {
00121 qos_log_err("Could not find QMGR descriptor");
00122 return QOS_E_NOSERVER;
00123 }
00124
00125 return qmgr_ctrl_sync(srv->qmgr.ctrl);
00126 }
00127
00128 static inline qos_rv qmgr_get_exec_time_ks(void *param, unsigned long size) {
00129 struct task_struct *tsk;
00130 qmgr_server_t *srv;
00131 qres_time_t exec_time;
00132
00133 qos_log_debug("Starting function");
00134
00135 tsk = get_current();
00136 srv = qmgr_find_by_task(tsk);
00137 if (srv == 0) {
00138 qos_log_err("Could not find QMGR descriptor");
00139 return QOS_E_NOSERVER;
00140 }
00141
00142 exec_time = qmgr_time_get_exec(&srv->qmgr.ctrl->time);
00143 if (copy_to_user(param, &exec_time, sizeof(qres_time_t) != 0))
00144 return QOS_E_GENERIC;
00145
00146 return QOS_OK;
00147 }
00148
00149 static inline qos_rv qmgr_get_sched_err_ks(void *param, unsigned long size) {
00150 struct task_struct *tsk;
00151 qmgr_server_t *srv;
00152
00153 qos_log_debug("Starting function");
00154
00155 tsk = get_current();
00156 srv = qmgr_find_by_task(tsk);
00157 if (srv == 0) {
00158 qos_log_err("Could not find QMGR descriptor");
00159 return QOS_E_NOSERVER;
00160 }
00161
00162 put_user(srv->qmgr.ctrl->old_eps, (qres_time_t *) param);
00163 return QOS_OK;
00164 }
00165
00166 static inline qos_rv qmgr_gw_ks(qmgr_op_t op, void __user *up_param, unsigned long size) {
00167 qmgr_params_t qmgr_params;
00168 qos_rv rv;
00169 prof_vars;
00170
00171 prof_func();
00172 qos_log_debug("Starting qmgr_gw_ks()");
00173 switch (op) {
00174 case QMGR_OP_START:
00175 if (size != sizeof(qmgr_params_t)) {
00176 qos_log_err("Wrong size");
00177 rv = QOS_E_INTERNAL_ERROR;
00178 break;
00179 }
00180 if (copy_from_user(&qmgr_params, up_param, sizeof(qmgr_params_t)) != 0)
00181 rv = QOS_E_GENERIC;
00182 else
00183 rv = qmgr_start_ks(&qmgr_params);
00184 break;
00185 case QMGR_OP_STOP:
00186 rv = qmgr_stop_ks();
00187 break;
00188 case QMGR_OP_END_CYCLE:
00189 if (size != sizeof(qres_time_t)) {
00190 qos_log_err("Wrong size");
00191 rv = QOS_E_INTERNAL_ERROR;
00192 break;
00193 }
00194 {
00195 qres_time_t sched_error;
00196 rv = qmgr_end_cycle_ks(0, &sched_error);
00197 if (up_param != 0)
00198 if (copy_to_user(up_param, &sched_error, sizeof(sched_error) != 0))
00199 rv = QOS_E_GENERIC;
00200 }
00201 break;
00202 case QMGR_OP_END_CYCLE_SKIP:
00203 {
00204 qres_time_t sched_error;
00205 rv = qmgr_end_cycle_ks(1, &sched_error);
00206 if (up_param != 0)
00207 if (copy_to_user(up_param, &sched_error, sizeof(sched_error)) != 0)
00208 rv = QOS_E_GENERIC;
00209 }
00210 break;
00211 case QMGR_OP_PAUSE:
00212 rv = qmgr_pause_ks();
00213 break;
00214 case QMGR_OP_CONTINUE:
00215 rv = qmgr_continue_ks();
00216 break;
00217 case QMGR_OP_SYNC:
00218 rv = qmgr_sync_ks();
00219 break;
00220 case QMGR_OP_GET_EXEC_TIME:
00221 rv = qmgr_get_exec_time_ks(up_param, size);
00222 break;
00223 case QMGR_OP_GET_SCHED_ERR:
00224 rv = qmgr_get_sched_err_ks(up_param, size);
00225 break;
00226 default:
00227 qos_log_err("Unhandled operation code");
00228 rv = QOS_E_INTERNAL_ERROR;
00229 }
00230 prof_end();
00231 return rv;
00232 }
00233
00234 #endif