"The first is to change the gfp_mask passed to kmalloc(). Using GFP_KERNEL,
it is possible that the VM will call back to the filesystem to free up
memory to satisfy the kmalloc request. GFP_NOFS will prevent this possible
recursion. I believe GFP_NOFS first appeared in the 2.4.6 kernel.
The second change involves the call to schedule() when vmalloc() fails. This
can also cause a hang. The schedule() call could be replaced with:
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ);"
/* if we can use kmalloc use it to allocate the required memory. */
if (asize < MAX_KMALLOC_SIZE) {
- new = (void *)(unsigned long)kmalloc(asize, GFP_KERNEL);
+ new = (void *)(unsigned long)kmalloc(asize,
+#ifdef GFP_NOFS
+ GFP_NOFS
+#else
+ GFP_KERNEL
+#endif
+ );
if (new) /* piggy back alloc type */
(unsigned long)new |= KM_TYPE;
}
if (--max_wait <=0) {
break;
}
- schedule();
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ);
}
if (new) /* piggy back alloc type */
(unsigned long)new |= VM_TYPE;