X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-stubs.c;h=24993391a9f4a22295e8e96163b5387a8f0902d7;hb=f7e83e5d2d00ba107ccda346da4660ab523471bb;hp=36f7625916a2a69a445e43168085911715cce31c;hpb=a489c2ba0f26f4be1fa98d4af2c2bfa113c28dde;p=palacios.git diff --git a/linux_module/palacios-stubs.c b/linux_module/palacios-stubs.c index 36f7625..2499339 100644 --- a/linux_module/palacios-stubs.c +++ b/linux_module/palacios-stubs.c @@ -155,12 +155,11 @@ palacios_xcall( struct lnx_thread_arg { int (*fn)(void * arg); void * arg; - char * name; }; static int lnx_thread_target(void * arg) { struct lnx_thread_arg * thread_info = (struct lnx_thread_arg *)arg; - + int ret = 0; /* printk("Daemonizing new Palacios thread (name=%s)\n", thread_info->name); @@ -169,18 +168,20 @@ static int lnx_thread_target(void * arg) { */ - thread_info->fn(thread_info->arg); + ret = thread_info->fn(thread_info->arg); kfree(thread_info); // handle cleanup + + do_exit(ret); - return 0; + return 0; // should not get here. } /** * Creates a kernel thread. */ -static void +static void * palacios_start_kernel_thread( int (*fn) (void * arg), void * arg, @@ -190,10 +191,8 @@ palacios_start_kernel_thread( thread_info->fn = fn; thread_info->arg = arg; - thread_info->name = thread_name; - kthread_run( lnx_thread_target, thread_info, thread_name ); - return; + return kthread_run( lnx_thread_target, thread_info, thread_name ); } @@ -210,7 +209,6 @@ palacios_start_thread_on_cpu(int cpu_id, thread_info->fn = fn; thread_info->arg = arg; - thread_info->name = thread_name; thread = kthread_create( lnx_thread_target, thread_info, thread_name ); @@ -220,7 +218,11 @@ palacios_start_thread_on_cpu(int cpu_id, return NULL; } - kthread_bind(thread, cpu_id); + if (set_cpus_allowed_ptr(thread, cpumask_of(cpu_id)) != 0) { + kthread_stop(thread); + return NULL; + } + wake_up_process(thread); return thread; @@ -234,10 +236,12 @@ palacios_start_thread_on_cpu(int cpu_id, */ static int palacios_move_thread_to_cpu(int new_cpu_id, - void * thread_ptr) { + void * thread_ptr) { struct task_struct * thread = (struct task_struct *)thread_ptr; - if(thread == NULL){ + printk("Moving thread (%p) to cpu %d\n", thread, new_cpu_id); + + if (thread == NULL) { thread = current; } @@ -245,7 +249,7 @@ palacios_move_thread_to_cpu(int new_cpu_id, * Bind to the specified CPU. When this call returns, * the thread should be running on the target CPU. */ - return set_cpus_allowed(thread, cpumask_of_cpu(new_cpu_id)); + return set_cpus_allowed_ptr(thread, cpumask_of(new_cpu_id)); }