page_alloc zone_pcp_reset

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

page_alloc zone_pcp_reset zone_pcp_reset()是一个内部函数用于在内存热移除memory hot-remove时释放某个 zone 已分配并排空的 per-CPU 页缓存PCP结构并将其重置回boot_pageset。核心作用内存热移除时的 PCP 清理当 zone 被完全移除不再 populated时它之前通过setup_zone_pageset()动态分配的 per-CPU 结构就不再需要了。zone_pcp_reset()负责将这些动态结构归还把 zone 的per_cpu_pageset和per_cpu_zonestats指针重新指回静态的boot_pageset和boot_zonestats。典型实现与关键修复根据内核源码其当前实现大致如下void zone_pcp_reset(struct zone *zone) { int cpu; struct per_cpu_zonestat *pzstats; if (zone-per_cpu_pageset ! boot_pageset) { for_each_online_cpu(cpu) { pzstats per_cpu_ptr(zone-per_cpu_zonestats, cpu); drain_zonestat(zone, pzstats); } free_percpu(zone-per_cpu_pageset); zone-per_cpu_pageset boot_pageset; if (zone-per_cpu_zonestats ! boot_zonestats) { free_percpu(zone-per_cpu_zonestats); zone-per_cpu_zonestats boot_zonestats; } } }逐段解析检查是否为动态分配if (zone-per_cpu_pageset ! boot_pageset)确保只对真正动态分配的结构做释放。如果 zone 从未被 populated 过它可能一直指向boot_pageset。排空剩余的 vmstat 增量在释放per_cpu_zonestats之前遍历所有在线 CPU调用drain_zonestat()将累积的 per-CPU 统计增量刷入全局统计中。如果直接释放这些增量数据就丢失了。释放并重置free_percpu()释放动态分配的 per-CPU 内存然后将指针重置为boot_pageset/boot_zonestats使 zone 回到启动早期的“占位”状态。历史演进与关键修复1. 移除无效的 IRQ 保护2021年早期版本在函数开头使用了local_irq_save()/local_irq_restore()注释声称是为了“避免与drain_pages()的竞态”。但 Mel Gorman 指出这是一个无效的保护local_irq_save只影响当前 CPU如果内存热移除在 CPU A 上运行而drain_pages在 CPU B 上运行禁用 CPU A 的中断对 CPU B 毫无作用。修复方案删除了这对 IRQ 操作转而依赖内存热移除路径的既有顺序保证在调用zone_pcp_reset()之前zone 的 PCP 已经被zone_pcp_disable()排空和禁用并且 zone 已从 zonelist 中移除因此不会有新的分配路径访问到这些结构。2.boot_zonestats的重复释放修复2022年在!SMP !NUMA配置下struct per_cpu_zonestat的大小可能为 0此时zone-per_cpu_zonestats始终等于boot_zonestats。旧代码无条件调用free_percpu(zone-per_cpu_zonestats)会错误地释放静态的boot_zonestats。修复方案增加了if (zone-per_cpu_zonestats ! boot_zonestats)检查。3. 可能的后续重构2021年Mel Gorman 曾提议将zone_pcp_reset()重命名为zone_pcp_destroy()并调整调用顺序让build_all_zonelists()在释放 PCP 结构之前执行从而从机制上彻底消除 use-after-free 的可能。这个提案在社区中引发过讨论但最终是否完全采纳取决于后续的内核版本演进。与相关函数的关系函数职责zone_pcp_disable()热移除前调用排空 PCP将 high/batch 设为 0/1zone_pcp_reset()热移除完成后调用释放动态 PCP 结构重置为 bootzone_pcp_enable()如果 zone 重新上线恢复 PCP 配置zone_pcp_update()zone 大小变化时更新 PCP 配置非完全移除总结zone_pcp_reset()是内存热移除路径的 PCP 清理器当 zone 被完全下线后它排空 per-CPU 统计增量释放动态分配的per_cpu_pageset和per_cpu_zonestats并将指针重置回静态的boot_pageset/boot_zonestats。2021年删除了无效的 IRQ 保护2022年修复了boot_zonestats被重复释放的 bug其正确性依赖于热移除路径中“PCP 已排空且 zone 已从 zonelist 移除”的顺序保证。
延伸阅读

更多相关文章

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 2:26:00

PHP安全漏洞修复指南:防SQL注入与XSS

一、为什么 PHP 项目总被盯上做 PHP 开发这些年,我见过太多项目上线后被黑的情况。说句实话,大部分漏洞并不是什么高深的技术,翻来覆去就是 SQL 注入和 XSS 这两类。很多新手写代码的时候图省事,直接把用户输入拼进 SQL 语句&…

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
免费获取方案
☎咨询二维码 ☎ ↑