1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

Move "device_connection" implementation to .cpp

Signed-off-by: Pascal Bauer <pascal.bauer@rwth-aachen.de>
This commit is contained in:
Pascal Bauer 2025-02-13 14:21:27 +01:00 committed by Niklas Eiling
parent f9e97750fb
commit 833886c373
3 changed files with 75 additions and 45 deletions

View file

@ -10,8 +10,9 @@
#include <memory>
#include <villas/kernel/devices/linux_driver.hpp>
#include <villas/kernel/vfio_device.hpp>
#include <villas/kernel/vfio_container.hpp>
#include <villas/kernel/devices/device.hpp>
namespace villas {
namespace kernel {
@ -23,55 +24,14 @@ public:
const std::shared_ptr<kernel::vfio::Device> vfio_device;
private:
DeviceConnection(std::shared_ptr<kernel::vfio::Device> vfio_device)
: logger(villas::Log::get("DeviceConnection")),
vfio_device(vfio_device) {};
DeviceConnection(std::shared_ptr<kernel::vfio::Device> vfio_device);
public:
static DeviceConnection
from(const villas::kernel::devices::Device &device,
std::shared_ptr<kernel::vfio::Container> vfio_container) {
auto logger = villas::Log::get("Builder: DeviceConnection");
std::shared_ptr<kernel::vfio::Container> vfio_container);
// Bind to driver
LinuxDriver driver(
std::filesystem::path("/sys/bus/platform/drivers/vfio-platform"));
driver.attach(device);
// Attach group to container
const int iommu_group = device.iommu_group().value();
auto vfio_group = vfio_container->getOrAttachGroup(iommu_group);
logger->debug("Device: {}, Iommu: {}", device.name(), iommu_group);
// Open Vfio Device
auto vfio_device = std::make_shared<kernel::vfio::Device>(
device.name(), vfio_group->getFileDescriptor());
// Attach device to group
vfio_group->attachDevice(vfio_device);
return DeviceConnection(vfio_device);
}
void add_to_memorygraph() const {
// Map vfio device memory to process
const void *mapping = this->vfio_device->regionMap(0);
if (mapping == MAP_FAILED) {
logger->error("Failed to mmap() device");
}
logger->debug("memory mapped: {}", this->vfio_device->getName());
// Create memorygraph edge from process to vfio device
auto &mm = MemoryManager::get();
size_t srcVertexId = mm.getProcessAddressSpace();
const size_t mem_size = this->vfio_device->regionGetSize(0);
size_t targetVertexId =
mm.getOrCreateAddressSpace(this->vfio_device->getName());
mm.createMapping(reinterpret_cast<uintptr_t>(mapping), 0, mem_size,
"process to vfio", srcVertexId, targetVertexId);
logger->debug("create edge from process to {}",
this->vfio_device->getName());
}
void add_to_memorygraph() const;
};
} // namespace devices

View file

@ -35,6 +35,7 @@ add_library(villas-common SHARED
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
target_sources(villas-common PRIVATE
kernel/devices/device_connection.cpp
kernel/devices/ip_device.cpp
kernel/devices/linux_driver.cpp
kernel/devices/pci_device.cpp

View file

@ -0,0 +1,69 @@
/* Vfio connection to a device.
*
* Author: Pascal Bauer <pascal.bauer@rwth-aachen.de>
*
* SPDX-FileCopyrightText: 2024-25 Pascal Bauer <pascal.bauer@rwth-aachen.de>
* SPDX-License-Identifier: Apache-2.0
*/
#include <villas/kernel/devices/device_connection.hpp>
#include <memory>
#include <villas/kernel/devices/linux_driver.hpp>
#include <villas/memory_manager.hpp>
namespace villas {
namespace kernel {
namespace devices {
DeviceConnection::DeviceConnection(
std::shared_ptr<kernel::vfio::Device> vfio_device)
: logger(villas::Log::get("DeviceConnection")), vfio_device(vfio_device) {};
DeviceConnection DeviceConnection::from(const villas::kernel::devices::Device &device,
std::shared_ptr<kernel::vfio::Container> vfio_container) {
auto logger = villas::Log::get("Builder: DeviceConnection");
// Bind to driver
LinuxDriver driver(
std::filesystem::path("/sys/bus/platform/drivers/vfio-platform"));
driver.attach(device);
// Attach group to container
const int iommu_group = device.iommu_group().value();
auto vfio_group = vfio_container->getOrAttachGroup(iommu_group);
logger->debug("Device: {}, Iommu: {}", device.name(), iommu_group);
// Open Vfio Device
auto vfio_device = std::make_shared<kernel::vfio::Device>(
device.name(), vfio_group->getFileDescriptor());
// Attach device to group
vfio_group->attachDevice(vfio_device);
return DeviceConnection(vfio_device);
}
void DeviceConnection::add_to_memorygraph() const {
// Map vfio device memory to process
const void *mapping = this->vfio_device->regionMap(0);
if (mapping == MAP_FAILED) {
logger->error("Failed to mmap() device");
}
logger->debug("memory mapped: {}", this->vfio_device->getName());
// Create memorygraph edge from process to vfio device
auto &mm = MemoryManager::get();
size_t srcVertexId = mm.getProcessAddressSpace();
const size_t mem_size = this->vfio_device->regionGetSize(0);
size_t targetVertexId =
mm.getOrCreateAddressSpace(this->vfio_device->getName());
mm.createMapping(reinterpret_cast<uintptr_t>(mapping), 0, mem_size,
"process to vfio", srcVertexId, targetVertexId);
logger->debug("create edge from process to {}", this->vfio_device->getName());
}
} // namespace devices
} // namespace kernel
} // namespace villas