ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

page_alloc pcp_allowed_order

page_alloc pcp_allowed_order 判断某个阶数order的页是否允许走 PCPPer-CPU Pages缓存路径。它是 PCP 分配/释放入口的第一道门槛检查用static inline强制内联。一、函数签名static inline bool pcp_allowed_order(unsigned int order)参数参数类型含义orderunsigned int分配阶数0 ~MAX_ORDER-1返回值booltrue表示该阶数允许走 PCP 路径false表示不允许应直接走伙伴系统。static inline文件内私有 强制内联。在rmqueue()、free_unref_page()等极热路径的入口调用必须零开销。二、背景为什么 PCP 只允许低阶页PCP 缓存的是低阶页order ≤PAGE_ALLOC_COSTLY_ORDER通常为 3。更高阶的页order 3直接走伙伴系统不进 PCP。原因1. 高阶页数量少、不热系统运行中绝大多数分配是order 0单页少量是 order 1/2/3。order ≥ 4 的分配costly order很少缓存它们收益不大。2. 缓存高阶页会浪费内存PCP 是每个 CPU、每个 zone一份。如果缓存高阶页一个 CPU 可能囤积几十上百页的大块乘以 CPU 数 × zone 数浪费巨大。低阶页缓存代价小单页/几页收益高。3. 高阶页释放/合并复杂高阶页释放时涉及伙伴合并走伙伴系统更自然。放进 PCP 再取出会打乱合并时机。PAGE_ALLOC_COSTLY_ORDER内核常量通常为3。含义order PAGE_ALLOC_COSTLY_ORDER的分配被视为代价高costly分配器会更谨慎、更努力避免失败。PCP 允许的最大阶数就是PAGE_ALLOC_COSTLY_ORDER。三、典型实现static inline bool pcp_allowed_order(unsigned int order) { if (order PAGE_ALLOC_COSTLY_ORDER) return true; #ifdef CONFIG_PCP_BATCH_SCALE_MAX /* 某些配置下允许更大阶数走 PCP */ #endif return false; }或更简洁地static inline bool pcp_allowed_order(unsigned int order) { return order PAGE_ALLOC_COSTLY_ORDER; }可能的变体不同内核版本/配置下实现可能略有差异1. 基础版本return order PAGE_ALLOC_COSTLY_ORDER;最直接order ≤ 3 允许否则不允许。2. 带配置的版本某些内核可能引入配置项允许调整 PCP 支持的最大阶数。但主流实现就是order PAGE_ALLOC_COSTLY_ORDER。3. 与MIGRATE_PCPTYPES配合除了阶数PCP 还限制迁移类型只缓存MIGRATE_PCPTYPES种。pcp_allowed_order()只管阶数迁移类型的限制在order_to_pindex()里处理。两者共同决定某次分配/释放能否走 PCP。四、调用场景1. 分配路径rmqueue()static inline struct page *rmqueue(struct zone *zone, unsigned int order, ...) { if (likely(pcp_allowed_order(order))) { page rmqueue_pcplist(zone, order, ...); // 走 PCP if (page) return page; } /* 否则走伙伴系统 */ return __rmqueue(zone, order, ...); }先判断阶数是否允许走 PCP允许则尝试从 PCP 取页
返回列表