Решено: подсчет ссылок на модуль

Взгляд изнутри

Модератор: Модераторы разделов

Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Решено: подсчет ссылок на модуль

Сообщение RasenHerz »

пишу драйвер, который регистрирует в системе несколько устройств.
в функции, реализующей метод open() мне необходимо учитывать количество процессов, использующих данный драйвер, чтобы вернуть ядру всю "занятую память". рытье в исходниках (в частности linux/module.h ) дал определенный результат - структура типа struct module содержит поле ref->count, которое и является счетчиком ссылок на данный модуль. проблема заключается в следующем; значение этого поля нелязя увеличить или уменьшить стандартными арифмитическими операциями (сложение/вычитание/декремент/инкремент).

как можно самому управлять этим значением?
Спасибо сказали:
ssh
Сообщения: 78
ОС: Debian

Re: Решено: подсчет ссылок на модуль

Сообщение ssh »

MOD_INC_USE_COUNT при открытии, MOD_DEC_USE_COUNT при закрытии... Разве не работают?
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Решено: подсчет ссылок на модуль

Сообщение Zeus »

ssh писал(а):
21.07.2008 06:43
MOD_INC_USE_COUNT при открытии, MOD_DEC_USE_COUNT при закрытии... Разве не работают?

Может мне мой склероз врёт, но вроде когда я год назад писал модуль для ядра 2.6.какого-то - с этими макросами были какие-то проблемы.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: подсчет ссылок на модуль

Сообщение RasenHerz »

да в версиях ядра 2,6,* эти макросы убраны
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Решено: подсчет ссылок на модуль

Сообщение BlackStar »

• try_module_get(THIS_MODULE): Increment the use count.
• try_module_put(THIS_MODULE): Decrement the use count.
LightLang Team
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Решено: подсчет ссылок на модуль

Сообщение Zeus »

А, точно! try_module_*

Непонятно, правда, почему бы не завернуть эти конструкции (раз уж понадобились), в эти же макросы.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: подсчет ссылок на модуль

Сообщение RasenHerz »

у меня с этими макросами происходит очень интересная ситуация - если вызвать макрос внутри блока;

Код: Выделить всё

{
  try_module_get(THIS_MODULE);
  if(down_interruptible(&device->semaphore)){
    try_module_put(THIS_MODULE);
    goto out;
  }
...
  /*Здесь происходят операции ввода-вывода*/
...
out:
  up(&device->semaphore);
}

происходит зависание ОС, пару раз даже был Ooops... при замене down_interruptible(&device->semaphore) на просто down(&device->semaphore) все работает!!! не пойму в чем дело. может баг?
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Решено: подсчет ссылок на модуль

Сообщение Zeus »

Давно не видел в коде ключевого слова goto...
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Решено: подсчет ссылок на модуль

Сообщение Voice »

Zeus писал(а):
23.07.2008 12:44
Давно не видел в коде ключевого слова goto...

В исходниках ядра его хватает ;)
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Решено: подсчет ссылок на модуль

Сообщение halturin »

Voice писал(а):
23.07.2008 12:58
Zeus писал(а):
23.07.2008 12:44
Давно не видел в коде ключевого слова goto...

В исходниках ядра его хватает ;)

Только в критических местах.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: подсчет ссылок на модуль

Сообщение RasenHerz »

Давно не видел в коде ключевого слова goto...


кто-нибудь предложит лучший способ пропустить 64 строки кода? сомневаюсь... а вообще, при программировании модулей надо обходится без "выпендрежа" - малейшее упущение может закончится крахом системы. все должно быть простым, понятным и логичным,

собственно по сабжу, переписал try_module_get(), реализовал try_module_put()(как оказалось, такой функции у меня в исходниках вообще не объявлено).
сейчас все работает. тема закрыта.
Спасибо сказали: