Added a multi IOMMU group listing
This commit is contained in:
parent
9508b6ca28
commit
b1efb848b2
48
src/pci.c
48
src/pci.c
@ -95,6 +95,54 @@ result_t get_iommu_group(int* _group, const char* pci) {
|
|||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result_t get_iommu_groups(int** _groups, int* _count, const char** pcis) {
|
||||||
|
// Initialize the output parameters
|
||||||
|
*_groups = NULL;
|
||||||
|
*_count = 0;
|
||||||
|
|
||||||
|
// Count the number of PCI devices
|
||||||
|
int count = 0;
|
||||||
|
while (pcis[count] != NULL)
|
||||||
|
count++;
|
||||||
|
|
||||||
|
// Allocate memory for the groups
|
||||||
|
int* groups = malloc(count * sizeof(int));
|
||||||
|
if (groups == NULL)
|
||||||
|
return failure("Failed to allocate memory for IOMMU groups.");
|
||||||
|
|
||||||
|
// Get the IOMMU groups of the PCI devices
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
// Get the IOMMU group of the PCI device
|
||||||
|
result_t result = get_iommu_group(&groups[i], pcis[i]);
|
||||||
|
if (result != success()) {
|
||||||
|
free(groups);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove duplicates from the groups
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
for (int j = i + 1; j < count; j++) {
|
||||||
|
if (groups[i] == groups[j]) {
|
||||||
|
// Shift the elements to the left
|
||||||
|
for (int k = j; k < count - 1; k++)
|
||||||
|
groups[k] = groups[k + 1];
|
||||||
|
|
||||||
|
// Decrement the count
|
||||||
|
count--;
|
||||||
|
|
||||||
|
// Decrement the index
|
||||||
|
j--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*_groups = groups;
|
||||||
|
*_count = count;
|
||||||
|
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
|
||||||
bool pci_filter(const char* file) {
|
bool pci_filter(const char* file) {
|
||||||
// Check that the PCI device exists
|
// Check that the PCI device exists
|
||||||
return check_pci_exists(file) == success();
|
return check_pci_exists(file) == success();
|
||||||
|
@ -18,6 +18,13 @@ result_t check_pci_exists(const char* pci);
|
|||||||
/// @return The result of the operation.
|
/// @return The result of the operation.
|
||||||
result_t get_iommu_group(int* _group, const char* pci);
|
result_t get_iommu_group(int* _group, const char* pci);
|
||||||
|
|
||||||
|
/// @brief Gets the IOMMU groups of the given PCI addresses.
|
||||||
|
/// @param _groups The integer array pointer to store the resulting IOMMU groups in. The caller is responsible for freeing the array.
|
||||||
|
/// @param _count The integer pointer to store the number of IOMMU groups in.
|
||||||
|
/// @param pcis The PCI addresses to get the IOMMU groups of.
|
||||||
|
/// @return The result of the operation.
|
||||||
|
result_t get_iommu_groups(int** _groups, int* _count, const char** pcis);
|
||||||
|
|
||||||
/// @brief Checks that the given file is a PCI device. This function is used as a filter for listing PCI devices.
|
/// @brief Checks that the given file is a PCI device. This function is used as a filter for listing PCI devices.
|
||||||
/// @param file The file to check.
|
/// @param file The file to check.
|
||||||
/// @return Whether the file is a PCI device.
|
/// @return Whether the file is a PCI device.
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#define SANDBOX_VERSION "0.1.4"
|
#define SANDBOX_VERSION "0.1.4"
|
||||||
#define SANDBOX_USER "sandbox"
|
#define SANDBOX_USER "sandbox"
|
||||||
|
#define LIBVIRT_DOMAIN "sandbox"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char* name;
|
const char* name;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#include "container.h"
|
#include "container.h"
|
||||||
|
#include "sandbox.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -45,7 +46,7 @@ result_t generate_container_xml(char** _xml, char* container, int cpu, uint64_t
|
|||||||
|
|
||||||
// Generate the XML
|
// Generate the XML
|
||||||
result = format(_xml, "<domain type='kvm'>\n"
|
result = format(_xml, "<domain type='kvm'>\n"
|
||||||
"<name>sandbox</name>\n"
|
"<name>%s</name>\n"
|
||||||
"\n<!-- Resources -->\n"
|
"\n<!-- Resources -->\n"
|
||||||
"<memory unit='B'>%llu</memory>\n"
|
"<memory unit='B'>%llu</memory>\n"
|
||||||
"<vcpu placement='static'>%d</vcpu>\n"
|
"<vcpu placement='static'>%d</vcpu>\n"
|
||||||
@ -95,7 +96,7 @@ result_t generate_container_xml(char** _xml, char* container, int cpu, uint64_t
|
|||||||
"<memballoon model='none'/>\n"
|
"<memballoon model='none'/>\n"
|
||||||
"</devices>\n"
|
"</devices>\n"
|
||||||
"</domain>\n",
|
"</domain>\n",
|
||||||
memory, cpu, container_path, iso_xml, vnc_xml, pci_xml);
|
LIBVIRT_DOMAIN, memory, cpu, container_path, iso_xml, vnc_xml, pci_xml);
|
||||||
|
|
||||||
// Free the PCI, ISO, and VNC XML
|
// Free the PCI, ISO, and VNC XML
|
||||||
free(pci_xml);
|
free(pci_xml);
|
||||||
|
Loading…
Reference in New Issue
Block a user