Amit,

There are a few format issues in your patch, and this patch doesn't
work. 

Flag KVM_DEV_ASSIGN_ENABLE_IOMMU is not set correctly. My comment
inline.


Amit Shah wrote:
> +
> +static AssignedDevice *register_real_device(PCIBus *e_bus,
> +                                         const char *e_dev_name,
> +                                         int e_devfn, uint8_t r_bus,
> +                                         uint8_t r_dev, uint8_t
r_func,
> +                                         int flags)
> +{
> +     int r;
> +     AssignedDevice *pci_dev;
> +     uint8_t e_device, e_intx;
> +
> +     DEBUG("%s: Registering real physical device %s (devfn=0x%x)\n",
> +           __func__, e_dev_name, e_devfn);
> +
> +     pci_dev = (AssignedDevice *)
> +             pci_register_device(e_bus, e_dev_name,
sizeof(AssignedDevice),
> +                                 e_devfn,
assigned_dev_pci_read_config,
> +                                 assigned_dev_pci_write_config);
> +     if (NULL == pci_dev) {
> +             fprintf(stderr, "%s: Error: Couldn't register real
device %s\n",
> +                     __func__, e_dev_name);
> +             return NULL;
> +     }
> +     if (get_real_device(pci_dev, r_bus, r_dev, r_func)) {
> +             fprintf(stderr, "%s: Error: Couldn't get real device
(%s)!\n",
> +                     __func__, e_dev_name);
> +             goto out;
> +     }
> +
> +     /* handle real device's MMIO/PIO BARs */
> +     if (assigned_dev_register_regions(pci_dev->real_device.regions,
> +
pci_dev->real_device.region_number,
> +                                       pci_dev))
> +             goto out;
> +
> +     /* handle interrupt routing */
> +     e_device = (pci_dev->dev.devfn >> 3) & 0x1f;
> +     e_intx = pci_dev->dev.config[0x3d] - 1;
> +     pci_dev->intpin = e_intx;
> +     pci_dev->run = 0;
> +     pci_dev->girq = 0;
> +     pci_dev->h_busnr = r_bus;
> +     pci_dev->h_devfn = PCI_DEVFN(r_dev, r_func);
> +
> +#ifdef KVM_CAP_DEVICE_ASSIGNMENT
> +     if (kvm_enabled()) {
> +             struct kvm_assigned_pci_dev assigned_dev_data;
> +
> +             memset(&assigned_dev_data, 0,
sizeof(assigned_dev_data));
> +             assigned_dev_data.assigned_dev_id  =
> +                     calc_assigned_dev_id(pci_dev->h_busnr,
> +
(uint32_t)pci_dev->h_devfn);
> +             assigned_dev_data.busnr = pci_dev->h_busnr;
> +             assigned_dev_data.devfn = pci_dev->h_devfn;
> +             assigned_dev_data.flags = flags;
> +#ifdef KVM_CAP_PV_DMA
> +             assigned_dev_data.guest_dev_id =
> +                     calc_assigned_dev_id(pci_bus_num(e_bus),
> +                                          PCI_DEVFN(e_device,
r_func));
> +#endif
> +
> +#ifdef KVM_CAP_IOMMU
> +             /* We always enable the IOMMU if present
> +              * (or when not disabled on the command line)
> +              */
> +             r = kvm_check_extension(kvm_context, KVM_CAP_IOMMU);
> +             if (r && !disable_iommu)
> +                     assigned_devices[nr_assigned_devices].dma |=
> +                             KVM_DEV_ASSIGN_ENABLE_IOMMU;

should add assigned_dev_data.flags |= KVM_DEV_ASSIGN_ENABLE_IOMMU here,
otherwise following kvm_assign_pci_device() won't assign device with
iommu.

> +#endif
> +             r = kvm_assign_pci_device(kvm_context,
> +                                       &assigned_dev_data);
> +             if (r < 0) {
> +                     fprintf(stderr, "Could not notify kernel about "
> +                             "assigned device \"%s\"\n", e_dev_name);
> +                     perror("pt-ioctl");
> +                     goto out;
> +             }
> +     }
> +#endif


In addtion, I think we should add following lines to kernel/x86/Kbuild:

        ifeq ($(CONFIG_DMAR),y)
        kvm-objs += vtd.o
        endif

otherwise, "modprobe kvm" after making userspace.

Randy (Weidong)
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to