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.
vmalloc
is faster with Kernel 5.2 (Q2 2019) – AchromicGFP_NOWAIT
instead ofGFP_ATOMIC
in interrupt context? What's the actual difference? – Contexture