Нужно ли вызывать 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 одновременная модификация может происходить либо:

  1. переключение контекста с задачи на задачу,
  2. переключение контекста с задачи на контекст IRQ
  3. одновременный доступ из задачи в разных ядрах VCPU

Событие в одноядерной среде ЦП, 1) и 2) может все же произойти. В случае изменения критического ресурса, повышения IRQ программного обеспечения, введите программный контекст IRQ, запустите обработчик IRQ и измените один и тот же ресурс одновременно.

Другие вопросы по тегам