page_alloc zone_pcp_enable

发布时间:2026/10/21 2:31:00

page_alloc zone_pcp_enable PCPPer-CPU Pages缓存的禁用与启用函数用于在内存热插拔等需要“冻结”PCP 缓存的场景中临时关闭某个 zone 的 PCP 机制。一、zone_pcp_disable()—— 禁用 zone 的 PCP 缓存void zone_pcp_disable(struct zone *zone) { mutex_lock(pcp_batch_high_lock); __zone_set_pageset_high_and_batch(zone, 0, 0, 1); __drain_all_pages(zone, true); }逐步解析1. 获取全局互斥锁mutex_lock(pcp_batch_high_lock);前面讲过的pcp_batch_high_lock保护 PCP 的high/batch字段更新。获取它确保在禁用期间没有其他更新者并发修改 PCP 配置。注意这把锁在zone_pcp_enable()中才释放形成disable/enable 的配对临界区。2. 把 PCP 配置设为“禁用”状态__zone_set_pageset_high_and_batch(zone, 0, 0, 1);前面讲过的__zone_set_pageset_high_and_batch()遍历所有 CPU更新 PCP 的high_min、high_max、batch。参数(0, 0, 1)的含义high_min 0、high_max 0高水位为 0意味着 PCP 缓存不能保留任何页——一旦有页放入立即触发批量归还。batch 1批量大小为 1每次只处理一页。效果PCP 缓存形同虚设所有分配/释放几乎直接走伙伴系统。3. 强制排空所有 CPU 的 PCP 缓存__drain_all_pages(zone, true);前面讲过的__drain_all_pages(zone, force_all_cpus)排空指定 zone 在所有 CPU 上的 PCP 缓存。force_all_cpus true强制在所有 CPU 上执行排空跳过“非空检查”的竞态优化。这是为了确保彻底清空——因为内存热插拔要求该 zone 的 PCP 缓存中不能有任何页残留否则隔离/下线会失败。为什么需要force_all_cpus true前面讲__drain_all_pages()时提到过普通的非空检查存在竞态——一个 CPU 的 PCP 看起来是空的但另一个 CPU 正好在释放页到该 PCP 且尚未增加count。内存热插拔对“彻底清空”有强要求所以必须强制排空所有 CPU。二、zone_pcp_enable()—— 重新启用 zone 的 PCP 缓存void zone_pcp_enable(struct zone *zone) { __zone_set_pageset_high_and_batch(zone, zone-pageset_high_min, zone-pageset_high_max, zone-pageset_batch); mutex_unlock(pcp_batch_high_lock); }逐步解析1. 恢复 zone 的正常 PCP 配置__zone_set_pageset_high_and_batch(zone, zone-pageset_high_min, zone-pageset_high_max, zone-pageset_batch);从 zone 的pageset_*字段中取回禁用前的正常配置zone-pageset_high_min/pageset_high_max该 zone 的高水位范围zone-pageset_batch批量大小。这些值是在zone_set_pageset_high_and_batch()中计算并保存的。通过__zone_set_pageset_high_and_batch()重新分发到所有 CPU 的 PCP 结构。2. 释放全局互斥锁mutex_unlock(pcp_batch_high_lock);释放pcp_batch_high_lock结束 disable/enable 的临界区。之后其他更新者可以正常修改 PCP 配置。三、disable/enable 的配对使用这两个函数必须成对调用zone_pcp_disable(zone); // 加锁禁用 PCP排空 /* ... 执行需要 PCP 无残留的操作如内存隔离、下线 ... */ zone_pcp_enable(zone); // 恢复 PCP解锁典型使用场景1. 内存热插拔下线offline_pages()在隔离 pageblock 之前需要确保 PCP 缓存中没有该 zone 的页否则这些页可能“躲过”隔离。所以先zone_pcp_disable()下线完成后再zone_pcp_enable()。2. CMA 分配alloc_contig_range()在需要大块连续内存时可能通过zone_pcp_disable()确保 PCP 缓存不干扰隔离。3. 内存规整某些极端场景下规整需要 PCP 缓存无残留。四、与前面内容的呼应前面出现过的这里的关联pcp_batch_high_lockdisable 时获取enable 时释放__zone_set_pageset_high_and_batch()两函数都调用它更新 PCP 配置__drain_all_pages(zone, true)disable 时强制排空zone-pageset_high_min/pageset_high_max/pageset_batchenable 时恢复这些值page_alloc_cpu_online()/page_alloc_cpu_dead()CPU 热插拔也涉及 PCP 配置内存热插拔offline_pages()典型调用场景五、小结表函数操作锁zone_pcp_disable(zone)设置 PCP 为high0, batch1禁用 强制排空所有 CPU获取pcp_batch_high_lockzone_pcp_enable(zone)恢复 zone 的正常high_min/high_max/batch释放pcp_batch_high_lock一句话总结zone_pcp_disable()和zone_pcp_enable()是 PCP 缓存的禁用/启用配对函数disable 时获取pcp_batch_high_lock把 zone 的 PCP 配置设为high0, batch1使其形同虚设并强制排空所有 CPU 的 PCP 缓存以确保无页残留enable 时从 zone 保存的pageset_*字段恢复正常配置并释放锁。它们用于内存热插拔、CMA 分配等需要 PCP 缓存彻底清空的场景确保隔离和迁移操作不受 PCP 中滞留页的干扰。
延伸阅读

