Что такое cpumask в mm_struct - PullRequest
       21

Что такое cpumask в mm_struct

0 голосов
/ 16 октября 2018

Я читаю код сброса TLB в ядре Linux и увидел, что ipi для отбрасывания были отправлены только на набор процессоров в cpu_vm_mask_var в соответствующем mm_struct, но я не смог найти, где обновляется cpu_vm_mask_var.

Итак, вопросы:

  1. Что представляет собой поле cpu_vm_mask_var в mm_struct?
  2. Где оно обновляется?

Я думаю, что в случае сбоя cpu_vm_mask_var должен сказать, сколько процессоров содержит записи TLB текущих процессов, но это то, что именно поддерживается cpu_vm_mask_var?

1 Ответ

0 голосов
/ 16 октября 2018

Дескриптор памяти каждого процесса имеет битовую маску под названием cpu_vm_mask_var, и она обычно используется, когда процесс выполняется хотя бы на одном процессоре.Когда процесс планируется запустить на процессоре, устанавливается соответствующий бит маски битов.Точно так же, когда планировщик решает запустить что-то еще на процессоре, соответствующий, но сбрасывается.Поле cpu_vm_mask_var изменяется в трех ситуациях:

  • Когда дескриптор памяти изменяется путем вызова switch_mm .В этом случае бит, соответствующий текущему процессору, очищается для предыдущего процесса и устанавливается для следующего процесса.
  • Когда в систему добавляется новый процессор, clear_tasks_mm_cpumask вызывается функция, которая сбрасывает бит, соответствующий новому процессору.
  • cpu_vm_mask_var используется для поддержки ленивого механизма переключения TLB.Если планировщик решит запустить поток ядра, он включит ленивый режим TLB, вызвав enter_lazy_tlb .Однако в этом случае нет необходимости аннулировать запись TLB, которая ссылается на запись структуры подкачки пользовательского режима, потому что потоки ядра не имеют доступа к записям пользовательского режима.Таким образом, производительность можно улучшить, отключив запросы на снятие TLB для процессора, на котором работает поток ядра, и отложите аннулирование до тех пор, пока не вернетесь к процессу, который может использовать недействительные записи.Когда процессор, на котором выполняется поток ядра, впервые получает межпроцессорное прерывание для аннулирования одной или нескольких записей TLB, вызывается функция switch_mm_irqs_off .Эта функция (в данном конкретном случае) будет сбрасывать бит, соответствующий текущему процессору в битовой маске, чтобы он больше не получал IPI, касающиеся сброса записей пользовательского режима TLB.Когда процессор переключается на процесс с другим дескриптором памяти, запись в CR3 сбрасывает все неглобальные записи TLB.В противном случае, когда процессор переключается обратно на тот же процесс, он знает, что один или несколько стал недействительным, и поэтому он также сбрасывает все неглобальные записи TLB.cpu_vm_mask_var изменяется в switch_mm_irqs_off.Обратите внимание, что очистка записей TLB в режиме ядра не использует этот механизм.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...