Как RCU обрабатывает состояние читателя, начавшего чтение критического раздела, пока ожидает синхронизация_rcu () - PullRequest
0 голосов
/ 07 февраля 2020

В соответствии с документацией RCU (я считаю, что платформы RCU ядра и пользовательского пространства схожи), synchronize_rcu() ждет, пока все читатели (которые начали до вызова synchronize_rcu) завершат sh.
Что происходит с считыватели, которые запускаются после того, как synchronize_rcu() ожидает в течение льготного периода?
В чем разница между считывателями, запущенными после возврата synchronize_rcu(), и считывателями, запущенными в то время, когда synchronize_rcu() ожидает? Как каркас RCU справляется с этим?

1 Ответ

2 голосов
/ 07 февраля 2020

Новый читатель (который начал выполняться в критическом разделе после того, как synchronize_rcu () ожидает в течение льготного периода) считывает новую структуру данных?

Все читатели, входящие в критический раздел после rcu_assign_pointer() читать новую структуру данных.

В чем разница между считывателями, запущенными после возврата synize_rcu (), и считывателями, запущенными в то время, когда ожидает синхронизация_rcu ()?

Все, о чем вы говорите, зависит от того, если / когда новый указатель назначен. Назначение и чтение являются связанными вещами.


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

.. если данный ЦП выполняет переключение контекста, мы знаем, что он должен завершить все предыдущие критические секции RCU на стороне чтения. Как только все процессоры выполнили переключение контекста, все предыдущие критические секции RCU на стороне чтения будут завершены.
Итак, предположим, что мы удалили элемент данных из его структуры и затем вызвали synchronize_rcu (). После того, как synchronize_rcu () вернется, мы гарантируем, что не будет критических секций на стороне чтения RCU, содержащих ссылку на этот элемент данных, поэтому мы можем безопасно вернуть его.

Новые читатели ничего не знают о старых данных структура. «Обмен» указателями происходит по атомам c.
Еще раз: synchronize_rcu() не влияет на читатели - он просто гарантирует, что после его возврата мы можем освободить память, на которую указывает указатель (kfree()).

Кажется, вы не изучили основы Linux RCU.
Необходимо прочитать:

...