aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2017-06-28 15:49:52 -0400
committerAlex Williamson <alex.williamson@redhat.com>2017-06-28 15:49:52 -0400
commite323369b2e204da4dc771bbddceef986f4bf85d5 (patch)
treec2bd8dc9b6b0b1a1b89e781e5225e8b772cdc3bd
parent811642d8d8a82c0cce8dc2debfdaf23c5a144839 (diff)
kvm-vfio: Decouple only when we match a group
Unset-KVM and decrement-assignment only when we find the group in our list. Otherwise we can get out of sync if the user triggers this for groups that aren't currently on our list. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Eric Auger <eric.auger@redhat.com> Tested-by: Eric Auger <eric.auger@redhat.com> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Cc: stable@vger.kernel.org
-rw-r--r--virt/kvm/vfio.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c
index 37d9118fd84b..6e002d0f3191 100644
--- a/virt/kvm/vfio.c
+++ b/virt/kvm/vfio.c
@@ -246,21 +246,20 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg)
246 continue; 246 continue;
247 247
248 list_del(&kvg->node); 248 list_del(&kvg->node);
249 kvm_arch_end_assignment(dev->kvm);
250#ifdef CONFIG_SPAPR_TCE_IOMMU
251 kvm_spapr_tce_release_vfio_group(dev->kvm,
252 kvg->vfio_group);
253#endif
254 kvm_vfio_group_set_kvm(kvg->vfio_group, NULL);
249 kvm_vfio_group_put_external_user(kvg->vfio_group); 255 kvm_vfio_group_put_external_user(kvg->vfio_group);
250 kfree(kvg); 256 kfree(kvg);
251 ret = 0; 257 ret = 0;
252 break; 258 break;
253 } 259 }
254 260
255 kvm_arch_end_assignment(dev->kvm);
256
257 mutex_unlock(&kv->lock); 261 mutex_unlock(&kv->lock);
258 262
259#ifdef CONFIG_SPAPR_TCE_IOMMU
260 kvm_spapr_tce_release_vfio_group(dev->kvm, vfio_group);
261#endif
262 kvm_vfio_group_set_kvm(vfio_group, NULL);
263
264 kvm_vfio_group_put_external_user(vfio_group); 263 kvm_vfio_group_put_external_user(vfio_group);
265 264
266 kvm_vfio_update_coherency(dev); 265 kvm_vfio_update_coherency(dev);