diff options
author | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2012-05-27 16:58:20 -0400 |
---|---|---|
committer | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2012-05-27 16:58:20 -0400 |
commit | d85d135d8babbc917b370f36cbc02b7b4a2f2d99 (patch) | |
tree | 2f06e02940d87099670aa31459ad1ab41a1ca036 /virt/kvm/iommu.c | |
parent | 5e7b911f9a3e582635801675b7fe935b16cd4af5 (diff) | |
parent | e92a5b28f71aea01b281f9c89d97a4bc5b24748f (diff) |
Merge tag 'omapdss-for-3.5' of git://github.com/tomba/linux into fbdev-next
Omapdss driver changes for 3.5 merge window.
Lots of normal development commits, but perhaps most notable changes are:
* HDMI rework to properly decouple the HDMI audio part from the HDMI video part.
* Restructure omapdss core driver so that it's possible to implement device
tree support. This included changing how platform data is passed to the
drivers, changing display device registration and improving the panel driver's
ability to configure the underlying video output interface.
* Basic support for DSI packet interleaving
Diffstat (limited to 'virt/kvm/iommu.c')
-rw-r--r-- | virt/kvm/iommu.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c index a457d2138f49..e9fff9830bf0 100644 --- a/virt/kvm/iommu.c +++ b/virt/kvm/iommu.c | |||
@@ -240,9 +240,13 @@ int kvm_iommu_map_guest(struct kvm *kvm) | |||
240 | return -ENODEV; | 240 | return -ENODEV; |
241 | } | 241 | } |
242 | 242 | ||
243 | mutex_lock(&kvm->slots_lock); | ||
244 | |||
243 | kvm->arch.iommu_domain = iommu_domain_alloc(&pci_bus_type); | 245 | kvm->arch.iommu_domain = iommu_domain_alloc(&pci_bus_type); |
244 | if (!kvm->arch.iommu_domain) | 246 | if (!kvm->arch.iommu_domain) { |
245 | return -ENOMEM; | 247 | r = -ENOMEM; |
248 | goto out_unlock; | ||
249 | } | ||
246 | 250 | ||
247 | if (!allow_unsafe_assigned_interrupts && | 251 | if (!allow_unsafe_assigned_interrupts && |
248 | !iommu_domain_has_cap(kvm->arch.iommu_domain, | 252 | !iommu_domain_has_cap(kvm->arch.iommu_domain, |
@@ -253,17 +257,16 @@ int kvm_iommu_map_guest(struct kvm *kvm) | |||
253 | " module option.\n", __func__); | 257 | " module option.\n", __func__); |
254 | iommu_domain_free(kvm->arch.iommu_domain); | 258 | iommu_domain_free(kvm->arch.iommu_domain); |
255 | kvm->arch.iommu_domain = NULL; | 259 | kvm->arch.iommu_domain = NULL; |
256 | return -EPERM; | 260 | r = -EPERM; |
261 | goto out_unlock; | ||
257 | } | 262 | } |
258 | 263 | ||
259 | r = kvm_iommu_map_memslots(kvm); | 264 | r = kvm_iommu_map_memslots(kvm); |
260 | if (r) | 265 | if (r) |
261 | goto out_unmap; | 266 | kvm_iommu_unmap_memslots(kvm); |
262 | |||
263 | return 0; | ||
264 | 267 | ||
265 | out_unmap: | 268 | out_unlock: |
266 | kvm_iommu_unmap_memslots(kvm); | 269 | mutex_unlock(&kvm->slots_lock); |
267 | return r; | 270 | return r; |
268 | } | 271 | } |
269 | 272 | ||
@@ -310,6 +313,11 @@ static void kvm_iommu_put_pages(struct kvm *kvm, | |||
310 | } | 313 | } |
311 | } | 314 | } |
312 | 315 | ||
316 | void kvm_iommu_unmap_pages(struct kvm *kvm, struct kvm_memory_slot *slot) | ||
317 | { | ||
318 | kvm_iommu_put_pages(kvm, slot->base_gfn, slot->npages); | ||
319 | } | ||
320 | |||
313 | static int kvm_iommu_unmap_memslots(struct kvm *kvm) | 321 | static int kvm_iommu_unmap_memslots(struct kvm *kvm) |
314 | { | 322 | { |
315 | int idx; | 323 | int idx; |
@@ -320,7 +328,7 @@ static int kvm_iommu_unmap_memslots(struct kvm *kvm) | |||
320 | slots = kvm_memslots(kvm); | 328 | slots = kvm_memslots(kvm); |
321 | 329 | ||
322 | kvm_for_each_memslot(memslot, slots) | 330 | kvm_for_each_memslot(memslot, slots) |
323 | kvm_iommu_put_pages(kvm, memslot->base_gfn, memslot->npages); | 331 | kvm_iommu_unmap_pages(kvm, memslot); |
324 | 332 | ||
325 | srcu_read_unlock(&kvm->srcu, idx); | 333 | srcu_read_unlock(&kvm->srcu, idx); |
326 | 334 | ||
@@ -335,7 +343,11 @@ int kvm_iommu_unmap_guest(struct kvm *kvm) | |||
335 | if (!domain) | 343 | if (!domain) |
336 | return 0; | 344 | return 0; |
337 | 345 | ||
346 | mutex_lock(&kvm->slots_lock); | ||
338 | kvm_iommu_unmap_memslots(kvm); | 347 | kvm_iommu_unmap_memslots(kvm); |
348 | kvm->arch.iommu_domain = NULL; | ||
349 | mutex_unlock(&kvm->slots_lock); | ||
350 | |||
339 | iommu_domain_free(domain); | 351 | iommu_domain_free(domain); |
340 | return 0; | 352 | return 0; |
341 | } | 353 | } |