mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
IOMMU/PCI: propagate get_device_group_id() failure
The VT-d hook can indicate an error, which shouldn't be ignored. Convert the hook's return value to a proper error code, and let that bubble up. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Paul Durrant <paul@xen.org> Reviewed-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
1 parent
89d5b779a8
commit
8518f96f13
2 files changed
+14
-6
No files matched your search
@@ -1532,6 +1532,8 @@ static int iommu_get_device_group(
|
||||
return 0;
|
||||
|
||||
group_id = iommu_call(ops, get_device_group_id, seg, bus, devfn);
|
||||
if ( group_id < 0 )
|
||||
return group_id;
|
||||
|
||||
pcidevs_lock();
|
||||
for_each_pdev( d, pdev )
|
||||
@@ -1546,6 +1548,12 @@ static int iommu_get_device_group(
|
||||
continue;
|
||||
|
||||
sdev_id = iommu_call(ops, get_device_group_id, seg, b, df);
|
||||
if ( sdev_id < 0 )
|
||||
{
|
||||
pcidevs_unlock();
|
||||
return sdev_id;
|
||||
}
|
||||
|
||||
if ( (sdev_id == group_id) && (i < max_sdevs) )
|
||||
{
|
||||
bdf = (b << 16) | (df << 8);
|
||||
@@ -1553,7 +1561,7 @@ static int iommu_get_device_group(
|
||||
if ( unlikely(copy_to_guest_offset(buf, i, &bdf, 1)) )
|
||||
{
|
||||
pcidevs_unlock();
|
||||
return -1;
|
||||
return -EFAULT;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
@@ -1621,8 +1629,7 @@ int iommu_do_pci_domctl(
|
||||
ret = iommu_get_device_group(d, seg, bus, devfn, sdevs, max_sdevs);
|
||||
if ( ret < 0 )
|
||||
{
|
||||
dprintk(XENLOG_ERR, "iommu_get_device_group() failed!\n");
|
||||
ret = -EFAULT;
|
||||
dprintk(XENLOG_ERR, "iommu_get_device_group() failed: %d\n", ret);
|
||||
domctl->u.get_device_group.num_sdevs = 0;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -2564,10 +2564,11 @@ static int intel_iommu_assign_device(
|
||||
static int intel_iommu_group_id(u16 seg, u8 bus, u8 devfn)
|
||||
{
|
||||
u8 secbus;
|
||||
|
||||
if ( find_upstream_bridge(seg, &bus, &devfn, &secbus) < 0 )
|
||||
return -1;
|
||||
else
|
||||
return PCI_BDF2(bus, devfn);
|
||||
return -ENODEV;
|
||||
|
||||
return PCI_BDF2(bus, devfn);
|
||||
}
|
||||
|
||||
static int __must_check vtd_suspend(void)
|
||||
|
||||