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. 作用 用来标记分配内核空间内存时的方式 2. 两个标记使用在什么场合? 如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中,而GFP_ATOMIC标记正好是用在中断处理函数中的,也就是GFP_ATOMIC用在不能睡眠的场合(中断处理),而GFP_KERNEL用在可以睡...
如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中,而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的例子: ...
内存水位,PF_MEMALLOC和GFP_ATOMIC 那么GFP_ATOMIC 是否仅仅意味着不能睡眠呢? 答案是否定的,GFP_ATOMIC 还与内存 reclaim 的水位相关。 下面这个图是讲述水位 watermark 的一个著名的图。 在Linux 中,内存有 3 个水位: HIGH: 系统的 free 内存大于 HIGH 水位的时候,是一个相对保险的值,不需要急着做内存回收...
GFP_ATOMIC vs. GFP_KERNEL 我们都知道,在中断、软中断、spinlock 等原子上下文里面,申请内存,应该使用 GFP_ATOMIC 标记,譬如内核中有大量的 kmalloc/GFP_ATOMIC 的例子: 对于不可睡眠的上下文,如果我们用常规的 GFP_KERNEL 这样的标记去申请内存,可能引发直接的内存 reclaim,从而引起睡眠,所以 GFP_KERNEL 这种标记...
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_KERNEL 的标记可以引发直接的内存回收,从而导致进程阻塞睡眠,这在原子上下文显然是不允许的。 内存水位,PF_MEMALLOC和GFP_ATOMIC 那么GFP_ATOMIC 是否仅仅意味着不能睡眠呢? 答案是否定的,GFP_ATOMIC 还与内存 reclaim 的水位相关。 下面这个图是讲述水位 watermark 的一个著名的图。