-// The following can be used to track heap bugs
-// zero memory after allocation
-#define ALLOC_ZERO_MEM 0
-// pad allocations by this many bytes on both ends of block
+// The following can be used to track memory bugs
+// zero memory after allocation (now applies to valloc and page alloc as well)
+#define ALLOC_ZERO_MEM 1
+// pad allocations by this many bytes on both ends of block (heap only)
#define ALLOC_PAD 0
pg_allocs += num_pages;
+#if ALLOC_ZERO_MEM
+ memset(__va(pg_addr),0,num_pages*4096);
+#endif
+
MEMCHECK_ALLOC_PAGES(pg_addr,num_pages*4096);
return pg_addr;
if (!page_paddr) {
ERROR("Ignoring free pages: 0x%p (0x%lx)for %d pages\n", page_paddr, (uintptr_t)page_paddr, num_pages);
dump_stack();
+ return;
}
pg_frees += num_pages;
free_palacios_pgs((uintptr_t)page_paddr, num_pages);
addr = kmalloc_node(size+2*ALLOC_PAD, flags, node);
}
- if (!addr) {
+ if (!addr || IS_ERR(addr)) {
ERROR("ALERT ALERT kmalloc has FAILED FAILED FAILED\n");
return NULL;
}
addr = vmalloc(size);
- if (!addr) {
+ if (!addr || IS_ERR(addr)) {
ERROR("ALERT ALERT vmalloc has FAILED FAILED FAILED\n");
return NULL;
}
vmallocs++;
+#if ALLOC_ZERO_MEM
+ memset(addr,0,size);
+#endif
+
MEMCHECK_VMALLOC(addr,size);
return addr;
void palacios_vfree(void *p)
{
+ if (!p) {
+ ERROR("Ignoring vfree: 0x%p\n",p);
+ dump_stack();
+ return;
+ }
vfree(p);
vfrees++;
MEMCHECK_VFREE(p);
if (!addr) {
ERROR("Ignoring free : 0x%p\n", addr);
dump_stack();
+ return;
}
frees++;
kfree(addr-ALLOC_PAD);
* Starts a kernel thread on the specified CPU.
*/
void *
-palacios_start_thread_on_cpu(int cpu_id,
+palacios_create_thread_on_cpu(int cpu_id,
int (*fn)(void * arg),
void * arg,
char * thread_name ) {
thread = kthread_create( lnx_thread_target, thread_info, thread_info->name );
- if (IS_ERR(thread)) {
+ if (!thread || IS_ERR(thread)) {
WARNING("Palacios error creating thread: %s\n", thread_info->name);
palacios_free(thread_info);
return NULL;
return NULL;
}
- wake_up_process(thread);
-
return thread;
}
+void
+palacios_start_thread(void * th){
+
+ struct task_struct * thread = (struct task_struct *)th;
+ wake_up_process(thread);
+}
/**
* Rebind a kernel thread to the specified CPU
* The thread will be running on target CPU on return
.get_cpu = palacios_get_cpu,
.interrupt_cpu = palacios_interrupt_cpu,
.call_on_cpu = palacios_xcall,
- .start_thread_on_cpu = palacios_start_thread_on_cpu,
+ .create_thread_on_cpu = palacios_start_thread_on_cpu,
+ .start_thread = palacios_start_thread,
.move_thread_to_cpu = palacios_move_thread_to_cpu,
};