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 )
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);
if ( unlikely(copy_to_guest_offset(buf, i, &bdf, 1)) )
{
pcidevs_unlock();
- return -1;
+ return -EFAULT;
}
i++;
}
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
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)