On Tue, 2010-11-16 at 10:54 -0700, Alex Williamson wrote: > On Tue, 2010-11-09 at 17:09 -0800, Tom Lyon wrote: > > Cleans up config space virtualization, especialy handling of bytes > > which have some virtual and some real bits, like PCI_COMMAND. > > > > Alex, I hope you can test this with your setups. > > Sorry for the delay. FWIW, I'm not having much luck with this, I'll try > to debug the problem. Thanks, This seems to be the bug. Thanks, Alex vfio: Don't write random bits on read Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx> --- diff --git a/drivers/vfio/vfio_pci_config.c b/drivers/vfio/vfio_pci_config.c index 7132ac4..422d7b1 100644 --- a/drivers/vfio/vfio_pci_config.c +++ b/drivers/vfio/vfio_pci_config.c @@ -964,11 +964,6 @@ static int vfio_config_rwbyte(int write, return 0; } - if (write) { - if (copy_from_user(&newval, buf, 1)) - return -EFAULT; - } - if (~virt) { /* mix of real and virt bits */ /* update vconfig with latest hw bits */ ret = vfio_read_config_byte(vdev, pos, &realbits); @@ -978,9 +973,14 @@ static int vfio_config_rwbyte(int write, (vdev->vconfig[pos] & virt) | (realbits & ~virt); } - /* update vconfig with writeable bits */ - vdev->vconfig[pos] = - (vdev->vconfig[pos] & ~wr) | (newval & wr); + if (write) { + if (copy_from_user(&newval, buf, 1)) + return -EFAULT; + + /* update vconfig with writeable bits */ + vdev->vconfig[pos] = + (vdev->vconfig[pos] & ~wr) | (newval & wr); + } /* * Now massage virtual fields -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html