~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/core-api/memory-hotplug.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. include:: ../disclaimer-zh_CN.rst
  2 
  3 :Original: Documentation/core-api/memory-hotplug.rst
  4 
  5 :翻译:
  6 
  7  司延腾 Yanteng Si <siyanteng@loongson.cn>
  8 
  9 :校译:
 10 
 11  吴想成 Wu XiangCheng <bobwxc@email.cn>
 12 
 13 .. _cn_core-api_memory-hotplug:
 14 
 15 ==========
 16 内存热插拔
 17 ==========
 18 
 19 内存热拔插事件通知器
 20 ====================
 21 
 22 热插拔事件被发送到一个通知队列中。
 23 
 24 在 ``include/linux/memory.h`` 中定义了六种类型的通知:
 25 
 26 MEM_GOING_ONLINE
 27   在新内存可用之前生成,以便能够为子系统处理内存做准备。页面分配器仍然无法从新
 28   的内存中进行分配。
 29 
 30 MEM_CANCEL_ONLINE
 31   如果MEM_GOING_ONLINE失败,则生成。
 32 
 33 MEM_ONLINE
 34   当内存成功上线时产生。回调可以从新的内存中分配页面。
 35 
 36 MEM_GOING_OFFLINE
 37   在开始对内存进行下线处理时生成。从内存中的分配不再可能,但是一些要下线的内存
 38   仍然在使用。回调可以用来释放一个子系统在指定内存块中已知的内存。
 39 
 40 MEM_CANCEL_OFFLINE
 41   如果MEM_GOING_OFFLINE失败,则生成。来自我们试图离线的内存块中的内存又可以使
 42   用了。
 43 
 44 MEM_OFFLINE
 45   在内存下线完成后生成。
 46 
 47 可以通过调用如下函数来注册一个回调程序:
 48 
 49   hotplug_memory_notifier(callback_func, priority)
 50 
 51 优先级数值较高的回调函数在数值较低的回调函数之前被调用。
 52 
 53 一个回调函数必须有以下原型::
 54 
 55   int callback_func(
 56     struct notifier_block *self, unsigned long action, void *arg);
 57 
 58 回调函数的第一个参数(self)是指向回调函数本身的通知器链块的一个指针。第二个参
 59 数(action)是上述的事件类型之一。第三个参数(arg)传递一个指向
 60 memory_notify结构体的指针::
 61 
 62         struct memory_notify {
 63                 unsigned long start_pfn;
 64                 unsigned long nr_pages;
 65                 int status_change_nid_normal;
 66                 int status_change_nid;
 67         }
 68 
 69 - start_pfn是在线/离线内存的start_pfn。
 70 
 71 - nr_pages是在线/离线内存的页数。
 72 
 73 - status_change_nid_normal是当nodemask的N_NORMAL_MEMORY被设置/清除时设置节
 74   点id,如果是-1,则nodemask状态不改变。
 75 
 76 - status_change_nid是当nodemask的N_MEMORY被(将)设置/清除时设置的节点id。这
 77   意味着一个新的(没上线的)节点通过联机获得新的内存,而一个节点失去了所有的内
 78   存。如果这个值为-1,那么nodemask的状态就不会改变。
 79 
 80   如果 status_changed_nid* >= 0,回调应该在必要时为节点创建/丢弃结构体。
 81 
 82 回调程序应返回 ``include/linux/notifier.h`` 中定义的NOTIFY_DONE, NOTIFY_OK,
 83 NOTIFY_BAD, NOTIFY_STOP中的一个值。
 84 
 85 NOTIFY_DONE和NOTIFY_OK对进一步处理没有影响。
 86 
 87 NOTIFY_BAD是作为对MEM_GOING_ONLINE、MEM_GOING_OFFLINE、MEM_ONLINE或MEM_OFFLINE
 88 动作的回应,用于取消热插拔。它停止对通知队列的进一步处理。
 89 
 90 NOTIFY_STOP停止对通知队列的进一步处理。
 91 
 92 内部锁
 93 ======
 94 
 95 当添加/删除使用内存块设备(即普通RAM)的内存时,device_hotplug_lock应该被保持
 96 为:
 97 
 98 - 针对在线/离线请求进行同步(例如,通过sysfs)。这样一来,内存块设备只有在内存
 99   被完全添加后才能被用户空间访问(.online/.state属性)。而在删除内存时,我们知
100   道没有人在临界区。
101 
102 - 与CPU热拔插或类似操作同步(例如ACPI和PPC相关操作)
103 
104 特别是,在添加内存和用户空间试图以比预期更快的速度上线该内存时,有可能出现锁反转,
105 使用device_hotplug_lock可以避免此情况:
106 
107 - device_online()将首先接受device_lock(),然后是mem_hotplug_lock。
108 
109 - add_memory_resource()将首先使用mem_hotplug_lock,然后是device_lock()(在创
110   建设备时,在bus_add_device()期间)。
111 
112 由于在使用device_lock()之前,设备对用户空间是可见的,这可能导致锁的反转。
113 
114 内存的上线/下线应该通过device_online()/device_offline()完成————确保它与通过
115 sysfs进行的操作正确同步。建议持有device_hotplug_lock(例如,保护online_type)。
116 
117 当添加/删除/上线/下线内存或者添加/删除异构或设备内存时,我们应该始终持有写模式的
118 mem_hotplug_lock,以序列化内存热插拔(例如访问全局/区域变量)。
119 
120 此外,mem_hotplug_lock(与device_hotplug_lock相反)在读取模式下允许一个相当
121 有效的get_online_mems/put_online_mems实现,所以访问内存的代码可以防止该内存
122 消失。

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php