LINUX.ORG.RU

[kernel dev] Отключение/Подключение AP ядер процессора


0

0

Необходимо сначала отключить все ядра процессора, кроме загрузочного, после, соответственно, включить.

Подозреваю, что это можно сделать функциями:
Сразу для всех:

int disable_nonboot_cpus(void);
void enable_nonboot_cpus(void);

или же поотдельности:

int cpu_down(unsigned int cpu);
int cpu_up(unsigned int cpu);

Последнии используются при записи 0/1 в /sys/devices/system/cpu/cpu#/online.

Проблема заключается в том, что при попытке скомпилировать следующий тестовый модуль, появляются warning' и, из-за которых я не могу его загрузить в ядро:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cpu.h>

static int __init
init( void )
{
        return disable_nonboot_cpus();
}

static void __exit
uninit( void )
{
        enable_nonboot_cpus();
}

module_init( init );
module_exit( uninit );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("TEST");

make -C /lib/modules/2.6.33.5-124.relkin.fc13.x86_64/build M=/home/relkin/modules modules
make[1]: Entering directory `/usr/src/kernels/2.6.33.5-124.relkin.fc13.x86_64'
  CC [M]  /home/relkin/modules/test.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "disable_nonboot_cpus" [/home/relkin/modules/test.ko] undefined!
WARNING: "enable_nonboot_cpus" [/home/relkin/modules/test.ko] undefined!
  CC      /home/relkin/modules/test.mod.o
  LD [M]  /home/relkin/modules/test.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.33.5-124.relkin.fc13.x86_64'

Ядро собрано в нужной конфигурации.

Если использовать отдельно функцию cpu_down, то всё работает, но если в модуле есть cpu_up, то опять появляется warning.

Мне кажется, что дело может быть в объявлениях __cpuinit или __ref, но точно я не знаю, т. к. не знаю зачем они нужны.

Что за ламерские велосипеды? Кто мешает отключать ядра процессора через /sys/devices/system/cpu/cpu*/online ?

Led ★★★☆☆
()
Ответ на: комментарий от dimorphus

>Нужно, чтобы вся функциональность была инкапсулирована в модуле ядра.

Не нужно. Модуль ты всё равно из юзерспейса грузишь.

Led ★★★☆☆
()
Ответ на: комментарий от dimorphus

>Нужно, чтобы вся функциональность была инкапсулирована в модуле ядра.

Если так уж сильно нужно, используй cpu_down().

{en,dis}able_nonboot_cpus() - не экспортируются, поэтому во внешнем модуле их не задействуешь.

Led ★★★☆☆
()
Ответ на: комментарий от Led

> Если так уж сильно нужно, используй cpu_down().

Как я уже написал выше, cpu_down() работает, но если в коде есть cpu_up(), то при компиляции на cpu_up выскакивает warning ( undefined ). Модуль после этого не загружается.

dimorphus
() автор топика
Ответ на: комментарий от Led

> {en,dis}able_nonboot_cpus() - не экспортируются, поэтому во внешнем модуле их не задействуешь.

Как тогда их использует kexec, он же вроде тоже в виде модуля оформлен?

dimorphus
() автор топика
Ответ на: комментарий от dimorphus

> Как я уже написал выше, cpu_down() работает, но если в коде есть cpu_up(), то при компиляции на cpu_up выскакивает warning ( undefined ). Модуль после этого не загружается.

cpu_up тоже не экспортируется.

dimorphus
() автор топика
Ответ на: комментарий от dimorphus

> Как тогда их использует kexec, он же вроде тоже в виде модуля оформлен?

kexec.c и cpu.c в одной директории.

dimorphus
() автор топика
Ответ на: комментарий от dimorphus

>kexec.c и cpu.c в одной директории.

Да не важно это...

Для того, чтобы использовать во внешних модулях, символ должен быть проэкспортирован. kexec не собирвается внешним модулем.

Led ★★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.