Анализ по принципу планирования контроллера скорости процессора
Анализ по принципу планирования контроллера скорости процессора
1. Введение в управление питанием процессора
Если наша энергия не ограничена, нам, возможно, не понадобится сейчас такое сложное управление питанием, особенно на встроенных устройствах, таких как мобильные телефоны, и, стремясь к максимальной производительности, мы должны также стремиться к увеличению срока службы батареи. Это одно и то же. Это одно и то же. Программное и аппаратное обеспечение должны тесно сотрудничать, чтобы удовлетворить все возрастающие потребности пользователей в производительности и энергопотреблении.
ЦП является ядром управления устройством, а его управление питанием является очень важной частью всего управления питанием SOC. Общие конструкции управления питанием ЦП в основном вращаются вокруг проектирования и оптимизации статического и динамического энергопотребления:
1) Статическое энергопотребление. Самым основным элементом интегральной схемы ASIC является транзистор. Наш SOC по-прежнему генерирует ток утечки в режиме ожидания, вызывая статическое потребление энергии. Это связано с постоянным улучшением процесса (техники) SOC. Например, по сравнению с 7-нм FinFET 5-нм EUV-процесс TSMC обеспечивает повышение энергоэффективности на 15 % и снижение энергопотребления на 30 %. Таким образом, с этой точки зрения, если ЦП хочет снизить статическое энергопотребление, ему необходимо, чтобы инженеры ASIC уменьшили площадь, и в то же время ему требуются фабрики для постоянного улучшения процесса.
2) Динамическое энергопотребление. Эта область относительно сложна. Программное и аппаратное обеспечение взаимодействуют с cpufreq, cpuidle, базовой реализацией механизма блокировки и т. д. Аспект ASIC включает в себя тактовую синхронизацию, различные домены питания и т. д. Мы кратко представим это. .
cpufreq: в зависимости от загрузки ЦП выберите самую низкую пару напряжение/частота, соответствующую требованиям производительности (также называемую OPP, точки операционной производительности). Для ARM наименьшим блоком регулировки этой пары напряжение/частота является кластер, а это означает, что пары частота/напряжение всех рабочих ядер ЦП в кластере одинаковы. После того, как ARM поддерживает DynamIQ, кластеров больше нет, и в каждом кластере больше не требуется размещать ядра ЦП одной и той же микроархитектуры. Вместо этого появилась такая структура, как 1 маленькое ядро + 3 средних ядра + 4 малых ядра. автор Мобильный телефон Google Pixel 4, который у меня в руках, имеет такую архитектуру. В этом мобильном телефоне производитель установил напряжение большого ядра и среднего ядра для питания от одного источника питания, но частоты разные. более высокие требования к стратегии частотной модуляции программного обеспечения. Больше никаких расширений. Эта регулировка пар напряжение/частота также применима ко многим другим устройствам, под общим названием DVFS (динамическое масштабирование напряжения/частоты, динамическая регулировка напряжения/частоты).
cpuidle: Linux описывается C-States, который изначально был концепцией, предложенной Intel и имеющей 4 состояния (от C0 до C3). В архитектуре ARM C0 соответствует состоянию работы, C1 соответствует состоянию ожидания, а C3 соответствует состоянию сна. Без C2 ЦП переходит в различные состояния пониженного энергопотребления в соответствии с установленной стратегией. и выходы из разных маломощных государств не одинаковы. Состояние C1 соответствует управлению нашим процессором. Базовая реализация обычно выполняет инструкцию WFI (ожидание прерывания). При возникновении прерывания она переходит из состояния C1 в состояние C0, если нет прерывания и определенных условий. будут выполнены, он далее перейдет в состояние С3. Внутри ЦП будет находиться конечный автомат для управления миграцией и преобразованием этих состояний. Под разными состояниями можно понимать просто разные компоненты ЦП, участвующие в работе. Чем меньше состояний, тем больше компонентов задействовано в работе. Подробную информацию см. в ARM ARM (Справочном руководстве по архитектуре ARM) и TRM (Техническом справочном руководстве) микроархитектуры каждого ЦП.
Механизм блокировки Spinlock: базовая реализация выполнит инструкцию WFE (ожидание события) для перехода в состояние низкого энергопотребления. При получении инструкции SEV он выйдет из состояния низкого энергопотребления. Избегайте ожидания во время блокировки и сэкономьте некоторое энергопотребление.
Синхронизация часов: это функция автоматического стробирования, разработанная ASIC. Как правило, периферийные устройства имеют регистры для контроля того, включены ли они, и ЦП в основном отключает некоторые тактовые сигналы во время WFI. Это выполняется логикой конечного автомата внутри ЦП и рассматривается. стробирование часов, этот процесс обычно не требует участия программного обеспечения.
Домен мощности. Разделение разных доменов облегчает точный контроль и требует участия программного обеспечения. Например, мобильный телефон Pixel 4 имеет три кластера, разделенных на два домена питания (большое ядро и среднее ядро — это один домен, а маленькое ядро — другой домен). Например, когда система испытывает небольшую нагрузку, вы можете даже отключить большие и средние кластеры ядра. Для получения более подробной информации обратитесь к TRM. Например, диаграмма разделения мощности A57 TRM показана на рисунке ниже, который не будет здесь подробно описан.
2. Введение в общую структуру cpufreq
После ознакомления с распространенными методами управления питанием ЦП мы кратко рассмотрим общую архитектуру cpufreq, функции каждого модуля и реализованные идеи программного обеспечения.
2.1 Знакомство с основными модулями cpufreq
Ядро: представляет собой абстракцию общих процессов и методов;
Губернатор: отвечает за стратегию частотной модуляции и решение проблемы модуляции частоты;
Драйвер: отвечает за конкретную реализацию механизмов частотной модуляции, связанных с платформой (требуется прямая работа с аппаратным обеспечением);
Статистика: отвечает за такую статистику, как информация о частотной модуляции и время работы каждой точки частоты. Используя time_in_state в сочетании с вычислительной мощностью и максимальной частотой, можно получить нормализованную статистику загрузки ЦП.
Notifer: цепочка уведомлений, отвечающая за уведомление других водителей, которым интересны действия по частотной модуляции.
Sysfs: предоставляет интерфейсы приложениям пользовательского режима, чтобы ими можно было гибко управлять и реализовывать различные стратегии управления.
2.2 Знакомство с идеями программного обеспечения cpufreq
Некоторые идеи проектирования программного обеспечения, воплощенные в cpufreq, также распространены в других модулях ядра Linux и заслуживают изучения и использования:
Многоуровневое мышление. Нижний уровень (драйвер) отвечает за реализацию реализаций, связанных с платформой. Чем выше уровень, тем он более абстрактен (ядро, регулятор) и максимально сплочен (каждый модуль максимально самостоятельно выполняет свои функции, не полагаясь на код). вне модуля).
Идея разделения стратегии и механизма. Ядро имеет две формы:
Ядро обеспечивает механизм, а пользовательское пространство реализует стратегию. Например, Пользователь, которого мы представим позже. Пространство, регулятор, определяется программой пользователя и напрямую управляет стратегией переключения частоты.
Ядро предоставляет механизм, определенные стратегии реализуются регулятором, а пользовательское пространство изменяет параметры регулятора. Например, если планировщик решит использовать WALT для отслеживания задач и загрузки ЦП, некоторые параметры будут настроены пользователем. космос.
Модель наблюдателя. Цепочка уведомлений также широко используется в ядре. Другие модули будут вызывать эти обратные вызовы при возникновении соответствующих изменений, регистрируя функции обратного вызова в цепочке уведомлений. Эти модули могут фиксировать эти изменения во времени в качестве наблюдателей. Достичь разделения.
2.3 Методы регулировки частоты и факторы, влияющие на частоту процессора
Из документации ядра мы можем знать:
Если драйвер реализует метод setpolicy, это означает, что оборудование ЦП поддерживает автоматическую регулировку частоты и не требует вмешательства программного регулятора. Пользователю необходимо только установить максимальную/минимальную частоту (называемую политикой). Каждый кластер на мобильном телефоне соответствует политике.
Другой требует, чтобы регулятор реализовал стратегию управления. Ему необходимо вычислить целевую частоту с помощью определенного метода и сообщить об этом драйверу (вызвать один из методов target/targetindex/fastswitch, реализованных драйвером). Наконец, драйвер управляет процессором. регулировка частоты.
Независимо от того, какой метод будет выбран, обычно рабочая частота ЦП будет положительно связана с нагрузкой, которую несет ЦП. Но есть и другие факторы, влияющие на частоту процессора, в основном температурные и пользовательские режимы. Основная функция термической защиты — это защита от перегрева. Помимо таких факторов, как горячие руки, чрезмерная температура процессора также может вызывать такие проблемы. как транзисторы из-за кумулятивного эффекта. Поломка приводит к неправильной работе SOC и может даже вызвать некоторые другие серьезные последствия (аналогично взрыву батареи мобильных телефонов Samsung несколько лет назад).
Thermal обычно реализует управление частотой через интерфейс состояния ядра cpufreq_update_policy. Приложения пользовательского режима будут управляться через sysfs. В конечном итоге все это влияет на {max, min} политики.
2.4 Общие губернаторы
Производительность: регулятор, ориентированный на производительность,напрямуюcpuЧастота установлена наpolicy->{min,Максимальное значение в max}.
Powersave: регулятор с приоритетом энергопотребления,напрямуюcpuЧастота установлена наpolicy->{min,Минимальное значение в max}.
Пользовательское пространство: частота изменяется программой пользовательского пространства через узел файла scaling_setspeed.
По требованию: динамическая настройка частоты ЦП в зависимости от текущего использования ЦП. Планировщик запускает оценку загрузки системы (асинхронно), вызывая зарегистрированную функцию перехвата по требованию. Он измеряет условия загрузки системы через определенные промежутки времени. Динамически настраивайте частоту ЦП по мере необходимости. Если текущая загрузка ЦП превышает установленный порог, он немедленно достигнет максимальной частоты и вернется к минимальной частоте после завершения выполнения. Преимущество в том, что регулировка частоты происходит быстро, но проблема в том, что регулировка недостаточно точна.
Консервативный: аналогичен Ondemand, но регулировка частоты будет сглаженной, и не будет резкой регулировки сначала до максимального, а затем до минимального значения. Разница в том, что когда загрузка ЦП системы превышает определенный порог, целевая частота консерватора будет увеличиваться на определенном этапе, когда загрузка ЦП системы ниже определенного порога, целевая частота будет уменьшаться на определенном этапе; При этом также необходимо периодически рассчитывать нагрузку на систему.
Интерактивность: механизм, предложенный Android, не был принят сообществом ядра Linux и долгое время существовал в Linux-ветке AOSP. Его стратегия частотной модуляции для задач, интенсивно использующих процессор, будет более агрессивной. Потому что он регистрирует уведомитель о простое на каждом процессоре. Когда ЦП выходит из режима ожидания, он проверяет, а затем решает, нужно ли регулировать частоту. Когда он не находится в режиме ожидания, вам все равно придется полагаться на таймер, который будет регулярно выполнять выборку, чтобы узнать информацию о загрузке системы.
schedutil: тема этой статьи будет обсуждаться в последующих главах.
3. Общая структура schedutil
Этот регулятор был предложен Рафаэлем Высоцким в 2016 году и в конечном итоге был включен в ядро Linux 4.7. В нем воплощены основные идеи и улучшения по сравнению с другими губернаторами:
Стратегия регулирования частоты процессора, основанная на планировщике, напрямую использует данные о загрузке из планировщика. Причина, по которой она может это сделать, заключается в том, что перед этим ядро имеет механизм обратного вызова изменения нагрузки (механизм регистрации обратных вызовов обновления использования), и schedutil использует его. Собственная Стратегия частотной модуляции зарегистрирована в перехватчике, и перехватчик будет вызван обратно при изменении нагрузки. В это время можно принимать решения по частотной модуляции и даже выполнять действия по частотной модуляции. Представленные ранее методы ondemand, консервации и интерактивности требуют регулярной выборки для расчета загрузки ЦП, которая имеет определенную задержку и ограниченную точность. Фактически, планировщик уже может использовать PELT (отслеживание нагрузки на объект) или WALT (отслеживание загрузки окна) для более точного отслеживания загрузки задач и загрузки ЦП. Теперь он может напрямую использовать загрузку ЦП, исключая выборку, чтобы можно было использовать частотную модуляцию. Быстрее.
Поддерживает механизм переключения частоты непосредственно из контекста прерывания, что может еще больше сократить задержку частотной модуляции. Эта функция требует, чтобы драйвер поддерживал функцию fast_switch. Эти драйверы могут даже переключать частоты, просто записывая регистр.
В одном предложении это можно резюмировать следующим образом: Благодаря ему планировщик и частотная модуляция могут быть установлены более точно, при этом производительность и энергопотребление улучшаются (кривые подъема и спада частотной модуляции становятся круче, а частота повышается). или быстрее падает до целевой частоты).
Будь то PELT или WALT, schedutil может работать вместе с ним. Ядро Pixel4 использует PELT. Многие другие производители мобильных телефонов обычно следуют стратегии производителей SOC и принимают WALT. Окончательного вывода о том, какой эффект частотной модуляции можно достичь, не существует. Это зависит от соответствующих методов настройки, что выходит за рамки данного обсуждения.
3.1 Блок-схема программного обеспечения schedutil
Фактически, сначала у сообщества ядра было два решения для частотной модуляции на основе планировщика:
Одним из них является cpufreq_sched, возглавляемый Линаро, который является частью EAS. Конечно, schedfreq, который когда-то использовал EAS, также является регулятором на основе планировщика.
Еще одна утилита планирования под руководством Intel. Поскольку губернатор был объединен с основной веткой Linux, EAS позже также использовал schedutil.
Планировщик, с одной стороны, использует WALT или PELT для отслеживания загрузки TASK и генерирует загрузку ЦП в качестве входных данных для расчета целевой частоты. С другой стороны, когда нагрузка меняется, он вызывает cpufreq_update_util и вызывает перехватчик для запуска. планировать работу, тем самым принимая решения по частоте и последующей корректировке частоты.
SchedTune влияет на загрузку процессора через группы процессов cgroup, что, в свою очередь, влияет на выбор частоты модуляции частоты процессора. Это технология повышения производительности. Он также может сообщать группе процессов пользовательского пространства планировщика, предпочитает ли она энергопотребление или производительность во время планирования, с помощью бита флагаeferred_idle (значение 1 указывает на большее предпочтение производительности. В основной строке ядра Linux 5.4 эта функция будет заменена на UClamp (). Использование зажима), заинтересованные студенты могут изучить его самостоятельно.
Tunables обеспечивает гибкую настройку интерфейса sysfs в пользовательском пространстве и может быть настроен в соответствии с разделенными сценариями:
up_rate_limit_us/down_rate_limit, скорость увеличения/уменьшения частоты (пороговое значение), временной интервал частотной модуляции должен находиться в пределах диапазона, контролируемого этими двумя пороговыми значениями, прежде чем действие переключения частоты может быть действительно выполнено. Путем динамической настройки этих двух пороговых значений можно удовлетворить различные потребности в настройке.
pl/hispeed_load/hispeed_freq, эти параметры относятся к категории настройки WALT и пока расширяться не будут.
После того, как окончательное решение schedutil должно быть выполнено, есть 2 пути:
Медленный путь: вам нужно перейти к irqwork для постановки в очередь, затем активировать kthread и, наконец, вызвать интерфейс __cpufreq_driver_target, чтобы настроить целевую частоту, поддерживаемую аппаратной платформой.
Быстрый путь: устранение действий в очереди и пробуждения и, наконец, вызов интерфейса cpufreq_driver_fast_switch, например драйвер на пикселе4 реализуется путем записи регистра.
Наконец, из блок-схемы программного обеспечения мы видим, что это CFS, RT, DL. Задачи по существу проходят через процессор использование, чтобы повлиять на расчет и выбор частоты. в DL task,Считается неизвестным во время загрузки (использование пока невозможно отследить),воляCPUчастота установлена наpolicy->max,верноCFS/RT Задача будет основана на использовании (член avg.util_avg очереди выполнения, то есть структура util_avg — член sched_avg) для расчета частоты. Фактически, в начале RT/DL Стратегия планирования задачи та же самая, она просто и примерно устанавливается на самую высокую частоту, а затем передается через sched/rt: add utilization расписание отслеживания: cpufreq: use PELT rt_rq as estimate of required RT CPU мощности, эти два патча очень важны для RT задача была улучшена.
На этом простой анализ schedutil и связанных с ним модулей заканчивается. Далее мы продолжаем анализировать детали его реализации.
4. Основная логика schedutil
Анализ кода в этой статье будет сосредоточен на анализе основной логики, а некоторые детали не будут расширены, чтобы не царапать бороды и брови. В основном мы фокусируемся на том, как инициализируется и запускается регулятор, когда запускается работа schedutil и как логика принятия решений schedutil в конечном итоге переключает частоту.
4.1 Инициализация и запуск schedutil
Инициализация и запуск регулятора выполняется в функции cpufreq_set_policy. Обычно происходит при переключении регулятора. Остановка и деинициализация губернатора является обратным процессом и не будет расширена.
4.2 функция sugov_init
Обычно функции инициализации требуют подготовки некоторых ресурсов, и наш schedutil не является исключением.
Эта функция будет выполняться каждой политикой и может выполняться одновременно, что приведет к состоянию гонки, и в конечном итоге будет вызвана в функции cpufreq_init_governor. Упрощенный код выглядит следующим образом:
Выделить память и инициализировать указатель типа struct sugov_policy
Если быстрое переключение не поддерживается, вызовите sugov_kthread_create, чтобы взять медленный_путь и создать связанные процессы и работу, связанную с рабочей очередью, включая sugov_work и sugov_irqwork.
Инициализация настроек, включая создание интерфейса sysfs для настройки пользовательского пространства.
4.3 функция sugov_start
Основная функция этой функции — зарегистрировать окончательное решение о частотной модуляции и функцию ядра, которая выполняет действие частотной модуляции, в перехватчике планировщика. Эта функция будет вызываться сначала в функции cpufreq_start_governor платформы, а затем будет вызываться функция sugov_limits для проверки ограничения частоты. Упрощенный код выглядит следующим образом:
Все общие политики должны пройти через инициализацию переменной struct sugov_cpu sg_cpu.
Вызовите интерфейс cpufreq_add_update_util_hook, зарегистрируйте функцию обратного вызова в планировщике и вызывайте ее в cpufreq_update_util. Если несколько процессоров совместно используют политику, функция sugov_update_shared регистрируется в планировщике, в противном случае функция sugov_update_single регистрируется в планировщике;
4.4 функция sugov_limits
Эта функция завершает проверку ограничения частоты. Упрощенный код выглядит следующим образом:
Разница между поддержкой быстрого переключения частоты (поддержка вызова в контексте прерывания) заключается в разнице между функцией, которая вызывает информацию о времени, и интерфейсом частотной модуляции, который, наконец, вызывается после ограничения частоты:
Быстрое переключение: при необходимости вызовите sched_ktime_lock для получения информации о временной метке, затем вызовите cpufreq_driver_fast_switch для переключения частоты;
Медленное переключение: при необходимости вызовите ktime_get_ns для получения информации о временной метке, затем вызовите _cpufreq_driver_target для переключения частоты;
Вызовите функцию sugov_track_cycles, чтобы обновить элементы curr_cycles (накопленное значение) и last_cyc_update_time (последняя временная метка) sgpolicy.
Согласно действующемуpolicy->{max, min}пределы и текущая информация о частоте,Посмотрите, нужно ли вам отрегулировать текущую частоту, чтобыpolicy->{max, min} один из них.
4.4 Время запуска частотной модуляции по расписанию
Частотная модуляция может быть запущена при изменении нагрузки CFS или обновлении состояния задачи RT/DL. Эти классы планировщика вызовут функцию cpufreq_update_util (то есть вызов зарегистрированной функции перехвата) для запуска работы schedutil. Каждый процессор в конечном итоге вызовет одну из функций sugov_update_shared или sugov_update_single.
Поскольку он вызывается непосредственно из планировщика, когда выполняется окончательное переключение частоты, независимо от того, запускает ли медленный путь операцию kthread или быстрый путь просто записывает регистр, это не требует слишком больших затрат на планирование. Это также очень важный фактор. для того, чтобы расписание было принято сообществом.
Конкретное время срабатывания следующее:
Когда задача пробуждается (что соответствует вызову функции try_to_wake_up), если используется WALT и выполняется PL (Predict Load);
Когда поступает системный тик (соответствующий вызываемой функции Scheduler_tick), если используется WALT и соблюдено ED (раннее обнаружение);
Если используется WALT и окно WALT сдвигается (что соответствует вызываемой функции walt_irq_work);
Когда статус задачи DL обновляется (соответствует вызываемой функции update_curr_dl);
Когда задача RT обновляется (соответствует вызываемой функции cpufreq_update_util);
Когда CFS обновляет загрузку RQ (вызывается соответствующая функция cfs_rq_util_change)
Когда задача CFS (TODO) с установленным in_iowait входит в очередь выполнения, а у группы процессов типа Schedtune установлен флаг предпочитает_idle.
4.5 schedutil: Принятие решений по частотной модуляции и переключение частоты.
После запуска частотной модуляции schedutil оставшаяся работа выполняется двумя основными функциями sugov_update_shared или sugov_update_single.
4.5.1 функция sugov_update_single
Вызовите sugov_set_iowait_boost, чтобы установить переменные, связанные с iowait_boost.
Вызовите sugov_should_update_freq, чтобы определить, действительно ли необходимо переключение частоты. Если обновление не требуется, оно будет возвращено напрямую. Если переключение требуется, основные причины следующие:
limitsизмененный(верноотвечатьpolicy->{max, min}, такие как ограничение частоты термического запуска или другие механизмы, такие как perf_lock от Qualcomm для увеличения частоты).
Интервал времени между обновлениями частоты превышает порог min_rate_limit_ns.
Если это задача DL, напрямую установите целевую частоту на максимальное значение, поддерживаемое оборудованием.
Если это задача других типов планирования, перейдите к шагам 5–11.
Вызов sugov_get_util для получения статистики загрузки ЦП также будет учитывать метод обработки WALT/PELT и boost_value, установленный группой процессов типа Schedtune.
Нормализовать файл Hispeed_util. Выполните нормализацию для процессора с самой высокой вычислительной мощностью, принимая во внимание настройку параметров hispeed_freq (по умолчанию hispeed_freq равно 0).
Рассчитайте среднюю вычислительную мощность. Если функция WALT не используется, никакая обработка выполняться не будет.
Если планировщик устанавливает флаг SCHED_CPUFREQ_IOWAIT, он в основном увеличивает нагрузку на основе переменной iowait_boost на первом этапе, тем самым увеличивая частоту, что приводит к ускорению выполнения.
Если это функция WALT, то настройки переменных hispeed_load, pl и средняя вычислительная мощность sg_policy могут еще больше увеличить нагрузку, тем самым увеличивая частоту и ускоряя выполнение задач.
Вызовите функцию get_next_freq, чтобы преобразовать данные нагрузки в целевую частоту, поддерживаемую платформой. Позже мы расширим конкретный процесс расчета отдельно.
Вызовите функцию sugov_update_commit для переключения частоты, которую мы рассмотрим отдельно позже.
4.5.2 функция sugov_update_shared
В ситуациях, когда в кластере имеется несколько ЦП, поскольку несколько ЦП повторно используют эту функцию, необходимо учитывать проблемы параллелизма, и функция sugov_update_single имеет следующий вид:
Поместите вызов функции sugov_get_util за пределы блокировки;
Поместите в блокировку вызовы двух функций sugov_set_iowait_boost и sugov_should_update_freq;
4.5.3 Расчет целевой частоты — функция get_next_freq
Эта функция вызывается в функции sugov_update_single и подходит для ситуаций, когда в кластере имеется только один ЦП или когда один ЦП имеет монопольную политику. Упрощенный код выглядит так:
Для архитектуры ARM формула расчета целевой частоты выглядит следующим образом:
частотаследующая = 1,25 * максимальная частота * максимальная загрузка/емкость
util/capacitymax, то есть отношение текущей загрузки ЦП к максимальной вычислительной мощности ЦП равно 0,8 в качестве критической точки. При коэффициенте меньше 0,8 частота будет снижена, если она превысит 0,8; частота будет увеличена.
Почему за критическую точку мы принимаем коэффициент 1,25 или 0,8? На самом деле 0,8 здесь означает «когда нагрузка достигнет 80% от максимальной вычислительной мощности, вы выберете увеличение частоты». определенное количество продвижения (предполагая, что нагрузка все равно будет продолжать расти), если это значение установлено слишком маленьким, оно будет выглядеть «слишком агрессивным», а если оно установлено слишком большим, оно будет выглядеть «слишком консервативным». Конечно, установка этого значения не определяется исключительно опытом, но после того, как было предложено исправление функции, оно было принято путем обсуждений, фактических измерений и аналогичных настроек schedfreq после того, как были предложены члены списка рассылки pm ядра Linux. Для более подробной информации. , пожалуйста, обратитесь к патчу для обсуждения.
Если вычисленная целевая частота равна кэшированной частоте,Используйте напрямуюsg_policy->next_freqценить,Затраты времени на поиск сопоставления драйверов сохраняются.
4.4 Расчет целевой частоты — функция sugov_next_freq_shared
Эта функция вызывается в функции sugov_update_shared и подходит для ситуаций, когда в кластере имеется несколько процессоров или когда несколько процессоров совместно используют политику. Упрощенный код выглядит следующим образом:
Просмотрите все ЦП, которые разделяют эту политику (ЦП в кластере), и выберите ЦП с наибольшей загрузкой ЦП в качестве целевой частоты всех ЦП в кластере. Конечно, iowait_boost и повышение, специфичное для WALT, также будут выполняться при загрузке ЦП (если WALT включен).
Если временной интервал между последним обновлением загрузки ЦП и обновлением частоты достаточно длинный, вполне вероятно, что ЦП находится в состоянии простоя, и ЦП пропускает его (и очищает статус, связанный с iowait_boost) и напрямую рассматривает следующий ЦП.
Выберите комбинацию с наибольшим соотношением использования и вычислительной мощности ЦП среди всех ЦП.
Функция этой части кода аналогична фрагменту кода функции sugov_update_single и не будет описываться повторно.
4.5 Выполнение функции переключения частоты-sugov_update_commit
Целевая частота равна текущей частоте и возвращается напрямую.
schedutil устанавливает два временных интервала для регулировки частоты вверх и вниз соответственно. Это настраивается пользователем через sysfs. Действие по переключению частоты должно выполняться, когда временной интервал превышает эти два временных интервала.
Если поддерживается функция быстрого переключения, напрямую вызовите интерфейс cpufreq_driver_fast_switch, чтобы позволить драйверу переключать частоты (например, просто прочитав регистр)
Если функция быстрого переключения не поддерживается,Вам нужно зайти в irq_work, чтобы встать в очередь. Выполните запрос частотной модуляции, последовательно вызвав две функции sugov_irq_work и sugov_work.,наконец-то позвонят__cpufreq_driver_targetинтерфейс для завершения действия переключения FM。
Есть также некоторые подробные коды, которые мы не подробно описали, но они не влияют на наш анализ базовой логики.