| // Copyright 2023 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "runtime_probe/functions/generic_cpu.h" |
| |
| #include <string> |
| #include <unordered_set> |
| #include <utility> |
| |
| #include <base/functional/bind.h> |
| #include <base/no_destructor.h> |
| #include <base/values.h> |
| #include <diagnostics/mojom/public/cros_healthd.mojom.h> |
| #include <diagnostics/mojom/public/cros_healthd_probe.mojom.h> |
| |
| #include "runtime_probe/system/context.h" |
| |
| namespace runtime_probe { |
| |
| namespace cros_healthd_mojom = ::ash::cros_healthd::mojom; |
| |
| namespace { |
| |
| constexpr char kUnknownModel[] = "unknown"; |
| |
| // Callback function to convert the telemetry info to |probe_result|. |
| void ProbeCpuTelemetryInfoCallback( |
| base::OnceCallback<void(GenericCpuFunction::DataType)> callback, |
| cros_healthd_mojom::TelemetryInfoPtr telemetry_info_ptr) { |
| const auto& cpu_result = telemetry_info_ptr->cpu_result; |
| if (cpu_result.is_null()) { |
| LOG(ERROR) << "No CPU result from cros_healthd."; |
| std::move(callback).Run(GenericCpuFunction::DataType{}); |
| } |
| |
| GenericCpuFunction::DataType probe_result; |
| if (cpu_result->is_error()) { |
| const auto& error = cpu_result->get_error(); |
| LOG(ERROR) << "Got an error when fetching CPU info: " << error->type |
| << "::" << error->msg; |
| } else { |
| const auto& cpu_info = cpu_result->get_cpu_info(); |
| std::unordered_set<std::string> probed_model; |
| for (const auto& physical_cpu_info : cpu_info->physical_cpus) { |
| const auto& model = physical_cpu_info->model_name.value_or(kUnknownModel); |
| // There'll be 2 physical CPUs with the same model name for small/big core |
| // CPUs. Skip physical CPU if the model name is already probed because |
| // there're acuatlly the same CPU. |
| if (probed_model.contains(model)) { |
| continue; |
| } |
| probed_model.insert(model); |
| probe_result.Append( |
| base::Value::Dict() |
| .Set("cores", std::to_string(cpu_info->num_total_threads)) |
| .Set("model", model)); |
| } |
| } |
| std::move(callback).Run(std::move(probe_result)); |
| } |
| |
| } // namespace |
| |
| void GenericCpuFunction::EvalAsyncImpl( |
| base::OnceCallback<void(GenericCpuFunction::DataType)> callback) const { |
| Context::Get()->GetCrosHealthdProbeServiceProxy()->ProbeTelemetryInfo( |
| {cros_healthd_mojom::ProbeCategoryEnum::kCpu}, |
| base::BindOnce(&ProbeCpuTelemetryInfoCallback, std::move(callback))); |
| } |
| |
| } // namespace runtime_probe |