更多相关文章

2026/10/21 2:31:00

page_alloc zone_pcp_reset

zone_pcp_reset() 是一个内部函数,用于在内存热移除(memory hot-remove) 时,释放某个 zone 已分配并排空的 per-CPU 页缓存(PCP)结构,并将其重置回 boot_pageset。核心作用:内存热移…

2026/10/21 2:31:00

page_alloc __offline_isolated_pages

__offline_isolated_pages 是内存热移除流程中的核心函数,用于在页面已被成功隔离的前提下,将它们从伙伴系统中彻底移除,并标记对应的内存段为离线状态。核心实现unsigned long __offline_isolated_pages(unsigned long start_pfn,unsigned l…

2026/10/21 2:26:00

26 精武杯手机部分复盘

【简要案情】 近期,某市反诈部门接到多名群众报案,均遭遇“投资理财”类电信网络诈骗,指向的犯罪团伙涉案资金巨大、作案链条隐蔽。办案单位迅速成立专案组开展电子数据取证工作。经初查,该犯罪团伙搭建虚假投资平台,通…

2026/10/21 5:11:20

NLP与无人船:从自然语言指令到自主靠泊的完整技术链路

去年我带着组里的几位同学把一个挺有意思的项目从零做到了仿真验证——给一艘无人船加一套自然语言操控链路,让操作员可以直接说“慢速驶向测试场北侧码头,左舷靠泊”或者“绕开右前方漂浮物,停到A区泊位”,船载系统自己去完成意图…

2026/10/21 5:11:20

鸿蒙+Flutter跨平台实战:桌面图标焕新方案全解析

桌面图标焕新大师这个名字,听起来像某个手机美化App的宣传语,但它本质上是一个很典型的跨平台实战项目:把视觉设计、资源管理、系统桌面机制和Flutter渲染能力串在一起,最终在鸿蒙设备上完成“一键切换桌面图标风格”的完整闭环。…

2026/10/21 5:11:20

从ReAct到龙虾架构:AI Agent编排演进与工程实践

这两年AI Agent架构的文章我看了不下几十篇,名字一个比一个唬人:ReAct、Plan-and-Execute、Reflexion、多Agent系统、图式编排、龙虾架构……但真能把“从A到B是怎么一步步走出来”讲明白的,确实不多。尤其对小程序员来说,最痛苦的…

2026/10/21 5:11:20

C++游戏服务器集群编译部署实战:14个组件从零到上线

做游戏服务器集群的编译和部署,最怕的不是代码本身出问题,而是十四五个进程一起上线时,依赖顺序、配置路径、端口占用、环境差异这些琐碎的事能把人磨到没脾气。我前阵子刚把一套基于 C 的模拟项目集群完整跑通,从零开始编译了 14…

2026/10/21 5:11:20

VS2026下C++游戏服务器集群化拆分与部署实战

我前后折腾了大概两周时间,才把一个原本耦合严重的单体游戏后端,拆成了由 14 个独立 C 进程组成的集群,然后在 VS2026 下完成了整套编译、部署和压测闭环。这个过程里踩过的坑,比我想象中多得多,但拆完之后回头看&…

2026/10/21 5:06:20

轻量地图组件库 lingbot-map:Canvas 2D架构设计与性能优化实践

1. 项目定位与设计思路1.1 lingbot-map 到底解决什么问题lingbot-map 是我目前在一套机器人业务系统里维护的地图组件库,最初立项时只有一个朴素需求:业务侧需要在一个 web 环境里展示机器人所在场地的实时位置、移动轨迹、工作状态,同时还要…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/21 0:00:35

交通流仿真实战:IDM跟驰与MOBIL换道模型参数调优与避坑指南

简介:这份资源是面向交通工程学习者与Python开发者的微观交通流仿真项目,核心实现智能驾驶模型(IDM)下的车辆跟驰与换道行为,可用于理解速度、密度与流量之间的动态关系,适合具备Python基础、希望深入交通模…

2026/10/21 0:00:35

揭穿智能体表面顺从:用追踪代码重建任务执行确定性

1. 表面顺从不是智能体的“礼貌”,而是任务执行链路上的隐性断点最近在调试一个跨平台长周期任务调度系统时,我反复遇到一种令人困惑的现象:智能体在用户指令发出后,几乎秒级响应“已收到”“正在处理”“请稍候”,UI上…

2026/10/21 0:00:35

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