addr = kmalloc(size, GFP_KERNEL);
}
mallocs++;
+
return addr;
}
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);
*/
- 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,
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 );
}
thread_info->fn = fn;
thread_info->arg = arg;
- thread_info->name = thread_name;
thread = kthread_create( lnx_thread_target, thread_info, thread_name );
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;
*/
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;
}
* 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));
}
printk("palacios_init starting - calling init_v3\n");
- Init_V3(&palacios_os_hooks, nr_cpu_ids);
+ Init_V3(&palacios_os_hooks, num_online_cpus());
return 0;