LINUX.ORG.RU

rwsem, только не семафор

 , , ,


0

2

Доброго времени суток.

В ядре Linux есть такой замечательный синхронизационный примитив, как rwsem (семафор читателей-писателей). Поскольку это семафор, количество операций down() и up() должно быть сбалансировано, т. е. up() нужно сделать столько раз, сколько было сделано down().

Вопрос: как «обойти» требование сбалансированности? Я хочу, чтобы любой поток имел возможность единовременно разлочить семафор. Дело в том, что счётчик семафора у меня уже есть (количество зарезервированных блоков в ФС), а от rwsem мне нужна только обёртка над счётчиком.

В голову приходит разве что потрясающе грязный вариант вида while (rwsem_is_locked(&foo)) up_read(&foo);.

Или же, если счётчик уже есть, можно обойтись другим примитивом вместо rwsem?

★★★★★

Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Единый лок — это значит разрешать только одному потоку одновременно резервировать место? Это меняет текущее поведение ФС в сильно худшую сторону.

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

Единый лок — это значит разрешать только одному потоку одновременно резервировать место?

Да.

Это меняет текущее поведение ФС в сильно худшую сторону.

Не то, чтобы я тебе не верил, но с чего бы в «сильно»? То, что происходит под спинлоком, обычно делается очень быстро и не занимается I/O. Вдобавок, «список свободных блоков» намекает, что затронуты только операции write (не все) и ftruncate. Короче, у тебя есть данные профайлера или только предположения?

И да, требование хитрого rwsem для описанной задачи выглядит странно - лично я не понимаю, чем не хватит обычного коллбека, вызываемого при достижении «того момента, когда счётчик станет равен нулю».

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

когда счётчик станет равен нулю, и зарезервировать всё свободное на этот момент место (атомарно)

эквивалентно

Единый лок — это значит разрешать только одному потоку одновременно резервировать место? Это меняет текущее поведение ФС в сильно худшую сторону.

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

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

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Нее. Сейчас под спинлоком только изменяется счётчик (по факту там не один счётчик, а несколько взаимосвязанных переменных). А я хочу запихнуть под семафор весь жизненный цикл транзакции от резервирования места до освобождения не пригодившегося. Ну и да, это copy-on-write, поэтому затронуты вообще все операции.

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.