1. GFP_ATOMIC vs. GFP_KERNEL 2. 内存水位,PF_MEMALLOC和GFP_ATOMIC 3. 何时使用GFP_ATOMIC(一个patch分析) GFP_ATOMIC vs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock等原子上下文里面,申请内存,应该使用GFP_ATOMIC标记,譬如内核中有大量的kmalloc/GFP_ATOMIC的例子: 对于不可睡眠的上下文,如果我们用常...
而GFP_ATOMIC标记正好是用在中断处理函数中的,意思也就是说GFP_ATOMIC用在不能睡眠的场合(中断处理), 而GFP_KERNEL用在可以睡眠的场合(使用GFP_KERNEL会引起休眠)!
1 在中断处理函数、tasklet 和内核定时器等非进程上下文中不能阻塞,此时驱动应当使用 GFP_ATOMIC 标志来申请内存。当使用 GFP_ATOMIC 标志申请内存时,若不存在空闲页,则不等待,直接返回 vmalloc()不能用在原子上下文中,因为它的内部实现使用了标志为GFP_KERNEL的kmalloc()...
如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中,而GFP_ATOMIC标记正好是用在中断处理函数中的,也就是GFP_ATOMIC用在不能睡眠的场合(中断处理),而GFP_KERNEL用在可以睡眠的场合(使用GFP_KERNEL会引起休眠)!
1. GFP_ATOMICvs. GFP_KERNEL 2. 内存水位,PF_MEMALLOC和GFP_ATOMIC 3. 何时使用GFP_ATOMIC(一个patch分析) GFP_ATOMICvs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock等原子上下文里面,申请内存,应该使用GFP_ATOMIC标记,譬如内核中有大量的kmalloc/GFP_ATOMIC的例子: ...
GFP_ATOMIC 用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠. GFP_KERNEL 内核内存的正常分配. 可能睡眠. GFP_USER 用来为用户空间页来分配内存; 它可能睡眠. GFP_HIGHUSER 如同GFP_USER, 但是从高端内存分配, 如果有. 高端内存在下一个子节描述. ...
大多数开发人员都以GFP_ATOMIC或GFP_KERNEL等宏的形式看到 GFP 标志,但这些宏实际上是由较低级别的标志组成的结构。因此,例如,在 6.2-rc 内核中,GFP_ATOMIC 定义为: #define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM) 每个组件标志都以某种方式修改请求; __GFP_HIGH 将其标记为“高优先...
在Linux内核中,GFP_ATOMIC标志用于内存分配函数kmalloc()和get_zeroed_page(),表示请求的内存分配应该是原子性的。本文将深入探讨GFP_ATOMIC的含义、使用场景和影响。
当使用 GFP_ATOMIC 时, kmalloc 能够使用甚至最后一个空闲页. 如果这最后一个空闲页不存在, 但是, 分配失败. 其他用来代替或者增添 GFP_KERNEL 和 GFP_ATOMIC 的标志, 尽管它们 2 个涵盖大部分设备驱动的需要. 所有的标志定义在 <linux/gfp.h>, 并且每个标志用一个双下划线做前缀, 例如 __GFP_DMA. 另外,...
#define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM) #define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS) #define GFP_KERNEL_ACCOUNT (GFP_KERNEL | __GFP_ACCOUNT) #define GFP_NOWAIT (__GFP_KSWAPD_RECLAIM) ...