diff --git a/Documentation/translations/zh_CN/core-api/cpu_hotplug.rst b/Documentation/translations/zh_CN/core-api/cpu_hotplug.rst new file mode 100644 index 0000000000000000000000000000000000000000..85a264287426a9eed81695336eb7546bb3623a00 --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/cpu_hotplug.rst @@ -0,0 +1,348 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/core-api/cpu_hotplug.rst +:翻译: + + å¸å»¶è…¾ Yanteng Si <siyanteng@loongson.cn> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +.. _cn_core_api_cpu_hotplug: + +================= +å†…æ ¸ä¸çš„CPUçƒæ‹”æ’ +================= + +:时间: 2016å¹´12月 +:作者: Sebastian Andrzej Siewior <bigeasy@linutronix.de>, + Rusty Russell <rusty@rustcorp.com.au>, + Srivatsa Vaddagiri <vatsa@in.ibm.com>, + Ashok Raj <ashok.raj@intel.com>, + Joel Schopp <jschopp@austin.ibm.com> + +简介 +==== + +现代系统架构的演进已ç»åœ¨å¤„ç†å™¨ä¸å¼•å…¥äº†å…ˆè¿›çš„é”™è¯¯æŠ¥å‘Šå’Œçº æ£èƒ½åŠ›ã€‚有一些OEM也支 +æŒå¯çƒæ‹”æ’çš„NUMA(Non Uniform Memory Access,éžç»Ÿä¸€å†…å˜è®¿é—®ï¼‰ç¡¬ä»¶,å…¶ä¸ç‰©ç† +节点的æ’入和移除需è¦æ”¯æŒCPUçƒæ’拔。 + +è¿™æ ·çš„è¿›æ¥è¦æ±‚å†…æ ¸å¯ç”¨çš„CPU被移除,è¦ä¹ˆæ˜¯å‡ºäºŽé…ç½®çš„åŽŸå› ï¼Œè¦ä¹ˆæ˜¯å‡ºäºŽRAS的目的, +以ä¿æŒä¸€ä¸ªä¸éœ€è¦çš„CPUä¸åœ¨ç³»ç»Ÿæ‰§è¡Œè·¯å¾„ã€‚å› æ¤éœ€è¦åœ¨Linuxå†…æ ¸ä¸æ”¯æŒCPUçƒæ‹”æ’。 + +CPUçƒæ‹”æ’支æŒçš„一个更新颖的用途是它在SMPçš„æš‚åœæ¢å¤æ”¯æŒä¸çš„应用。åŒæ ¸å’Œè¶…线程支 +æŒä½¿å¾—å³ä½¿æ˜¯ç¬”记本电脑也能è¿è¡Œä¸æ”¯æŒè¿™äº›æ–¹æ³•çš„SMPå†…æ ¸ã€‚ + + +命令行开关 +========== + +``maxcpus=n`` + é™åˆ¶å¯åŠ¨æ—¶çš„CPU为 *n* ä¸ªã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ æœ‰å››ä¸ªCPU,使用 ``maxcpus=2`` å°†åªèƒ½å¯ + åŠ¨ä¸¤ä¸ªã€‚ä½ å¯ä»¥é€‰æ‹©ç¨åŽè®©å…¶ä»–CPU上线。 + +``nr_cpus=n`` + é™åˆ¶å†…æ ¸å°†æ”¯æŒçš„CPU总é‡ã€‚如果这里æ供的数é‡ä½ŽäºŽå®žé™…å¯ç”¨çš„CPUæ•°é‡ï¼Œé‚£ä¹ˆå…¶ä»–CPU + 以åŽå°±ä¸èƒ½ä¸Šçº¿äº†ã€‚ + +``additional_cpus=n`` + 使用它æ¥é™åˆ¶å¯çƒæ’拔的CPU。该选项设置 + ``cpu_possible_mask = cpu_present_mask + additional_cpus`` + + 这个选项åªé™äºŽIA64架构。 + +``possible_cpus=n`` + 这个选项设置 ``cpu_possible_mask`` ä¸çš„ ``possible_cpus`` ä½ã€‚ + + 这个选项åªé™äºŽX86å’ŒS390架构。 + +``cpu0_hotplug`` + å…许关é—CPU0。 + + 这个选项åªé™äºŽX86架构。 + +CPUä½å›¾ +======= + +``cpu_possible_mask`` + 系统ä¸å¯èƒ½å¯ç”¨CPUçš„ä½å›¾ã€‚这是用æ¥ä¸ºper_cpuå˜é‡åˆ†é…一些å¯åŠ¨æ—¶çš„内å˜ï¼Œè¿™äº›å˜é‡ + ä¸ä¼šéšç€CPUçš„å¯ç”¨æˆ–ç§»é™¤è€Œå¢žåŠ /å‡å°‘。一旦在å¯åŠ¨æ—¶çš„å‘çŽ°é˜¶æ®µè¢«è®¾ç½®ï¼Œè¯¥æ˜ å°„å°±æ˜¯é™æ€ + 的,也就是说,任何时候都ä¸ä¼šå¢žåŠ æˆ–åˆ é™¤ä»»ä½•ä½ã€‚æ ¹æ®ä½ 的系统需求æå‰å‡†ç¡®åœ°è°ƒæ•´å®ƒ + å¯ä»¥èŠ‚çœä¸€äº›å¯åŠ¨æ—¶çš„内å˜ã€‚ + +``cpu_online_mask`` + 当å‰åœ¨çº¿çš„所有CPUçš„ä½å›¾ã€‚在一个CPUå¯ç”¨äºŽå†…æ ¸è°ƒåº¦å¹¶å‡†å¤‡æŽ¥æ”¶è®¾å¤‡çš„ä¸æ–åŽï¼Œå®ƒè¢« + 设置在 ``__cpu_up()`` ä¸ã€‚当使用 ``__cpu_disable()`` å…³é—一个CPU时,它被清 + 空,在æ¤ä¹‹å‰ï¼Œæ‰€æœ‰çš„æ“作系统æœåŠ¡åŒ…括ä¸æ–都被è¿ç§»åˆ°å¦ä¸€ä¸ªç›®æ ‡CPU。 + +``cpu_present_mask`` + 系统ä¸å½“å‰å˜åœ¨çš„CPUçš„ä½å›¾ã€‚它们并éžå…¨éƒ¨åœ¨çº¿ã€‚当物ç†çƒæ‹”æ’被相关的å系统 + (如ACPI)处ç†æ—¶ï¼Œå¯ä»¥æ”¹å˜å’Œæ·»åŠ æ–°çš„ä½æˆ–从ä½å›¾ä¸åˆ 除,这å–决于事件是 + hot-add/hot-remove。目å‰è¿˜æ²¡æœ‰å®šæ»è§„定。典型的用法是在å¯åŠ¨æ—¶å¯åŠ¨æ‹“扑结构,这时 + çƒæ’拔被ç¦ç”¨ã€‚ + +ä½ çœŸçš„ä¸éœ€è¦æ“作任何系统的CPUæ˜ å°„ã€‚åœ¨å¤§å¤šæ•°æƒ…å†µä¸‹ï¼Œå®ƒä»¬åº”è¯¥æ˜¯åªè¯»çš„。当设置æ¯ä¸ª +CPU资æºæ—¶ï¼Œå‡ 乎总是使用 ``cpu_possible_mask`` 或 ``for_each_possible_cpu()`` +æ¥è¿›è¡Œè¿ä»£ã€‚å® ``for_each_cpu()`` å¯ä»¥ç”¨æ¥è¿ä»£ä¸€ä¸ªè‡ªå®šä¹‰çš„CPU掩ç 。 + +ä¸è¦ä½¿ç”¨ ``cpumask_t`` 以外的任何东西æ¥è¡¨ç¤ºCPUçš„ä½å›¾ã€‚ + + +使用CPUçƒæ‹”æ’ +============= + +å†…æ ¸é€‰é¡¹ *CONFIG_HOTPLUG_CPU* 需è¦è¢«å¯ç”¨ã€‚它目å‰å¯ç”¨äºŽå¤šç§æž¶æž„,包括ARMã€MIPS〠+PowerPCå’ŒX86。é…置是通过sysfs接å£å®Œæˆçš„:: + + $ ls -lh /sys/devices/system/cpu + total 0 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu0 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu1 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu2 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu3 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu4 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu5 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu6 + drwxr-xr-x 9 root root 0 Dec 21 16:33 cpu7 + drwxr-xr-x 2 root root 0 Dec 21 16:33 hotplug + -r--r--r-- 1 root root 4.0K Dec 21 16:33 offline + -r--r--r-- 1 root root 4.0K Dec 21 16:33 online + -r--r--r-- 1 root root 4.0K Dec 21 16:33 possible + -r--r--r-- 1 root root 4.0K Dec 21 16:33 present + +文件 *offline* 〠*online* ã€*possible* ã€*present* 代表CPU掩ç 。æ¯ä¸ªCPU文件 +夹包å«ä¸€ä¸ª *online* 文件,控制逻辑上的开(1)和关(0)状æ€ã€‚è¦åœ¨é€»è¾‘上关é—CPU4:: + + $ echo 0 > /sys/devices/system/cpu/cpu4/online + smpboot: CPU 4 is now offline + +一旦CPU被关é—,它将从 */proc/interrupts* ã€*/proc/cpuinfo* ä¸è¢«åˆ 除,也ä¸åº”该 +被 *top* 命令显示出æ¥ã€‚è¦è®©CPU4é‡æ–°ä¸Šçº¿:: + + $ echo 1 > /sys/devices/system/cpu/cpu4/online + smpboot: Booting Node 0 Processor 4 APIC 0x1 + +CPUåˆå¯ä»¥ä½¿ç”¨äº†ã€‚这应该对所有的CPU都有效。CPU0通常比较特殊,被排除在CPUçƒæ‹”æ’之外。 +在X86ä¸Šï¼Œå†…æ ¸é€‰é¡¹ *CONFIG_BOOTPARAM_HOTPLUG_CPU0* 必须被å¯ç”¨ï¼Œä»¥ä¾¿èƒ½å¤Ÿå…³é—CPU0。 +或者,å¯ä»¥ä½¿ç”¨å†…æ ¸å‘½ä»¤é€‰é¡¹ *cpu0_hotplug* 。CPU0的一些已知的ä¾èµ–性: + +* ä»Žä¼‘çœ /æš‚åœä¸æ¢å¤ã€‚如果CPU0处于离线状æ€ï¼Œä¼‘çœ /æš‚åœå°†å¤±è´¥ã€‚ +* PICä¸æ–。如果检测到PICä¸æ–,CPU0å°±ä¸èƒ½è¢«ç§»é™¤ã€‚ + +å¦‚æžœä½ å‘现CPU0上有任何ä¾èµ–性,请告知Fenghua Yu <fenghua.yu@intel.com>。 + +CPUçš„çƒæ‹”æ’å作 +=============== + +下线情况 +-------- + +一旦CPU被逻辑关é—,注册的çƒæ’拔状æ€çš„清除回调将被调用,从 ``CPUHP_ONLINE`` 开始,在 +``CPUHP_OFFLINE`` 状æ€ç»“æŸã€‚这包括: + +* å¦‚æžœä»»åŠ¡å› æš‚åœæ“作而被冻结,那么 *cpuhp_tasks_frozen* 将被设置为true。 + +* 所有进程都会从这个将è¦ç¦»çº¿çš„CPUè¿ç§»åˆ°æ–°çš„CPU上。新的CPU是从æ¯ä¸ªè¿›ç¨‹çš„当å‰cpusetä¸ + 选择的,它å¯èƒ½æ˜¯æ‰€æœ‰åœ¨çº¿CPU的一个å集。 + +* 所有针对这个CPUçš„ä¸æ–都被è¿ç§»åˆ°æ–°çš„CPU上。 + +* 计时器也会被è¿ç§»åˆ°æ–°çš„CPU上。 + +* 一旦所有的æœåŠ¡è¢«è¿ç§»ï¼Œå†…æ ¸ä¼šè°ƒç”¨ä¸€ä¸ªç‰¹å®šçš„ä¾‹ç¨‹ ``__cpu_disable()`` æ¥è¿›è¡Œç‰¹å®šçš„清 + ç†ã€‚ + +使用çƒæ’æ‹”API +------------- + +一旦一个CPU下线或上线,就有å¯èƒ½æ”¶åˆ°é€šçŸ¥ã€‚这对æŸäº›éœ€è¦æ ¹æ®å¯ç”¨CPUæ•°é‡æ‰§è¡ŒæŸç§è®¾ç½®æˆ–清 +ç†åŠŸèƒ½çš„驱动程åºæ¥è¯´å¯èƒ½å¾ˆé‡è¦:: + + #include <linux/cpuhotplug.h> + + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "X/Y:online", + Y_online, Y_prepare_down); + +*X* 是å系统, *Y* 是特定的驱动程åºã€‚ *Y_online* 回调将在所有在线CPU的注册过程ä¸è¢«è°ƒç”¨ã€‚ +如果在线回调期间å‘生错误, *Y_prepare_down* 回调将在所有之å‰è°ƒç”¨è¿‡åœ¨çº¿å›žè°ƒçš„CPU上调 +用。注册完æˆåŽï¼Œä¸€æ—¦æœ‰CPU上线, *Y_online* 回调将被调用,当CPUå…³é—时, *Y_prepare_down* +将被调用。所有之å‰åœ¨ *Y_online* ä¸åˆ†é…的资æºéƒ½åº”该在 *Y_prepare_down* ä¸é‡Šæ”¾ã€‚如果在 +注册过程ä¸å‘生错误,返回值 *ret* 为负值。å¦åˆ™ä¼šè¿”回一个æ£å€¼ï¼Œå…¶ä¸åŒ…å«åŠ¨æ€åˆ†é…çŠ¶æ€ +( *CPUHP_AP_ONLINE_DYN* )的分é…çƒæ‹”æ’。对于预定义的状æ€ï¼Œå®ƒå°†è¿”回0。 + +该回调å¯ä»¥é€šè¿‡è°ƒç”¨ ``cpuhp_remove_state()`` æ¥åˆ 除。如果是动æ€åˆ†é…çš„çŠ¶æ€ +( *CPUHP_AP_ONLINE_DYN* ),则使用返回的状æ€ã€‚在移除çƒæ’拔状æ€çš„过程ä¸ï¼Œå°†è°ƒç”¨æ‹†è§£å›žè°ƒã€‚ + +多个实例 +~~~~~~~~ + +如果一个驱动程åºæœ‰å¤šä¸ªå®žä¾‹ï¼Œå¹¶ä¸”æ¯ä¸ªå®žä¾‹éƒ½éœ€è¦ç‹¬ç«‹æ‰§è¡Œå›žè°ƒï¼Œé‚£ä¹ˆå¾ˆå¯èƒ½åº”该使用 +``multi-state`` 。首先需è¦æ³¨å†Œä¸€ä¸ªå¤šçŠ¶æ€çš„状æ€:: + + ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "X/Y:online, + Y_online, Y_prepare_down); + Y_hp_online = ret; + +``cpuhp_setup_state_multi()`` 的行为与 ``cpuhp_setup_state()`` 类似,åªæ˜¯å®ƒ +为多状æ€å‡†å¤‡äº†å›žè°ƒï¼Œä½†ä¸è°ƒç”¨å›žè°ƒã€‚这是一个一次性的设置。 +一旦分é…äº†ä¸€ä¸ªæ–°çš„å®žä¾‹ï¼Œä½ éœ€è¦æ³¨å†Œè¿™ä¸ªæ–°å®žä¾‹:: + + ret = cpuhp_state_add_instance(Y_hp_online, &d->node); + +è¿™ä¸ªå‡½æ•°å°†æŠŠè¿™ä¸ªå®žä¾‹æ·»åŠ åˆ°ä½ å…ˆå‰åˆ†é…çš„ ``Y_hp_online`` 状æ€ï¼Œå¹¶åœ¨æ‰€æœ‰åœ¨çº¿çš„ +CPU上调用先å‰æ³¨å†Œçš„回调( ``Y_online`` )。 *node* å…ƒç´ æ˜¯ä½ çš„æ¯ä¸ªå®žä¾‹æ•°æ®ç»“æž„ +ä¸çš„一个 ``struct hlist_node`` æˆå‘˜ã€‚ + +在移除该实例时:: + + cpuhp_state_remove_instance(Y_hp_online, &d->node) + +应该被调用,这将在所有在线CPU上调用拆分回调。 + +手动设置 +~~~~~~~~ + +通常情况下,在注册或移除状æ€æ—¶è°ƒç”¨setupå’Œteamdownå›žè°ƒæ˜¯å¾ˆæ–¹ä¾¿çš„ï¼Œå› ä¸ºé€šå¸¸åœ¨CPU上线 +(下线)和驱动的åˆå§‹è®¾ç½®ï¼ˆå…³é—)时需è¦æ‰§è¡Œè¯¥æ“作。然而,æ¯ä¸ªæ³¨å†Œå’Œåˆ 除功能也有一个 +_nocallsçš„åŽç¼€ï¼Œå¦‚æžœä¸å¸Œæœ›è°ƒç”¨å›žè°ƒï¼Œåˆ™ä¸è°ƒç”¨æ‰€æ供的回调。在手动设置(或关é—)期间, +应该使用 ``get_online_cpus()`` å’Œ ``put_online_cpus()`` 函数æ¥æŠ‘制CPUçƒæ’æ‹”æ“作。 + + +äº‹ä»¶çš„é¡ºåº +---------- + +çƒæ’拔状æ€è¢«å®šä¹‰åœ¨ ``include/linux/cpuhotplug.h``: + +* ``CPUHP_OFFLINE`` ... ``CPUHP_AP_OFFLINE`` 状æ€æ˜¯åœ¨CPUå¯åŠ¨å‰è°ƒç”¨çš„。 + +* ``CPUHP_AP_OFFLINE`` ... ``CPUHP_AP_ONLINE`` 状æ€æ˜¯åœ¨CPU被å¯åŠ¨åŽè¢«è°ƒç”¨çš„。 + ä¸æ–是关é—的,调度程åºè¿˜æ²¡æœ‰åœ¨è¿™ä¸ªCPU上活动。从 ``CPUHP_AP_OFFLINE`` 开始, + å›žè°ƒè¢«è°ƒç”¨åˆ°ç›®æ ‡CPU上。 + +* ``CPUHP_AP_ONLINE_DYN`` å’Œ ``CPUHP_AP_ONLINE_DYN_END`` 之间的状æ€è¢«ä¿ç•™ + 给动æ€åˆ†é…。 + +* 这些状æ€åœ¨CPUå…³é—时以相å的顺åºè°ƒç”¨ï¼Œä»Ž ``CPUHP_ONLINE`` 开始,在 ``CPUHP_OFFLINE`` + åœæ¢ã€‚这里的回调是在将被关é—çš„CPU上调用的,直到 ``CPUHP_AP_OFFLINE`` 。 + +通过 ``CPUHP_AP_ONLINE_DYN`` 动æ€åˆ†é…的状æ€é€šå¸¸å·²ç»è¶³å¤Ÿäº†ã€‚然而,如果在å¯åŠ¨æˆ–å…³é— +期间需è¦æ›´æ—©çš„调用,那么应该获得一个显å¼çŠ¶æ€ã€‚如果çƒæ‹”æ’事件需è¦ç›¸å¯¹äºŽå¦ä¸€ä¸ªçƒæ‹”æ’事 +件的特定排åºï¼Œä¹Ÿå¯èƒ½éœ€è¦ä¸€ä¸ªæ˜¾å¼çŠ¶æ€ã€‚ + +测试çƒæ‹”æ’çŠ¶æ€ +============== + +验è¯è‡ªå®šä¹‰çŠ¶æ€æ˜¯å¦æŒ‰é¢„期工作的一个方法是关é—一个CPU,然åŽå†æŠŠå®ƒä¸Šçº¿ã€‚也å¯ä»¥æŠŠCPUæ”¾åˆ°æŸ +些状æ€ï¼ˆä¾‹å¦‚ ``CPUHP_AP_ONLINE`` ),然åŽå†å›žåˆ° ``CPUHP_ONLINE`` 。这将模拟在 +``CPUHP_AP_ONLINE`` 之åŽçš„一个状æ€å‡ºçŽ°é”™è¯¯ï¼Œä»Žè€Œå¯¼è‡´å›žæ»šåˆ°åœ¨çº¿çŠ¶æ€ã€‚ + +所有注册的状æ€éƒ½è¢«åˆ—举在 ``/sys/devices/system/cpu/hotplug/states`` :: + + $ tail /sys/devices/system/cpu/hotplug/states + 138: mm/vmscan:online + 139: mm/vmstat:online + 140: lib/percpu_cnt:online + 141: acpi/cpu-drv:online + 142: base/cacheinfo:online + 143: virtio/net:online + 144: x86/mce:online + 145: printk:online + 168: sched:active + 169: online + +è¦å°†CPU4回滚到 ``lib/percpu_cnt:online`` ,å†å›žåˆ°åœ¨çº¿çŠ¶æ€ï¼Œåªéœ€å‘出:: + + $ cat /sys/devices/system/cpu/cpu4/hotplug/state + 169 + $ echo 140 > /sys/devices/system/cpu/cpu4/hotplug/target + $ cat /sys/devices/system/cpu/cpu4/hotplug/state + 140 + +需è¦æ³¨æ„的是,状æ€140的清除回调已ç»è¢«è°ƒç”¨ã€‚现在é‡æ–°ä¸Šçº¿:: + + $ echo 169 > /sys/devices/system/cpu/cpu4/hotplug/target + $ cat /sys/devices/system/cpu/cpu4/hotplug/state + 169 + +å¯ç”¨è¿½è¸ªäº‹ä»¶åŽï¼Œå•ä¸ªæ¥éª¤ä¹Ÿæ˜¯å¯è§çš„:: + + # TASK-PID CPU# TIMESTAMP FUNCTION + # | | | | | + bash-394 [001] 22.976: cpuhp_enter: cpu: 0004 target: 140 step: 169 (cpuhp_kick_ap_work) + cpuhp/4-31 [004] 22.977: cpuhp_enter: cpu: 0004 target: 140 step: 168 (sched_cpu_deactivate) + cpuhp/4-31 [004] 22.990: cpuhp_exit: cpu: 0004 state: 168 step: 168 ret: 0 + cpuhp/4-31 [004] 22.991: cpuhp_enter: cpu: 0004 target: 140 step: 144 (mce_cpu_pre_down) + cpuhp/4-31 [004] 22.992: cpuhp_exit: cpu: 0004 state: 144 step: 144 ret: 0 + cpuhp/4-31 [004] 22.993: cpuhp_multi_enter: cpu: 0004 target: 140 step: 143 (virtnet_cpu_down_prep) + cpuhp/4-31 [004] 22.994: cpuhp_exit: cpu: 0004 state: 143 step: 143 ret: 0 + cpuhp/4-31 [004] 22.995: cpuhp_enter: cpu: 0004 target: 140 step: 142 (cacheinfo_cpu_pre_down) + cpuhp/4-31 [004] 22.996: cpuhp_exit: cpu: 0004 state: 142 step: 142 ret: 0 + bash-394 [001] 22.997: cpuhp_exit: cpu: 0004 state: 140 step: 169 ret: 0 + bash-394 [005] 95.540: cpuhp_enter: cpu: 0004 target: 169 step: 140 (cpuhp_kick_ap_work) + cpuhp/4-31 [004] 95.541: cpuhp_enter: cpu: 0004 target: 169 step: 141 (acpi_soft_cpu_online) + cpuhp/4-31 [004] 95.542: cpuhp_exit: cpu: 0004 state: 141 step: 141 ret: 0 + cpuhp/4-31 [004] 95.543: cpuhp_enter: cpu: 0004 target: 169 step: 142 (cacheinfo_cpu_online) + cpuhp/4-31 [004] 95.544: cpuhp_exit: cpu: 0004 state: 142 step: 142 ret: 0 + cpuhp/4-31 [004] 95.545: cpuhp_multi_enter: cpu: 0004 target: 169 step: 143 (virtnet_cpu_online) + cpuhp/4-31 [004] 95.546: cpuhp_exit: cpu: 0004 state: 143 step: 143 ret: 0 + cpuhp/4-31 [004] 95.547: cpuhp_enter: cpu: 0004 target: 169 step: 144 (mce_cpu_online) + cpuhp/4-31 [004] 95.548: cpuhp_exit: cpu: 0004 state: 144 step: 144 ret: 0 + cpuhp/4-31 [004] 95.549: cpuhp_enter: cpu: 0004 target: 169 step: 145 (console_cpu_notify) + cpuhp/4-31 [004] 95.550: cpuhp_exit: cpu: 0004 state: 145 step: 145 ret: 0 + cpuhp/4-31 [004] 95.551: cpuhp_enter: cpu: 0004 target: 169 step: 168 (sched_cpu_activate) + cpuhp/4-31 [004] 95.552: cpuhp_exit: cpu: 0004 state: 168 step: 168 ret: 0 + bash-394 [005] 95.553: cpuhp_exit: cpu: 0004 state: 169 step: 140 ret: 0 + +å¯ä»¥çœ‹åˆ°ï¼ŒCPU4一直下é™åˆ°æ—¶é—´æˆ³22.996,然åŽåˆä¸Šå‡åˆ°95.552。所有被调用的回调, +包括它们的返回代ç 都å¯ä»¥åœ¨è·Ÿè¸ªä¸çœ‹åˆ°ã€‚ + +架构的è¦æ±‚ +========== + +需è¦å…·å¤‡ä»¥ä¸‹åŠŸèƒ½å’Œé…置: + +``CONFIG_HOTPLUG_CPU`` + 这个é…置项需è¦åœ¨Kconfigä¸å¯ç”¨ + +``__cpu_up()`` + 调出一个cpuçš„æž¶æž„æŽ¥å£ + +``__cpu_disable()`` + å…³é—CPU的架构接å£ï¼Œåœ¨æ¤ç¨‹åºè¿”回åŽï¼Œå†…æ ¸ä¸èƒ½å†å¤„ç†ä»»ä½•ä¸æ–。这包括定时器的关é—。 + +``__cpu_die()`` + 这实际上是为了确ä¿CPUçš„æ»äº¡ã€‚实际上,看看其他架构ä¸å®žçŽ°CPUçƒæ‹”æ’的一些示例代 + ç 。对于那个特定的架构,处ç†å™¨è¢«ä»Ž ``idle()`` 循环ä¸æ‹¿ä¸‹æ¥ã€‚ ``__cpu_die()`` + 通常会ç‰å¾…一些per_cpu状æ€çš„设置,以确ä¿å¤„ç†å™¨çš„æ»äº¡ä¾‹ç¨‹è¢«è°ƒç”¨æ¥ä¿æŒæ´»è·ƒã€‚ + +用户空间通知 +============ + +在CPUæˆåŠŸä¸Šçº¿æˆ–下线åŽï¼Œudev事件被å‘é€ã€‚一个udev规则,比如:: + + SUBSYSTEM=="cpu", DRIVERS=="processor", DEVPATH=="/devices/system/cpu/*", RUN+="the_hotplug_receiver.sh" + +将接收所有事件。一个åƒè¿™æ ·çš„脚本:: + + #!/bin/sh + + if [ "${ACTION}" = "offline" ] + then + echo "CPU ${DEVPATH##*/} offline" + + elif [ "${ACTION}" = "online" ] + then + echo "CPU ${DEVPATH##*/} online" + + fi + +å¯ä»¥è¿›ä¸€æ¥å¤„ç†è¯¥äº‹ä»¶ã€‚ + +å†…æ ¸å†…è”文档å‚考 +================ + +该APIåœ¨ä»¥ä¸‹å†…æ ¸ä»£ç ä¸: + +include/linux/cpuhotplug.h diff --git a/Documentation/translations/zh_CN/core-api/index.rst b/Documentation/translations/zh_CN/core-api/index.rst index 71a212a2a9db1b73d11f2803f734deb8ab5b4721..67252125ddeec9dab9f899a96cd75a4728ee4dac 100644 --- a/Documentation/translations/zh_CN/core-api/index.rst +++ b/Documentation/translations/zh_CN/core-api/index.rst @@ -80,12 +80,12 @@ Todolist: :maxdepth: 1 cachetlb + cpu_hotplug genericirq Todolist: - cpu_hotplug memory-hotplug protection-keys