Если я не получу спинлок в софттике, тогда можно спать? - PullRequest
0 голосов
/ 28 октября 2019

Если я не получаю спин-блокировку в контексте softirq, тогда нормально ли будет спать? Это не так, но сколько разных способов это приведет к сбою?

Я понимаю, что спать неправильно после приобретения спинлока. Процесс, переведенный в спящий режим, может проснуться на другом процессоре, в то время как спинлок был бы получен на другом процессоре. Прерывания были бы отключены на процессоре, где была получена спин-блокировка, в то время как восстановление происходит на другом процессоре. (Будет ли это немедленно вызывать панику ядра?) Но если не будет задействована спин-блокировка, будет ли работать сон или (вызов schedule ()) нормально? Или это неправильно из-за того, как работает сохранение / восстановление контекста? Если я вызываю schedule () в softirq, где сохраняется контекст / стек прерываний? стек режима ядра текущего процесса? Когда процесс снова запустится, сможет ли он продолжить с того места, где он ушел? Или здесь все пойдет не так? То есть schedule () не знает о стеке softirq / interrupt и не будет их сохранять. Поэтому, когда процесс снова запустится, он не будет иметь представления о softirq?

Сценарий 1: Отдельные стеки hardirq, softirq

Все регистры будут сохранены в стеке softirq. Теперь, если здесь вызывается schedule (), он сохраняет ebp в стеке softirq. Но когда этот процесс запустится снова, он выскочит из собственного стека ядра, и с этого момента может произойти все что угодно.

Сценарий 2. Стек ядра, используемый для hardirq и softirq

Что здесь может пойти не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...