blob: 503845d18a0e51f9a6d27a7fc9bcc796009b3d5c [file] [log] [blame] [edit]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "featured/feature_library.h"
#include "swap_management/dbus_adaptor.h"
#include "swap_management/metrics.h"
#include <memory>
#include <utility>
#include <absl/status/status.h>
#include <base/logging.h>
#include <base/memory/ref_counted.h>
#include <chromeos/dbus/service_constants.h>
#include <chromeos/dbus/swap_management/dbus-constants.h>
#include <dbus/object_path.h>
namespace {
feature::PlatformFeatures* GetPlatformFeatures() {
dbus::Bus::Options options;
options.bus_type = dbus::Bus::SYSTEM;
scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
if (!feature::PlatformFeatures::Initialize(bus)) {
LOG(WARNING) << "Unable to initialize PlatformFeatures framework, will not "
"be able to check for system flags.";
return nullptr;
}
return feature::PlatformFeatures::Get();
}
} // namespace
namespace swap_management {
DBusAdaptor::DBusAdaptor(scoped_refptr<dbus::Bus> bus)
: org::chromium::SwapManagementAdaptor(this),
dbus_object_(nullptr, bus, dbus::ObjectPath(kSwapManagementServicePath)),
swap_tool_(std::make_unique<SwapTool>(GetPlatformFeatures())) {}
void DBusAdaptor::RegisterAsync(
brillo::dbus_utils::AsyncEventSequencer::CompletionAction cb) {
auto* my_interface = dbus_object_.AddOrGetInterface(kSwapManagementInterface);
DCHECK(my_interface);
RegisterWithDBusObject(&dbus_object_);
dbus_object_.RegisterAsync(std::move(cb));
}
bool DBusAdaptor::SwapStart(brillo::ErrorPtr* error) {
absl::Status status = swap_tool_->SwapStart();
swap_management::Metrics::Get()->ReportSwapStartStatus(status);
if (!status.ok()) {
brillo::Error::AddTo(error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.SwapStart",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::SwapStop(brillo::ErrorPtr* error) {
absl::Status status = swap_tool_->SwapStop();
swap_management::Metrics::Get()->ReportSwapStopStatus(status);
if (!status.ok()) {
brillo::Error::AddTo(error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.SwapStop",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::SwapRestart(brillo::ErrorPtr* error) {
return SwapStop(error) && SwapStart(error);
}
bool DBusAdaptor::SwapSetSize(brillo::ErrorPtr* error, int32_t size) {
absl::Status status = swap_tool_->SwapSetSize(size);
if (!status.ok()) {
brillo::Error::AddTo(error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.SwapSetSize",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::SwapSetSwappiness(brillo::ErrorPtr* error,
uint32_t swappiness) {
absl::Status status = swap_tool_->SwapSetSwappiness(swappiness);
if (!status.ok()) {
brillo::Error::AddTo(error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.SwapSetSwappiness",
status.ToString());
return false;
}
return true;
}
std::string DBusAdaptor::SwapStatus() {
return swap_tool_->SwapStatus();
}
bool DBusAdaptor::SwapZramEnableWriteback(brillo::ErrorPtr* error,
uint32_t size_mb) {
absl::Status status = swap_tool_->SwapZramEnableWriteback(size_mb);
if (!status.ok()) {
brillo::Error::AddTo(
error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.SwapZramEnableWriteback",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::SwapZramMarkIdle(brillo::ErrorPtr* error, uint32_t age) {
absl::Status status = swap_tool_->SwapZramMarkIdle(age);
if (!status.ok()) {
brillo::Error::AddTo(error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.SwapZramMarkIdle",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::SwapZramSetWritebackLimit(brillo::ErrorPtr* error,
uint32_t limit) {
absl::Status status = swap_tool_->SwapZramSetWritebackLimit(limit);
if (!status.ok()) {
brillo::Error::AddTo(
error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.SwapZramSetWritebackLimit",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::InitiateSwapZramWriteback(brillo::ErrorPtr* error,
uint32_t mode) {
absl::Status status = swap_tool_->InitiateSwapZramWriteback(
static_cast<ZramWritebackMode>(mode));
if (!status.ok()) {
brillo::Error::AddTo(
error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.InitiateSwapZramWriteback",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::MGLRUSetEnable(brillo::ErrorPtr* error, uint8_t value) {
absl::Status status = swap_tool_->MGLRUSetEnable(value);
if (!status.ok()) {
brillo::Error::AddTo(error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.MGLRUSetEnable",
status.ToString());
return false;
}
return true;
}
bool DBusAdaptor::ReclaimAllProcesses(brillo::ErrorPtr* error,
uint8_t memory_types) {
absl::Status status = swap_tool_->ReclaimAllProcesses(memory_types);
if (!status.ok()) {
brillo::Error::AddTo(
error, FROM_HERE, brillo::errors::dbus::kDomain,
"org.chromium.SwapManagement.error.ReclaimAllProcesses",
status.ToString());
return false;
}
return true;
}
} // namespace swap_management