mirror of
https://git.rwth-aachen.de/acs/public/villas/node/
synced 2025-03-30 00:00:11 +01:00
vfio: minor refactoring
This commit is contained in:
parent
94ba899b21
commit
b6ff452e53
2 changed files with 21 additions and 13 deletions
|
@ -18,7 +18,8 @@
|
|||
#include <linux/vfio.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#define VFIO_DEV(x) "/dev/vfio/" x
|
||||
#define VFIO_PATH "/dev/vfio/"
|
||||
#define VFIO_DEV VFIO_PATH "vfio"
|
||||
|
||||
/* Forward declarations */
|
||||
struct pci_device;
|
||||
|
@ -90,7 +91,7 @@ public:
|
|||
~VfioGroup();
|
||||
|
||||
static std::unique_ptr<VfioGroup>
|
||||
attach(int containerFd, int groupIndex);
|
||||
attach(const VfioContainer& container, int groupIndex);
|
||||
|
||||
private:
|
||||
/// VFIO group file descriptor
|
||||
|
@ -138,6 +139,9 @@ public:
|
|||
bool isIommuEnabled() const
|
||||
{ return this->hasIommu; }
|
||||
|
||||
const int& getFd() const
|
||||
{ return fd; }
|
||||
|
||||
private:
|
||||
VfioGroup& getOrAttachGroup(int index);
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ VfioContainer::VfioContainer()
|
|||
}
|
||||
|
||||
/* Open VFIO API */
|
||||
fd = open(VFIO_DEV("vfio"), O_RDWR);
|
||||
fd = open(VFIO_DEV, O_RDWR);
|
||||
if (fd < 0) {
|
||||
logger->error("Failed to open VFIO container");
|
||||
throw std::exception();
|
||||
|
@ -412,7 +412,7 @@ VfioContainer::getOrAttachGroup(int index)
|
|||
}
|
||||
|
||||
// group not yet part of this container, so acquire ownership
|
||||
auto group = VfioGroup::attach(fd, index);
|
||||
auto group = VfioGroup::attach(*this, index);
|
||||
if(not group) {
|
||||
logger->error("Failed to attach to IOMMU group: {}", index);
|
||||
throw std::exception();
|
||||
|
@ -538,6 +538,7 @@ VfioDevice::pciHotReset()
|
|||
|
||||
const size_t reset_infolen = sizeof(struct vfio_pci_hot_reset_info) +
|
||||
sizeof(struct vfio_pci_dependent_device) * 64;
|
||||
|
||||
auto reset_info = reinterpret_cast<struct vfio_pci_hot_reset_info*>
|
||||
(calloc(1, reset_infolen));
|
||||
|
||||
|
@ -562,6 +563,8 @@ VfioDevice::pciHotReset()
|
|||
}
|
||||
}
|
||||
|
||||
free(reset_info);
|
||||
|
||||
const size_t resetlen = sizeof(struct vfio_pci_hot_reset) +
|
||||
sizeof(int32_t) * 1;
|
||||
auto reset = reinterpret_cast<struct vfio_pci_hot_reset*>
|
||||
|
@ -571,10 +574,10 @@ VfioDevice::pciHotReset()
|
|||
reset->count = 1;
|
||||
reset->group_fds[0] = this->group.fd;
|
||||
|
||||
const bool success = ioctl(this->fd, VFIO_DEVICE_PCI_HOT_RESET, reset) == 0;
|
||||
int ret = ioctl(this->fd, VFIO_DEVICE_PCI_HOT_RESET, reset);
|
||||
const bool success = (ret == 0);
|
||||
|
||||
free(reset);
|
||||
free(reset_info);
|
||||
|
||||
if(not success and not group.container->isIommuEnabled()) {
|
||||
logger->info("PCI hot reset failed, but this is expected without IOMMU");
|
||||
|
@ -740,13 +743,16 @@ VfioGroup::~VfioGroup()
|
|||
|
||||
|
||||
std::unique_ptr<VfioGroup>
|
||||
VfioGroup::attach(int containerFd, int groupIndex)
|
||||
VfioGroup::attach(const VfioContainer& container, int groupIndex)
|
||||
{
|
||||
std::unique_ptr<VfioGroup> group { new VfioGroup(groupIndex) };
|
||||
|
||||
/* Open group fd */
|
||||
std::stringstream groupPath;
|
||||
groupPath << VFIO_DEV("") << groupIndex;
|
||||
groupPath << VFIO_PATH
|
||||
<< (container.isIommuEnabled() ? "" : "noiommu-")
|
||||
<< groupIndex;
|
||||
|
||||
group->fd = open(groupPath.str().c_str(), O_RDWR);
|
||||
if (group->fd < 0) {
|
||||
logger->error("Failed to open VFIO group {}", group->index);
|
||||
|
@ -756,13 +762,11 @@ VfioGroup::attach(int containerFd, int groupIndex)
|
|||
logger->debug("VFIO group {} (fd {}) has path {}",
|
||||
groupIndex, group->fd, groupPath.str());
|
||||
|
||||
int ret;
|
||||
|
||||
/* Claim group ownership */
|
||||
ret = ioctl(group->fd, VFIO_GROUP_SET_CONTAINER, &containerFd);
|
||||
int ret = ioctl(group->fd, VFIO_GROUP_SET_CONTAINER, &container.getFd());
|
||||
if (ret < 0) {
|
||||
logger->error("Failed to attach VFIO group {} to container fd {} (error {})",
|
||||
group->index, containerFd, ret);
|
||||
group->index, container.getFd(), ret);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -771,7 +775,7 @@ VfioGroup::attach(int containerFd, int groupIndex)
|
|||
VFIO_TYPE1_IOMMU :
|
||||
VFIO_NOIOMMU_IOMMU;
|
||||
|
||||
ret = ioctl(containerFd, VFIO_SET_IOMMU, iommu_type);
|
||||
ret = ioctl(container.getFd(), VFIO_SET_IOMMU, iommu_type);
|
||||
if (ret < 0) {
|
||||
logger->error("Failed to set IOMMU type of container: {}", ret);
|
||||
return nullptr;
|
||||
|
|
Loading…
Add table
Reference in a new issue