Нужно ли вызывать rcu_read_lock в контексте softirq
Реализация rcu_read_lock - отключение preempt и барьера. И контекст softirq не будет вытеснен. Поэтому необходимо ли вызывать rcu_read_lock в контексте softirq. Важен ли барьер?
3 ответа
Да, надо использовать rcu_read_lock
чтобы получить доступ к указателям, которые находятся под защитой rcu, даже в контексте softirq.
Как вы указали, некоторые реализации (например, TINY_RCU) rcu_read_lock
и softirq делают так, чтобы не было риска повреждения, даже если вы не разделяете критические разделы на стороне чтения rcu с помощью rcu_read_lock
, Тем не менее, это не гарантия rcu api, только "взлом" из-за конкретной реализации. Этот хак может сломаться с другой реализацией rcu (например: PREEMPT_RCU).
Если вы хотите рассматривать softirq как явные критические разделы на стороне чтения rcu, вы должны использовать API RCH-sched: Documentation / RCU / whatisRCU.txt
В следующем разделе статьи, написанной основным автором RCU, непосредственно рассматривается ваш вопрос: Требования к RCU, часть 1: основы - отключение вытеснения не блокирует льготные периоды
Я бы добавил тот код, который делает rcu_dereference
вне rcu_read_lock
вызовет предупреждения о блокировке, если CONFIG_PROVE_RCU=y.
Это хорошая идея, чтобы призвать rcu_read_lock
в softirq
контекст для целей документа, так что вы и другие разработчики знаете, что здесь используются данные, защищенные RCU.
Rcu_read_lock предназначен для одновременной защиты некоторого изменяемого ресурса ядра, что приводит к ошибке состояния гонки.
То, что ресурс должен предотвращать: это одновременное использование и изменение двумя программными задачами / контекстами.
В Linux одновременная модификация может происходить либо:
- переключение контекста с задачи на задачу,
- переключение контекста с задачи на контекст IRQ
- одновременный доступ из задачи в разных ядрах VCPU
Событие в одноядерной среде ЦП, 1) и 2) может все же произойти. В случае изменения критического ресурса, повышения IRQ программного обеспечения, введите программный контекст IRQ, запустите обработчик IRQ и измените один и тот же ресурс одновременно.