I've googled around and found most people advocating the use of kmalloc
, as you're guaranteed to get contiguous physical blocks of memory. However, it also seems as though kmalloc
can fail if a contiguous physical block that you want can't be found.
What are the advantages of having a contiguous block of memory? Specifically, why would I need to have a contiguous physical block of memory in a system call? Is there any reason I couldn't just use vmalloc
?
Finally, if I were to allocate memory during the handling of a system call, should I specify GFP_ATOMIC
? Is a system call executed in an atomic context?
GFP_ATOMIC
The allocation is high-priority and does not sleep. This is the flag to use in interrupt handlers, bottom halves and other situations where you cannot sleep.
GFP_KERNEL
This is a normal allocation and might block. This is the flag to use in process context code when it is safe to sleep.
The
kmalloc()
&vmalloc()
functions are a simple interface for obtaining kernel memory in byte-sized chunks.The
kmalloc()
function guarantees that the pages are physically contiguous (and virtually contiguous).The
vmalloc()
function works in a similar fashion tokmalloc()
, except it allocates memory that is only virtually contiguous and not necessarily physically contiguous.