Проблема «God Data Structure»
Ветка kvm-chainsaw была слита в основную ветку KVM, что делает её кандидатом на включение в релиз Linux 7.3 (окно слияния ожидается во второй половине августа). Главная цель рефакторинга — устранение архитектурного антипаттерна, который разработчики называют «структурой Бога» (god data structure). Изначально структура kvm_mmu пыталась одновременно описывать формат гостевых таблиц страниц, ходить по ним и строить теневые таблицы, что приводило к путанице и дублированию кода.
Три новых модуля вместо одного
Команда KVM разделяет монолитную структуру на три специализированных компонента. Это не только упрощает поддержку кода, но и открывает путь для новых функций, таких как поддержка SPTE с разными флагами исполнения (XS!=XU) через атрибуты памяти.
| Новый модуль | Функциональность | Ключевые изменения |
|---|---|---|
kvm_pagewalk |
Ходьба по таблицам страниц | Заменяет walk_mmu на gva_walk для всех случаев (L1/L2), устраняя зависимость от root_mmu или nested_mmu. |
kvm_mmu |
Построение таблиц | Использует kvm_pagewalk для создания теневых страниц. Для root_mmu использует gva_walk, для guest_mmu — ngpa_walk. |
kvm_page_format |
Работа с PTE | Объединяет permission_mask() и struct rsvd_bits_validate. Позволяет проверять права доступа к существующим PTE. |
Исправление исторических ошибок именования
Рефакторинг также решает проблему устаревшего именования. Поле nested_mmu исторически использовалось некорректно, так как возникло раньше, чем появилось guest_mmu. В коде встречались комментарии вроде «Exempt nested MMUs», где на самом деле речь шла об guest_mmu. Разделение кода позволяет изолировать эти сущности и в будущем переименовать guest_mmu для большей ясности.
Новые возможности через Memory Attributes
Последний патч серии демонстрирует практическую пользу рефакторинга. Благодаря адаптации механизма permission_fault() и его применению к SPTE через struct kvm_page_fault, KVM теперь может поддерживать SPTE, где флаги исполнения и записи (XS и XU) различаются. Эта функциональность ранее не поддерживалась, но теперь может быть реализована через механизм атрибутов памяти.
Источник: Phoronix ↗
