blob: ba1bb7ceae3e8e50c96d0a71a656fd26f85fb694 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/virtualization/bin/guest/balloon.h"
#include <fuchsia/virtualization/cpp/fidl.h>
#include <lib/syslog/cpp/macros.h>
#include <iostream>
#include <virtio/balloon.h>
void handle_balloon(uint32_t env_id, uint32_t cid, uint32_t num_pages,
sys::ComponentContext* context) {
// Connect to environment.
fuchsia::virtualization::ManagerSyncPtr manager;
context->svc()->Connect(manager.NewRequest());
fuchsia::virtualization::RealmSyncPtr env_ptr;
manager->Connect(env_id, env_ptr.NewRequest());
fuchsia::virtualization::BalloonControllerSyncPtr balloon_controller;
env_ptr->ConnectToBalloon(cid, balloon_controller.NewRequest());
balloon_controller->RequestNumPages(num_pages);
std::cout << "Resizing the memory balloon to " << num_pages << " pages\n";
}
static const char* tag_name(uint16_t tag) {
switch (tag) {
case VIRTIO_BALLOON_S_SWAP_IN:
return "swap-in: ";
case VIRTIO_BALLOON_S_SWAP_OUT:
return "swap-out: ";
case VIRTIO_BALLOON_S_MAJFLT:
return "major-faults: ";
case VIRTIO_BALLOON_S_MINFLT:
return "minor-faults: ";
case VIRTIO_BALLOON_S_MEMFREE:
return "free-memory: ";
case VIRTIO_BALLOON_S_MEMTOT:
return "total-memory: ";
case VIRTIO_BALLOON_S_AVAIL:
return "available-memory: ";
case VIRTIO_BALLOON_S_CACHES:
return "disk-caches: ";
case VIRTIO_BALLOON_S_HTLB_PGALLOC:
return "hugetlb-allocations: ";
case VIRTIO_BALLOON_S_HTLB_PGFAIL:
return "hugetlb-failures: ";
default:
return "unknown: ";
}
}
void handle_balloon_stats(uint32_t env_id, uint32_t cid, sys::ComponentContext* context) {
// Connect to environment.
fuchsia::virtualization::ManagerSyncPtr manager;
context->svc()->Connect(manager.NewRequest());
fuchsia::virtualization::RealmSyncPtr env_ptr;
manager->Connect(env_id, env_ptr.NewRequest());
fuchsia::virtualization::BalloonControllerSyncPtr balloon_controller;
env_ptr->ConnectToBalloon(cid, balloon_controller.NewRequest());
zx_status_t status;
fidl::VectorPtr<fuchsia::virtualization::MemStat> mem_stats;
balloon_controller->GetMemStats(&status, &mem_stats);
if (status != ZX_OK) {
FX_LOGS(ERROR) << "Failed to get memory statistics " << status;
return;
}
for (auto& mem_stat : *mem_stats) {
std::cout << tag_name(mem_stat.tag) << mem_stat.val << '\n';
}
}