00001 #ifndef __KAL_TASK_H__
00002 #define __KAL_TASK_H__
00003
00014 #include <linux/aquosa/qos_debug.h>
00015
00016 #ifdef QOS_KS
00017
00018
00019 #include <linux/kernel.h>
00020 #include <linux/version.h>
00021 #include <linux/sched.h>
00022 #include <linux/hardirq.h>
00023
00024 typedef struct task_struct kal_task_t;
00025
00027 typedef uid_t kal_uid_t;
00028
00030 typedef gid_t kal_gid_t;
00031
00032 #if LINUX_VERSION_CODE<KERNEL_VERSION(2,6,0)
00033
00034 # define set_tsk_need_resched(tsk) do { (tsk)->need_resched = 1; } while (0)
00035
00036 #else
00037
00038 # define for_each_task(t) for_each_process(t)
00039
00040 #endif
00041
00042 #if LINUX_VERSION_CODE<KERNEL_VERSION(2,6,27)
00043
00044 # define current_uid() (current->uid)
00045 # define current_gid() (current->gid)
00046 # define current_euid() (current->euid)
00047 # define current_egid() (current->egid)
00048
00049 # define task_uid(task) ((task)->uid)
00050 # define task_gid(task) ((task)->gid)
00051 # define task_euid(task) ((task)->euid)
00052 # define task_egid(task) ((task)->egid)
00053
00054 #elif LINUX_VERSION_CODE>KERNEL_VERSION(2,6,28)
00055
00056 # define task_gid(task) (task_cred_xxx((task), gid))
00057 # define task_egid(task) (task_cred_xxx((task), egid))
00058
00059 #endif
00060
00062 static inline kal_uid_t kal_get_current_uid(void)
00063 {
00064 return current_uid();
00065 }
00066
00068 static inline kal_uid_t kal_get_current_gid(void)
00069 {
00070 return current_gid();
00071 }
00072
00074 static inline kal_uid_t kal_task_get_uid(kal_task_t *p_task)
00075 {
00076 return task_euid(p_task);
00077 }
00078
00080 static inline kal_gid_t kal_task_get_gid(kal_task_t *p_task)
00081 {
00082 return task_egid(p_task);
00083 }
00084
00086 static inline kal_task_t *kal_task_current(void)
00087 {
00088 return (kal_task_t *) current;
00089 }
00090
00091 static inline void kal_task_link_data(kal_task_t *task, void *data) {
00092 task->private_data = data;
00093 }
00094
00095 static inline void kal_task_unlink_data(kal_task_t *task) {
00096 task->private_data = NULL;
00097 }
00098
00099 static inline void *kal_task_get_data(kal_task_t *task) {
00100 qos_chk_do(task != NULL, return NULL);
00101 return task->private_data;
00102 }
00103
00104 static inline int kal_task_get_id(kal_task_t *task) {
00105 qos_chk(task != NULL);
00106 return task->pid;
00107 }
00108
00117 static inline int kal_task_alive(struct task_struct *task) {
00118 return (task->flags & PF_EXITING) == 0;
00119 }
00120
00121 #if LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,27)
00122 # define kal_find_task_by_pid find_task_by_vpid
00123 #else
00124 # define kal_find_task_by_pid find_task_by_pid
00125 #endif
00126
00127 typedef unsigned long kal_irq_state;
00128 typedef spinlock_t kal_lock_t;
00129
00131 #define kal_lock_define(name) \
00132 spinlock_t name __cacheline_aligned = SPIN_LOCK_UNLOCKED
00133
00134 #define kal_spin_lock_irqsave(p_lock, p_state) do { \
00135 spin_lock_irqsave(p_lock, *p_state); \
00136 qos_log_debug("Acquired spinlock"); \
00137 } while (0)
00138
00139 #define kal_spin_unlock_irqrestore(p_lock, p_state) do { \
00140 qos_log_debug("Releasing spinlock"); \
00141 spin_unlock_irqrestore(p_lock, *p_state); \
00142 } while (0)
00143
00144 #define kal_atomic() (in_atomic() || irqs_disabled())
00145
00146
00147
00148 #else
00149
00150 #include <sys/types.h>
00151 #include <linux/types.h>
00152 #include "kal_generic.h"
00153 #include "qos_list.h"
00154
00155 #define TASK_RUNNING 0
00156
00157 struct task_struct;
00158
00159 typedef struct task_struct kal_task_t;
00160
00161 extern void *current;
00162 extern void *idle;
00163 extern int need_resched;
00164 extern struct list_head kernel_task_list;
00165
00166
00167 #define set_tsk_need_resched(x) do { need_resched = 1; } while (0)
00168
00170 typedef uid_t kal_uid_t;
00171
00173 typedef gid_t kal_gid_t;
00174
00176 static inline uid_t kal_get_current_uid(void)
00177 {
00178 return current_uid();
00179 }
00180
00182 static inline gid_t kal_get_current_gid(void)
00183 {
00184 return current_gid();
00185 }
00186
00187 #define for_each_task(t, pos) \
00188 for ((pos) = kernel_task_list.next, prefetch((pos)->next); \
00189 (t) = (list_entry((pos), struct task_struct, task_list)), (pos) != &kernel_task_list; \
00190 (pos) = (pos)->next, prefetch((pos)->next))
00191
00192 extern void (*block_hook)(struct task_struct *tsk);
00193 extern void (*unblock_hook)(struct task_struct *tsk, long old_state);
00194 extern void (*stop_hook)(struct task_struct *tsk);
00195 extern void (*continue_hook)(struct task_struct *tsk, long old_state);
00196 extern void (*fork_hook)(struct task_struct *tsk);
00197 extern void (*cleanup_hook)(struct task_struct *tsk);
00198 extern rwlock_t hook_lock;
00199
00200 void set_task_rr_prio(kal_task_t *p, int priority);
00201
00202 void kal_task_link_data(kal_task_t *task, void *data);
00203 void kal_task_unlink_data(kal_task_t *task);
00204 void *kal_task_get_data(kal_task_t *task);
00205 int kal_task_get_id(kal_task_t *task);
00206 int kal_task_ready(kal_task_t * task);
00207
00208 #endif
00209
00210
00211 #endif