diff --git a/internal/exporter/reanimator_converter.go b/internal/exporter/reanimator_converter.go index fbb0210..a6c25de 100644 --- a/internal/exporter/reanimator_converter.go +++ b/internal/exporter/reanimator_converter.go @@ -218,6 +218,9 @@ func buildDevicesFromLegacy(hw *models.HardwareConfig) []models.HardwareDevice { if pcie.HWSlowdown != nil { details = mergeDetailMaps(details, map[string]any{"hw_slowdown": *pcie.HWSlowdown}) } + if pcie.IOMMUGroup != nil { + details = mergeDetailMaps(details, map[string]any{"iommu_group": *pcie.IOMMUGroup}) + } present := pcie.Present appendDevice(models.HardwareDevice{ Kind: models.DeviceKindPCIe, @@ -844,6 +847,7 @@ func convertPCIeFromDevices(devices []models.HardwareDevice, collectedAt string) VendorID: d.VendorID, DeviceID: d.DeviceID, NUMANode: d.NUMANode, + IOMMUGroup: intPtrFromDetailMap(d.Details, "iommu_group"), TemperatureC: temperatureC, PowerW: powerW, LifeRemainingPct: floatFromDetailMap(d.Details, "life_remaining_pct"), @@ -2119,6 +2123,17 @@ func parseSocketFromSlot(slot string) int { return v } +func intPtrFromDetailMap(details map[string]any, key string) *int { + if details == nil { + return nil + } + if _, ok := details[key]; !ok { + return nil + } + v := intFromDetailMap(details, key) + return &v +} + func intFromDetailMap(details map[string]any, key string) int { if details == nil { return 0 diff --git a/internal/exporter/reanimator_models.go b/internal/exporter/reanimator_models.go index 3c9a1c8..aed2cff 100644 --- a/internal/exporter/reanimator_models.go +++ b/internal/exporter/reanimator_models.go @@ -143,6 +143,7 @@ type ReanimatorPCIe struct { VendorID int `json:"vendor_id,omitempty"` DeviceID int `json:"device_id,omitempty"` NUMANode int `json:"numa_node,omitempty"` + IOMMUGroup *int `json:"iommu_group,omitempty"` TemperatureC float64 `json:"temperature_c,omitempty"` PowerW float64 `json:"power_w,omitempty"` LifeRemainingPct float64 `json:"life_remaining_pct,omitempty"`