Ben-Ami Yassour wrote:
> On Thu, 2008-08-07 at 09:21 +0800, Han, Weidong wrote:
>> Ben-Ami Yassour wrote:
>>> On Wed, 2008-08-06 at 17:12 +0800, Han, Weidong wrote:
>>>> Ben-Ami Yassour wrote:
>>>>> On Wed, 2008-08-06 at 14:18 +0800, Han, Weidong wrote:
>>>>>> Ben-Ami Yassour wrote:
>>>>>>> On Tue, 2008-08-05 at 22:46 +0800, Han, Weidong wrote:
>>>>>>>> Ben-Ami Yassour wrote:
>>>>>>>>> [Ben: fixed memory pinning]
>>>>>>>>> 
>>>>>>>>> Signed-off-by: Kay, Allen M <[EMAIL PROTECTED]>
>>>>>>>>> Signed-off-by: Weidong Han <[EMAIL PROTECTED]>
>>>>>>>>> Signed-off-by: Ben-Ami Yassour <[EMAIL PROTECTED]>
>>>>>>>>> ---
>>>>>>>>> +
>>>>>>>>> +int kvm_iommu_map_guest(struct kvm *kvm,
>>>>>>>>> +                     struct kvm_assigned_dev_kernel
*assigned_dev)
>>>>>>>>> +{
>>>>>>>>> +     struct pci_dev *pdev = NULL;
>>>>>>>>> +     int rc;
>>>>>>>>> +
>>>>>>>>> +     printk(KERN_DEBUG "VT-d direct map: host bdf =
%x:%x:%x\n",
>>>>>>>>> +            assigned_dev->host_busnr,
>>>>>>>>> +            PCI_SLOT(assigned_dev->host_devfn),
>>>>>>>>> +            PCI_FUNC(assigned_dev->host_devfn));
>>>>>>>>> +
>>>>>>>>> +     pdev = assigned_dev->dev;
>>>>>>>>> +
>>>>>>>>> +     if (pdev == NULL) {
>>>>>>>>> +             if (kvm->arch.intel_iommu_domain) {
>>>>>>>>> +
>>>>>>>> intel_iommu_domain_exit(kvm->arch.intel_iommu_domain);
>>>>>>>>> +                     kvm->arch.intel_iommu_domain = NULL;
>>>>>>>>> +             }
>>>>>>>>> +             return -ENODEV;
>>>>>>>>> +     }
>>>>>>>>> +
>>>>>>>>> +     kvm->arch.intel_iommu_domain =
>>>>>>>>> intel_iommu_domain_alloc(pdev); + +   rc =
>>>>>>>>> kvm_iommu_map_memslots(kvm); +        if (rc) {
>>>>>>>>> +             kvm_iommu_unmap_memslots(kvm);
>>>>>>>>> +             return rc;
>>>>>>>>> +     }
>>>>>>>>> +
>>>>>>>>> +     intel_iommu_detach_dev(kvm->arch.intel_iommu_domain,
>>>>>>>>> +                            pdev->bus->number, pdev->devfn);
>>>>>>>> 
>>>>>>>> I think we should remove intel_iommu_detach_dev(), which
>>>>>>>> detaches device from iommu. If the device has been assigned to
>>>>>>>> other domain already, it should not be assigned to this
>>>>>>>> domain. Maybe we need to add a check whether the device has
>>>>>>>> been assigned already.
>>>>>>> 
>>>>>>> The problem is that in the generic VT-d code, the IOMMU is not
>>>>>>> updated when a device is detached, for example when the driver
>>>>>>> releases the device. Consider the following scenario:
>>>>>>> 1. load device driver on host
>>>>>>> 2. use device on host
>>>>>>> 3. unload device driver on host
>>>>>>> 4. Start KVM and assign the device to the guest.
>>>>>>> 
>>>>>>> In this case there is no clearing of the IOMMU on step 3, and we
>>>>>>> get Vt-d failures (if we remove the above call).
>>>>>>> 
>>>>>> 
>>>>>> I don't prefer this usage process. As we discussed before, there
>>>>>> should be a dummy driver to hide/unbind passthrough devices from
>>>>>> host, only these devices can be assigned. There should be a check
>>>>>> whether device is assignable or not. If the device is not hidden,
>>>>>> or has been assigned to other guest already, it cannot be
>>>>>> assigned. At this point, I perfer to remove the device driver
>>>>>> before restart host to avoid loading driver during booting.
>>>>> 
>>>>> I agree, but this is an orthogonal issue. Checking if the device
>>>>> is assigned has to be part of the device assignment solution in
>>>>> general, it is not specific to VT-d.
>>>> 
>>>> Yes, the check is general. When the check fails, should quit guest
>>>> creation, and prompt the reason to user.
>>>> 
>>>>> As for VT-d detach, the point is that the generic VT-d code is not
>>>>> detaching the domain, so we have to do that in KVM.
>>>> 
>>>> In intel_iommu_unmap_guest(), assigned devices will be detached
>>>> from the guest. I think it's enough.
>>>> 
>>>>> Again, removing the device driver is not enough (with the current
>>>>> VT-d code).
>>>> 
>>>> Why? It works for me. e.g. I removed e1000.ko before reboot host,
>>>> it works well. BTW, for USB assignment, I add "nousb" in host grub
>>>> to avoid loading driver for USB controllers, it also works.
>>> What about the scenario described above:
>>> 1. load device driver on host
>>> 2. use device on host
>>> 3. unload device driver on host
>>> 4. Start KVM and assign the device to the guest.
>>> 
>>> Does it work for you as well?
>>> 
>> 
>> I didn't try the scenario you described, it should not work if
>> removing the detach call. I means removing device driver before
>> reboot host. We should implement a mechanism to ensure assignable
>> devices won't be set in context, instead of adding the detach call
>> unconditionally in kvm_iommu_map_guest(). At this moment, I perfer
>> to remove corresponding device driver before reboot host to assign
>> the device. 
>> 
> 
> I agree that the detach call is not the ideal solution.
> On the other hand, I don't think that forcing the user to reboot is
> reasonable.
> Another approach is to update the VT-d driver code in such a way that
> will make sure that the context is cleared when the driver is removed,
> e.g. tie it to the device release path.
> 

Okay, we can consider this when implement dummy driver to hide/unbind
passthrough devices from host. And also, we need to define a clear and
friendly VT-d usage later.

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