From: Patrick G. Bridges Date: Fri, 21 Sep 2012 16:36:52 +0000 (-0600) Subject: Added updated sleep/wakeup functionality X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=3f777ee2e04c359758b0658b04ff8f076d38f2f9;p=palacios.releases.git Added updated sleep/wakeup functionality --- diff --git a/linux_module/palacios-stubs.c b/linux_module/palacios-stubs.c index f7301b8..5bf69a1 100644 --- a/linux_module/palacios-stubs.c +++ b/linux_module/palacios-stubs.c @@ -567,19 +567,25 @@ palacios_yield_cpu(void) * Given now immediately if there is no other thread that is runnable * And there is no real bound on how long it will yield */ -void palacios_yield_cpu_timed(unsigned int us) +void palacios_sleep_cpu(unsigned int us) { - unsigned int uspj = 1000000U/HZ; - - unsigned int jiffies = us/uspj + ((us%uspj) !=0); // ceiling - set_current_state(TASK_INTERRUPTIBLE); - - schedule_timeout(jiffies); - + if (us) { + unsigned int uspj = 1000000U/HZ; + unsigned int jiffies = us/uspj + ((us%uspj) !=0); // ceiling + schedule_timeout(jiffies); + } else { + schedule(); + } + return; } +void palacios_wakeup_cpu(void *thread) +{ + wake_up_process(thread); + return; +} /** * Allocates a mutex. @@ -669,7 +675,8 @@ static struct v3_os_hooks palacios_os_hooks = { .get_cpu_khz = palacios_get_cpu_khz, .start_kernel_thread = palacios_start_kernel_thread, .yield_cpu = palacios_yield_cpu, - .yield_cpu_timed = palacios_yield_cpu_timed, + .sleep_cpu = palacios_sleep_cpu, + .wakeup_cpu = palacios_wakeup_cpu, .mutex_alloc = palacios_mutex_alloc, .mutex_free = palacios_mutex_free, .mutex_lock = palacios_mutex_lock, diff --git a/linux_usr/Makefile b/linux_usr/Makefile index dc1ab05..868d0d7 100644 --- a/linux_usr/Makefile +++ b/linux_usr/Makefile @@ -99,13 +99,14 @@ libv3_ctrl.a : v3_ctrl.c v3_ctrl.h # ifeq ($(STATIC),1) CURSES_CFLAGS = -DNCURSES_STATIC + CURSES_LIBS = -ltermcap endif v3_cons: v3_cons.c - $(CC) $(CFLAGS) $(CURSES_CFLAGS) $< -lcurses -o $@ + $(CC) $(CFLAGS) $(CURSES_CFLAGS) $< -lcurses $(CURSES_LIBS) -o $@ v3_cons_sc: v3_cons_sc.c - $(CC) $(CFLAGS) $(CURSES_CFLAGS) $< -lcurses -o $@ + $(CC) $(CFLAGS) $(CURSES_CFLAGS) $< -lcurses $(CURSES_LIBS) -o $@ v3_create: v3_create.c ezxml.c libv3_ctrl.a $(CC) $(CFLAGS) $^ -lv3_ctrl -L. -o $@ diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 37a1073..6a4efa7 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -254,16 +254,23 @@ struct guest_info; } while (0) \ -#define V3_Yield_Timed(usec) \ +#define V3_Sleep(usec) \ do { \ extern struct v3_os_hooks * os_hooks; \ - if ((os_hooks) && (os_hooks)->yield_cpu_timed) {\ - (os_hooks)->yield_cpu_timed(usec); \ + if ((os_hooks) && (os_hooks)->sleep_cpu) {\ + (os_hooks)->sleep_cpu(usec); \ } else { \ V3_Yield(); \ } \ } while (0) \ +#define V3_Wakeup(cpu) \ + do { \ + extern struct v3_os_hooks * os_hooks; \ + if ((os_hooks) && (os_hooks)->wakeup_cpu) { \ + (os_hooks)->wakeup_cpu(cpu); \ + } \ + } while (0) \ typedef enum v3_vm_class {V3_INVALID_VM, V3_PC_VM, V3_CRAY_VM} v3_vm_class_t; @@ -315,10 +322,9 @@ struct v3_os_hooks { unsigned int (*get_cpu_khz)(void); - void (*yield_cpu)(void); - - void (*yield_cpu_timed)(unsigned int usec); + void (*sleep_cpu)(unsigned int usec); + void (*wakeup_cpu)(void *cpu); void *(*mutex_alloc)(void); void (*mutex_free)(void * mutex); diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 0959feb..de77277 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -740,7 +740,7 @@ void v3_yield_cond(struct guest_info * info, int usec) { if (usec < 0) { V3_Yield(); } else { - V3_Yield_Timed(usec); + V3_Sleep(usec); } info->yield_start_cycle += info->vm_info->yield_cycle_period; @@ -760,7 +760,7 @@ void v3_yield(struct guest_info * info, int usec) { if (usec < 0) { V3_Yield(); } else { - V3_Yield_Timed(usec); + V3_Sleep(usec); } if (info) {