39646561d1
from android-13.0.0_r3 Signed-off-by: Chenyang Zhong <zhongcy95@gmail.com>
112 lines
3.5 KiB
C++
112 lines
3.5 KiB
C++
/*
|
|
* Copyright (C) 2021 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <aidl/android/hardware/power/WorkDuration.h>
|
|
#include <perfmgr/HintManager.h>
|
|
|
|
#include <chrono>
|
|
#include <thread>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include "AdaptiveCpuConfig.h"
|
|
#include "AdaptiveCpuStats.h"
|
|
#include "Device.h"
|
|
#include "KernelCpuFeatureReader.h"
|
|
#include "Model.h"
|
|
#include "WorkDurationProcessor.h"
|
|
|
|
namespace aidl {
|
|
namespace google {
|
|
namespace hardware {
|
|
namespace power {
|
|
namespace impl {
|
|
namespace pixel {
|
|
|
|
using std::chrono_literals::operator""ms;
|
|
using ::aidl::android::hardware::power::WorkDuration;
|
|
using ::android::perfmgr::HintManager;
|
|
|
|
// Applies CPU frequency hints infered by an ML model based on the recent CPU statistics and work
|
|
// durations.
|
|
// This class's public members are not synchronised and should not be used from multiple threads,
|
|
// with the exception of ReportWorkDuration, which can be called from an arbitrary thread.
|
|
class AdaptiveCpu {
|
|
public:
|
|
AdaptiveCpu();
|
|
|
|
bool IsEnabled() const;
|
|
|
|
// Called when the Adaptive CPU hint is received. This method enables/disables the Adaptive CPU
|
|
// thread.
|
|
void HintReceived(bool enable);
|
|
|
|
// Reports work durations for processing. This method returns immediately as work durations are
|
|
// processed asynchonuously.
|
|
void ReportWorkDurations(const std::vector<WorkDuration> &workDurations,
|
|
std::chrono::nanoseconds targetDuration);
|
|
|
|
// Dump info to a file descriptor. Called when dumping service info.
|
|
void DumpToFd(int fd) const;
|
|
|
|
// When PowerExt receives a hint with this name, HintReceived() is called.
|
|
static constexpr char HINT_NAME[] = "ADAPTIVE_CPU";
|
|
|
|
private:
|
|
void StartThread();
|
|
|
|
void SuspendThread();
|
|
|
|
// The main loop of Adaptive CPU, which runs in a separate thread.
|
|
void RunMainLoop();
|
|
|
|
void WaitForEnabledAndWorkDurations();
|
|
|
|
Model mModel;
|
|
WorkDurationProcessor mWorkDurationProcessor;
|
|
KernelCpuFeatureReader mKernelCpuFeatureReader;
|
|
AdaptiveCpuStats mAdaptiveCpuStats;
|
|
const TimeSource mTimeSource;
|
|
|
|
// The thread in which work durations are processed.
|
|
std::thread mLoopThread;
|
|
|
|
// Guards against creating multiple threads in the case HintReceived(true) is called on separate
|
|
// threads simultaneously.
|
|
std::mutex mThreadCreationMutex;
|
|
// Used when waiting in WaitForEnabledAndWorkDurations().
|
|
std::mutex mWaitMutex;
|
|
|
|
// A condition variable that will be notified when new work durations arrive.
|
|
std::condition_variable mWorkDurationsAvailableCondition;
|
|
|
|
volatile bool mIsEnabled = false;
|
|
bool mIsInitialized = false;
|
|
volatile bool mShouldReloadConfig = false;
|
|
std::chrono::nanoseconds mLastEnabledHintTime;
|
|
std::chrono::nanoseconds mLastThrottleHintTime;
|
|
Device mDevice;
|
|
AdaptiveCpuConfig mConfig = AdaptiveCpuConfig::DEFAULT;
|
|
};
|
|
|
|
} // namespace pixel
|
|
} // namespace impl
|
|
} // namespace power
|
|
} // namespace hardware
|
|
} // namespace google
|
|
} // namespace aidl
|