GFP_ATOMIC vs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock等原子上下文里面,申请内存,应该使用GFP_ATOMIC标记,譬如内核中有大量的kmalloc/GFP_ATOMIC的例子: 对于不可睡眠的上下文,如果我们用常规的GFP_KERNEL这样的标记去申请内存,可能引发直接的内存reclaim,从而引起睡眠,所以GFP_KERNEL这种标记只适合进程上下文...
而GFP_ATOMIC标记正好是用在中断处理函数中的,意思也就是说GFP_ATOMIC用在不能睡眠的场合(中断处理), 而GFP_KERNEL用在可以睡眠的场合(使用GFP_KERNEL会引起休眠)!
1 在中断处理函数、tasklet 和内核定时器等非进程上下文中不能阻塞,此时驱动应当使用 GFP_ATOMIC 标志来申请内存。当使用 GFP_ATOMIC 标志申请内存时,若不存在空闲页,则不等待,直接返回 vmalloc()不能用在原子上下文中,因为它的内部实现使用了标志为GFP_KERNEL的kmalloc()...
最一般使用的标志, GFP_KERNEL, 意思是这个分配((内部最终通过调用 __get_free_pages 来进行, 它是 GFP_ 前缀的来源) 代表运行在内核空间的进程而进行的. 换句话说, 这意味着调用函数是代表一个进程在执行一个系统调用. 使用 GFP_KENRL 意味着 kmalloc 能够使当前进程在少内存的情况下睡眠来等待一页. 一个...
本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存。目录: 1. GFP_ATOMIC vs. GFP_KERNEL 2. 内存水位,PF_MEMALLOC和GFP_ATOMIC 3. 何时使用GFP_ATOMIC(一
linux内核中的两个标记GFP_KERNEL和GFP_ATOMIC是用来干什么的?,1.作用用来标记分配内核空间内存时的方式2.两个标记使用在什么场合?如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中,而GFP_ATOMIC标
GFP_KERNEL 的标记可以引发直接的内存回收,从而导致进程阻塞睡眠,这在原子上下文显然是不允许的。 #define GFP_KERNEL \(__GFP_RECLAIM | __GFP_IO | __GFP_FS)#define __GFP_RECLAIM \((__force gfp_t)(___GFP_DIRECT_RECLAIM|___GFP_KSWAPD_RECLAIM) ...
GFP_ATOMIC vs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock 等原子上下文里面,申请内存,应该使用 GFP_ATOMIC 标记,譬如内核中有大量的 kmalloc/GFP_ATOMIC 的例子: 对于不可睡眠的上下文,如果我们用常规的 GFP_KERNEL 这样的标记去申请内存,可能引发直接的内存 reclaim,从而引起睡眠,所以 GFP_KERNEL 这种标记...
is utilized instead of GFP_KERNEL. This ensures the avoidance of the subsequent call trace and prevents potential misinterpretation of NPU performance degradation during testing. BUG: sleeping function called from invalid context at include/linux/sched/mm.h:274 ...
大多数开发人员都以 GFP_ATOMIC 或GFP_KERNEL 等宏的形式看到 GFP 标志,但这些宏实际上是由较低级别的标志组成的结构。因此,例如,在 6.2-rc 内核中,GFP_ATOMIC 定义为: #define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM)每个组件标志都以某种方式修改请求; __GFP_HIGH 将其标记为“高...