Инструменты26 июля 2026 г., 19:16 МСК🤖 Auto

KVM Chainsaw: Рефакторинг ядра Linux 7.3 для борьбы со «структурой Бога»

Инженер Red Hat Паоло Бонзини подготовил серию патчей «KVM Chainsaw» для ядра Linux 7.3, разделяя перегруженную структуру kvm_mmu на три модуля для улучшения поддержки атрибутов памяти.

Баннер новости 4426

Проблема «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_mmungpa_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 ↗