2 * Palacios VNET Host Hooks Implementations
6 #include <linux/kernel.h>
7 #include <linux/kthread.h>
8 #include <linux/spinlock.h>
10 #include <linux/sched.h>
11 #include <linux/uaccess.h>
12 #include <linux/init.h>
13 #include <asm/delay.h>
14 #include <linux/timer.h>
16 #include <vnet/vnet.h>
19 #include "palacios-vnet.h"
20 #include "linux-exts.h"
25 static void host_kthread_sleep(long timeout){
26 set_current_state(TASK_INTERRUPTIBLE);
31 schedule_timeout(timeout);
37 static void host_kthread_wakeup(void * thread){
38 struct task_struct * kthread = (struct task_struct *)thread;
40 wake_up_process(kthread);
43 static void host_kthread_stop(void * thread){
44 struct task_struct * kthread = (struct task_struct *)thread;
46 while (kthread_stop(kthread)==-EINTR)
50 static int host_kthread_should_stop(void){
51 return kthread_should_stop();
55 static void host_udelay(unsigned long usecs){
66 struct timer_list timer;
67 unsigned long interval;
70 void (* timer_fun)(void * private_data);
75 void timeout_fn(unsigned long arg){
76 struct host_timer * timer = (struct host_timer *)arg;
79 timer->timer_fun(timer->pri_data);
81 mod_timer(&(timer->timer), timer->interval);
86 host_create_timer(unsigned long interval,
87 void (* timer_fun)(void * priv_data),
89 struct host_timer * timer = (struct host_timer *)palacios_alloc(sizeof(struct host_timer));
92 ERROR("Unable to allocate timer in VNET\n");
96 timer->interval = interval;
97 timer->timer_fun = timer_fun;
98 timer->pri_data = data;
100 init_timer(&(timer->timer));
102 timer->timer.data = (unsigned long)timer;
103 timer->timer.function = timeout_fn;
104 timer->timer.expires = interval;
110 host_start_timer(void * vnet_timer){
111 struct host_timer * timer = (struct host_timer *)vnet_timer;
114 add_timer(&(timer->timer));
118 host_reset_timer(void * vnet_timer, unsigned long interval){
119 struct host_timer * timer = (struct host_timer *)timer;
121 timer->interval = interval;
125 host_stop_timer(void * vnet_timer){
126 struct host_timer * timer = (struct host_timer *)vnet_timer;
129 del_timer(&(timer->timer));
133 host_del_timer(void * vnet_timer){
134 struct host_timer * timer = (struct host_timer *)vnet_timer;
136 del_timer(&(timer->timer));
138 palacios_free(timer);
143 host_allocate_pages(int num_pages, unsigned int alignment, int node_id, int constraint)
145 // allocates pages preferentially on the caller's node
146 return palacios_allocate_pages(num_pages, alignment, node_id, constraint);
151 static struct vnet_host_hooks vnet_host_hooks = {
152 .timer_create = host_create_timer,
153 .timer_del = host_del_timer,
154 .timer_start = host_start_timer,
155 .timer_stop = host_stop_timer,
156 .timer_reset = host_reset_timer,
158 .thread_start = palacios_create_and_start_kernel_thread,
159 .thread_sleep = host_kthread_sleep,
160 .thread_wakeup = host_kthread_wakeup,
161 .thread_stop = host_kthread_stop,
162 .thread_should_stop = host_kthread_should_stop,
163 .udelay = host_udelay,
165 .yield_cpu = palacios_yield_cpu,
166 .mutex_alloc = palacios_mutex_alloc,
167 .mutex_free = palacios_mutex_free,
168 .mutex_lock = palacios_mutex_lock,
169 .mutex_unlock = palacios_mutex_unlock,
170 .mutex_lock_irqsave = palacios_mutex_lock_irqsave,
171 .mutex_unlock_irqrestore = palacios_mutex_unlock_irqrestore,
173 .print = palacios_print_scoped,
174 .allocate_pages = host_allocate_pages,
175 .free_pages = palacios_free_pages,
176 .malloc = palacios_alloc,
177 .free = palacios_free,
178 .vaddr_to_paddr = palacios_vaddr_to_paddr,
179 .paddr_to_vaddr = palacios_paddr_to_vaddr,
184 static int vnet_init( void ) {
185 init_vnet(&vnet_host_hooks);
190 INFO("V3 VNET Inited\n");
196 static int vnet_deinit( void ) {
198 INFO("V3 Control Deinit Start\n");
202 INFO("V3 Bridge Deinit Start\n");
204 vnet_bridge_deinit();
206 INFO("V3 VNET Deinit Start\n");
210 INFO("V3 VNET Deinited\n");
215 static struct linux_ext vnet_ext = {
218 .deinit = vnet_deinit,
223 register_extension(&vnet_ext);