mirror of
https://git.openafs.org/openafs.git
synced 2025-01-22 17:00:15 +00:00
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:
parent
3ea10ea353
commit
c1d2386e44
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user