Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[sfrench/cifs-2.6.git] / virt / kvm / iommu.c
index 15147583abd164d64de465eb7fce9d0c27a41ef8..80fd3ad3b2de77d246fe8cb9a5df5714609735c3 100644 (file)
@@ -32,10 +32,10 @@ static int kvm_iommu_unmap_memslots(struct kvm *kvm);
 static void kvm_iommu_put_pages(struct kvm *kvm,
                                gfn_t base_gfn, unsigned long npages);
 
-int kvm_iommu_map_pages(struct kvm *kvm,
-                       gfn_t base_gfn, unsigned long npages)
+int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
 {
-       gfn_t gfn = base_gfn;
+       gfn_t gfn = slot->base_gfn;
+       unsigned long npages = slot->npages;
        pfn_t pfn;
        int i, r = 0;
        struct iommu_domain *domain = kvm->arch.iommu_domain;
@@ -54,7 +54,7 @@ int kvm_iommu_map_pages(struct kvm *kvm,
                if (iommu_iova_to_phys(domain, gfn_to_gpa(gfn)))
                        continue;
 
-               pfn = gfn_to_pfn(kvm, gfn);
+               pfn = gfn_to_pfn_memslot(kvm, slot, gfn);
                r = iommu_map_range(domain,
                                    gfn_to_gpa(gfn),
                                    pfn_to_hpa(pfn),
@@ -69,17 +69,19 @@ int kvm_iommu_map_pages(struct kvm *kvm,
        return 0;
 
 unmap_pages:
-       kvm_iommu_put_pages(kvm, base_gfn, i);
+       kvm_iommu_put_pages(kvm, slot->base_gfn, i);
        return r;
 }
 
 static int kvm_iommu_map_memslots(struct kvm *kvm)
 {
        int i, r = 0;
+       struct kvm_memslots *slots;
+
+       slots = rcu_dereference(kvm->memslots);
 
-       for (i = 0; i < kvm->nmemslots; i++) {
-               r = kvm_iommu_map_pages(kvm, kvm->memslots[i].base_gfn,
-                                       kvm->memslots[i].npages);
+       for (i = 0; i < slots->nmemslots; i++) {
+               r = kvm_iommu_map_pages(kvm, &slots->memslots[i]);
                if (r)
                        break;
        }
@@ -104,7 +106,8 @@ int kvm_assign_device(struct kvm *kvm,
 
        r = iommu_attach_device(domain, &pdev->dev);
        if (r) {
-               printk(KERN_ERR "assign device %x:%x.%x failed",
+               printk(KERN_ERR "assign device %x:%x:%x.%x failed",
+                       pci_domain_nr(pdev->bus),
                        pdev->bus->number,
                        PCI_SLOT(pdev->devfn),
                        PCI_FUNC(pdev->devfn));
@@ -125,7 +128,8 @@ int kvm_assign_device(struct kvm *kvm,
                        goto out_unmap;
        }
 
-       printk(KERN_DEBUG "assign device: host bdf = %x:%x:%x\n",
+       printk(KERN_DEBUG "assign device %x:%x:%x.%x\n",
+               assigned_dev->host_segnr,
                assigned_dev->host_busnr,
                PCI_SLOT(assigned_dev->host_devfn),
                PCI_FUNC(assigned_dev->host_devfn));
@@ -152,7 +156,8 @@ int kvm_deassign_device(struct kvm *kvm,
 
        iommu_detach_device(domain, &pdev->dev);
 
-       printk(KERN_DEBUG "deassign device: host bdf = %x:%x:%x\n",
+       printk(KERN_DEBUG "deassign device %x:%x:%x.%x\n",
+               assigned_dev->host_segnr,
                assigned_dev->host_busnr,
                PCI_SLOT(assigned_dev->host_devfn),
                PCI_FUNC(assigned_dev->host_devfn));
@@ -210,10 +215,13 @@ static void kvm_iommu_put_pages(struct kvm *kvm,
 static int kvm_iommu_unmap_memslots(struct kvm *kvm)
 {
        int i;
+       struct kvm_memslots *slots;
+
+       slots = rcu_dereference(kvm->memslots);
 
-       for (i = 0; i < kvm->nmemslots; i++) {
-               kvm_iommu_put_pages(kvm, kvm->memslots[i].base_gfn,
-                                   kvm->memslots[i].npages);
+       for (i = 0; i < slots->nmemslots; i++) {
+               kvm_iommu_put_pages(kvm, slots->memslots[i].base_gfn,
+                                   slots->memslots[i].npages);
        }
 
        return 0;