page_alloc zone_pcp_enable

PCP(Per-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 为high=0, batch=1(禁用)+ 强制排空所有 CPU获取pcp_batch_high_lock
zone_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 配置设为high=0, batch=1使其形同虚设,并强制排空所有 CPU 的 PCP 缓存以确保无页残留;enable 时从 zone 保存的pageset_*字段恢复正常配置并释放锁。它们用于内存热插拔、CMA 分配等需要 PCP 缓存彻底清空的场景,确保隔离和迁移操作不受 PCP 中滞留页的干扰。

相关新闻

第二章MySQL安装部署(上)

第二章MySQL安装部署(上)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:29:55 阅读更多 →
Autosar+Simulink建模实战:破解模型生成与ECU部署卡点

Autosar+Simulink建模实战:破解模型生成与ECU部署卡点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:29:55 阅读更多 →
ISBN书号查询API——通过 ISBN 查询图书信息:从扫码识书到自建图书系统的完整指南

ISBN书号查询API——通过 ISBN 查询图书信息:从扫码识书到自建图书系统的完整指南

一、图书的"身份证"——ISBN每本正式出版的图书,封底都印有一串以 ISBN 开头的编码。ISBN(International Standard Book Number,国际标准书号),是国际标准化组织(ISO)为每本公开出版的…

2026/10/21 2:29:55 阅读更多 →

最新新闻

数据获取与处理实战:从数据源选择到数据清洗的完整指南

数据获取与处理实战:从数据源选择到数据清洗的完整指南

这几年做数据相关的工作,被问得最多的一个问题是:“我该从哪儿拿数据?拿到手之后又该怎么处理?”说实话,大多数人在第一步就卡住了,要么不知道怎么稳定地拿到数据,要么千辛万苦拿到一份Excel&am…

2026/10/21 3:08:09 阅读更多 →
C# 调用 QT 带界面 DLL:窗口嵌入与消息循环实战

C# 调用 QT 带界面 DLL:窗口嵌入与消息循环实战

简介:本资源面向需要在 C# 项目中复用 C Qt 界面组件的开发者,重点解决跨语言调用外部 UI DLL 的集成问题。资源以控制台程序调用 Qt 编译生成的界面 DLL 为主线,涵盖 DLL 放置路径与代码引用路径的对应关系,适合具备一定 C# 与 C…

2026/10/21 3:08:09 阅读更多 →
WorkTool:5 步实现无需 Root 的企业微信自动化

WorkTool:5 步实现无需 Root 的企业微信自动化

WorkTool:5 步实现无需 Root 的企业微信自动化 【免费下载链接】worktool 一款安全稳定的Android无障碍服务工具,支持控制企微/微信来运行的无人值守群管理企业微信机器人 项目地址: https://gitcode.com/GitHub_Trending/wo/worktool WorkTool 是…

2026/10/21 3:08:09 阅读更多 →
纯Delphi实现屏幕找图:模板匹配算法与性能优化实战

纯Delphi实现屏幕找图:模板匹配算法与性能优化实战

简介:这份Delphi图像匹配资源面向需要在Windows桌面环境中实现屏幕找图的开发者,适用于自动化测试、游戏辅助、屏幕抓取等场景,帮助解决从屏幕截取到目标定位的完整链路问题。资源包为rar压缩格式,整体约6.63MB,上游未…

2026/10/21 3:08:09 阅读更多 →
DNGM(1,1)离散灰色模型:小样本预测的Python实战与GM(1,1)对比

DNGM(1,1)离散灰色模型:小样本预测的Python实战与GM(1,1)对比

做数据分析的人,大概率都撞上过同一个尴尬:想预测下个月或者下一周期的数值,手里却只有五六个、七八个历史样本。经典统计模型要求大样本,深度学习更是无底洞式地吃数据,这俩在“贫数据”面前基本束手无策。灰色预测就…

2026/10/21 3:08:09 阅读更多 →
无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

我做无人机视觉落地也有几年了,今年被问得最多的问题不是“模型怎么调”,而是“模型怎么到了现场就不灵”。很多朋友拿着公开的航拍检测模型,在桌面演示上mAP能到七八十个点,可一部署到国内的十字路口、老小区、城乡结合部&#x…

2026/10/21 3:07:07 阅读更多 →

日新闻

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

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

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

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →