On Tue, Apr 26, 2022 at 04:08:36PM -0400, Matthew Rosato wrote:
+int kvm_s390_pci_register_kvm(struct zpci_dev *zdev, struct kvm *kvm)
+{
+ if (!zdev)
+ return 0;
+
+ /*
+ * Register device with this KVM (or remove the KVM association if 0).
+ * If interpetation facilities are available, enable them and let
+ * userspace indicate whether or not they will be used (specify SHM bit
+ * to disable).
+ */
+ if (kvm)
+ return register_kvm(zdev, kvm);
+ else
+ return unregister_kvm(zdev);
+}
+EXPORT_SYMBOL_GPL(kvm_s390_pci_register_kvm);
I think it is cleaner to expose both the register/unregister APIs and
not multiplex them like this
+void kvm_s390_pci_clear_list(struct kvm *kvm)
+{
+ struct kvm_zdev *tmp, *kzdev;
+ LIST_HEAD(remove);
+
+ spin_lock(&kvm->arch.kzdev_list_lock);
+ list_for_each_entry_safe(kzdev, tmp, &kvm->arch.kzdev_list, entry)
+ list_move_tail(&kzdev->entry, &remove);
+ spin_unlock(&kvm->arch.kzdev_list_lock);
+
+ list_for_each_entry_safe(kzdev, tmp, &remove, entry)
+ unregister_kvm(kzdev->zdev);
Hum, I wonder if this is a mistake in kvm:
static void kvm_destroy_vm(struct kvm *kvm)
{
[..]
kvm_arch_destroy_vm(kvm);
kvm_destroy_devices(kvm);
kvm_destroy_devices() triggers the VFIO notifier with NULL. Indeed for
correctness I would expect the VFIO users to have been notified to
release the kvm before the kvm object becomes partially destroyed?
Maybe you should investigate re-ordering this at the KVM side and just
WARN_ON(!list_empty) in the arch code?
(vfio has this odd usage model where it should use the kvm pointer
without taking a ref on it so long as the unregister hasn't been
called)
If you keep it like this then the locking in register/unregister looks
not broad enough and has to cover the zdev->kzdev also.
Overall I think it is OK designed like this, aside from the ugly
symbol_get in vfio which I hope you can resolve.
Jason