LINUX.ORG.RU

nested спинлоки


0

0

Гуглил, читал linux/Documentation/ но сходу не нашел, плохо или нет применять nested спинлоки в ядерном коде применительно к ядру 2.4.20 (саппорт старой железки). Приведу пример:

spinlock_t my_lock;

int f1()
{
unsigned long flags;

spin_lock_irqsave(&my_lock, flags);
f2();
spin_unlock_irqrestore(&my_lock, flags);
}

int f2()
{
unsigned long flags;

spin_lock_irqsave(&my_lock, flags);
/* do something */
spin_unlock_irqrestore(&my_lock, flags);
}

Правильно или нет при таком раскладе ставить спинлоки в f2(), раз уж она вызывается из f1()?

Спасибо!

★★

Товарищь, правило простое запоминай!
Спинлок занял -- тут-же отпускай!



Внутри спин лока ооочень противопоказанно делать что-то более тяжелое,
 чем просто изменение значений пары переменных. 

vnovouhov
()

> Правильно или нет при таком раскладе ставить спинлоки в f2(), раз уж 
> она вызывается из f1()?

обычно функцию, в которой захватывается блокировка, разбивают на две части по принципу

void __f1()
{
    // some code
}

void f1()
{
    acquire();
    __f1();
    release();
}

rei3er
()

Вложенные спинлоки - это плохо (да и вообще вложенных блокировок следует избегать по мере сил). Ну а в твоем примере ты пытаешься захватить уже захваченный спинлок - нить просто зависнет.

tailgunner ★★★★★
()

Совершенно не понятно, зачем тебе _двойной_ спинлок.

Может проще воспользоваться make_event'ом?

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

> (да и вообще вложенных блокировок следует избегать по мере сил)

why? 

> Ну а в твоем примере ты пытаешься захватить уже захваченный спинлок - нить просто зависнет.

Он делает 

lock(a)
  lock(a)
    что-то там
  unlock(a)
unlock(a)


чему тут виснуть, или линуксовый лок такой линуксовый?

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

> чему тут виснуть, или линуксовый лок такой линуксовый?

Уважаемый, пожалуйста подучите матчасть. Различайте спинлоки и мьютексы.

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

Условно говоря, спинлок, это вот такой код:

while (*lockValue != 0) ; *lockValue = 1;

Только исполненный атомарно (инструкция cmpxchg в x86)

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

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

> Уважаемый, пожалуйста подучите матчасть. Различайте спинлоки и мьютексы.

Обязательно подучу, к тому же я абсолютно не знаю что скрывается за spin_lock_* в линуксе. Впрочем, если развернуто ответить желания небыло - нечего было и выпендриваться.

nikolayd
()
Ответ на: комментарий от vnovouhov

> Прелесть локов в их ооочень низкой цене, когда защищаемый кусок кода -- очень мал.

Тю, InitializeCriticalSectionAndSpinCount - поток в suspend не уходит при входе в критическую секцию, afair. Выигрываем на усыплении/пробудки потока - всеж дороже чем в цикле покрутится. Хотя я не знаю как это(потоки) в линуксе реализовано.

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

> Хотя я не знаю как это(потоки) в линуксе реализовано.

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

vnovouhov
()
Ответ на: комментарий от nikolayd

> чему тут виснуть,

Спинлок нельзя захватывать дважды.

> или линуксовый лок такой линуксовый?

Линуксовый ядерный спинлок такой быстрый. Впрочем, сильно сомневаюсь, что вендовый ядерный спинлок разрешается захватывать дважды.

tailgunner ★★★★★
()

Я не уверен, но кажется в ядре 2.4 без поддержки многопроцессорности спинлок вообще холостой. Он НИЧЕГО не делает. Это связано с тем, что ядро невытесняемое и не может быть неожиданного переключения потоков, когда исполняется системный вызов. У меня в linux/spinlock.h такой код

#define spin_lock_irqsave(lock, flags) do { local_irq_save(flags); spin_lock(lock); } while (0)

#define spin_lock(lock) (void)(lock) /* Not "unused variable". */

Так что такой неправильный код все равно будет работать.

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