linux-alloc-avoid-potential-recursion-freeing-memory-and-schedule-when-vmalloc-fails-20011225

"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);"
This commit is contained in:
David Howells 2001-12-25 18:19:20 +00:00 committed by Derrick Brashear
parent 3ea10ea353
commit c1d2386e44

View File

@ -87,7 +87,13 @@ static void *linux_alloc(unsigned int asize)
/* 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;
}
@ -97,7 +103,8 @@ static void *linux_alloc(unsigned int asize)
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;