Lines Matching refs:kvm
36 kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args) in kvm_arch_irqfd_allowed() argument
46 struct kvm *kvm = irqfd->kvm; in irqfd_inject() local
49 kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 1, in irqfd_inject()
51 kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 0, in irqfd_inject()
54 kvm_set_irq(kvm, KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID, in irqfd_inject()
67 struct kvm *kvm; in irqfd_resampler_ack() local
73 kvm = resampler->kvm; in irqfd_resampler_ack()
75 kvm_set_irq(kvm, KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID, in irqfd_resampler_ack()
78 idx = srcu_read_lock(&kvm->irq_srcu); in irqfd_resampler_ack()
83 srcu_read_unlock(&kvm->irq_srcu, idx); in irqfd_resampler_ack()
90 struct kvm *kvm = resampler->kvm; in irqfd_resampler_shutdown() local
92 mutex_lock(&kvm->irqfds.resampler_lock); in irqfd_resampler_shutdown()
95 synchronize_srcu(&kvm->irq_srcu); in irqfd_resampler_shutdown()
99 kvm_unregister_irq_ack_notifier(kvm, &resampler->notifier); in irqfd_resampler_shutdown()
100 kvm_set_irq(kvm, KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID, in irqfd_resampler_shutdown()
105 mutex_unlock(&kvm->irqfds.resampler_lock); in irqfd_resampler_shutdown()
116 struct kvm *kvm = irqfd->kvm; in irqfd_shutdown() local
120 synchronize_srcu(&kvm->irq_srcu); in irqfd_shutdown()
174 struct kvm *kvm, int irq_source_id, in kvm_arch_set_irq_inatomic() argument
191 struct kvm *kvm = irqfd->kvm; in irqfd_wakeup() local
200 idx = srcu_read_lock(&kvm->irq_srcu); in irqfd_wakeup()
206 if (kvm_arch_set_irq_inatomic(&irq, kvm, in irqfd_wakeup()
210 srcu_read_unlock(&kvm->irq_srcu, idx); in irqfd_wakeup()
218 spin_lock_irqsave(&kvm->irqfds.lock, iflags); in irqfd_wakeup()
232 spin_unlock_irqrestore(&kvm->irqfds.lock, iflags); in irqfd_wakeup()
248 static void irqfd_update(struct kvm *kvm, struct kvm_kernel_irqfd *irqfd) in irqfd_update() argument
254 n_entries = kvm_irq_map_gsi(kvm, entries, irqfd->gsi); in irqfd_update()
279 struct kvm *kvm, unsigned int host_irq, in kvm_arch_update_irqfd_routing() argument
294 kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) in kvm_irqfd_assign() argument
303 if (!kvm_arch_intc_initialized(kvm)) in kvm_irqfd_assign()
306 if (!kvm_arch_irqfd_allowed(kvm, args)) in kvm_irqfd_assign()
313 irqfd->kvm = kvm; in kvm_irqfd_assign()
318 seqcount_spinlock_init(&irqfd->irq_entry_sc, &kvm->irqfds.lock); in kvm_irqfd_assign()
346 mutex_lock(&kvm->irqfds.resampler_lock); in kvm_irqfd_assign()
349 &kvm->irqfds.resampler_list, link) { in kvm_irqfd_assign()
361 mutex_unlock(&kvm->irqfds.resampler_lock); in kvm_irqfd_assign()
365 resampler->kvm = kvm; in kvm_irqfd_assign()
371 list_add(&resampler->link, &kvm->irqfds.resampler_list); in kvm_irqfd_assign()
372 kvm_register_irq_ack_notifier(kvm, in kvm_irqfd_assign()
378 synchronize_srcu(&kvm->irq_srcu); in kvm_irqfd_assign()
380 mutex_unlock(&kvm->irqfds.resampler_lock); in kvm_irqfd_assign()
390 spin_lock_irq(&kvm->irqfds.lock); in kvm_irqfd_assign()
393 list_for_each_entry(tmp, &kvm->irqfds.items, list) { in kvm_irqfd_assign()
398 spin_unlock_irq(&kvm->irqfds.lock); in kvm_irqfd_assign()
402 idx = srcu_read_lock(&kvm->irq_srcu); in kvm_irqfd_assign()
403 irqfd_update(kvm, irqfd); in kvm_irqfd_assign()
405 list_add_tail(&irqfd->list, &kvm->irqfds.items); in kvm_irqfd_assign()
407 spin_unlock_irq(&kvm->irqfds.lock); in kvm_irqfd_assign()
432 srcu_read_unlock(&kvm->irq_srcu, idx); in kvm_irqfd_assign()
458 bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin) in kvm_irq_has_notifier() argument
463 idx = srcu_read_lock(&kvm->irq_srcu); in kvm_irq_has_notifier()
464 gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin); in kvm_irq_has_notifier()
466 hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list, in kvm_irq_has_notifier()
469 srcu_read_unlock(&kvm->irq_srcu, idx); in kvm_irq_has_notifier()
473 srcu_read_unlock(&kvm->irq_srcu, idx); in kvm_irq_has_notifier()
479 void kvm_notify_acked_gsi(struct kvm *kvm, int gsi) in kvm_notify_acked_gsi() argument
483 hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list, in kvm_notify_acked_gsi()
489 void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin) in kvm_notify_acked_irq() argument
495 idx = srcu_read_lock(&kvm->irq_srcu); in kvm_notify_acked_irq()
496 gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin); in kvm_notify_acked_irq()
498 kvm_notify_acked_gsi(kvm, gsi); in kvm_notify_acked_irq()
499 srcu_read_unlock(&kvm->irq_srcu, idx); in kvm_notify_acked_irq()
502 void kvm_register_irq_ack_notifier(struct kvm *kvm, in kvm_register_irq_ack_notifier() argument
505 mutex_lock(&kvm->irq_lock); in kvm_register_irq_ack_notifier()
506 hlist_add_head_rcu(&kian->link, &kvm->irq_ack_notifier_list); in kvm_register_irq_ack_notifier()
507 mutex_unlock(&kvm->irq_lock); in kvm_register_irq_ack_notifier()
508 kvm_arch_post_irq_ack_notifier_list_update(kvm); in kvm_register_irq_ack_notifier()
511 void kvm_unregister_irq_ack_notifier(struct kvm *kvm, in kvm_unregister_irq_ack_notifier() argument
514 mutex_lock(&kvm->irq_lock); in kvm_unregister_irq_ack_notifier()
516 mutex_unlock(&kvm->irq_lock); in kvm_unregister_irq_ack_notifier()
517 synchronize_srcu(&kvm->irq_srcu); in kvm_unregister_irq_ack_notifier()
518 kvm_arch_post_irq_ack_notifier_list_update(kvm); in kvm_unregister_irq_ack_notifier()
523 kvm_eventfd_init(struct kvm *kvm) in kvm_eventfd_init() argument
526 spin_lock_init(&kvm->irqfds.lock); in kvm_eventfd_init()
527 INIT_LIST_HEAD(&kvm->irqfds.items); in kvm_eventfd_init()
528 INIT_LIST_HEAD(&kvm->irqfds.resampler_list); in kvm_eventfd_init()
529 mutex_init(&kvm->irqfds.resampler_lock); in kvm_eventfd_init()
531 INIT_LIST_HEAD(&kvm->ioeventfds); in kvm_eventfd_init()
539 kvm_irqfd_deassign(struct kvm *kvm, struct kvm_irqfd *args) in kvm_irqfd_deassign() argument
548 spin_lock_irq(&kvm->irqfds.lock); in kvm_irqfd_deassign()
550 list_for_each_entry_safe(irqfd, tmp, &kvm->irqfds.items, list) { in kvm_irqfd_deassign()
565 spin_unlock_irq(&kvm->irqfds.lock); in kvm_irqfd_deassign()
579 kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args) in kvm_irqfd() argument
585 return kvm_irqfd_deassign(kvm, args); in kvm_irqfd()
587 return kvm_irqfd_assign(kvm, args); in kvm_irqfd()
595 kvm_irqfd_release(struct kvm *kvm) in kvm_irqfd_release() argument
599 spin_lock_irq(&kvm->irqfds.lock); in kvm_irqfd_release()
601 list_for_each_entry_safe(irqfd, tmp, &kvm->irqfds.items, list) in kvm_irqfd_release()
604 spin_unlock_irq(&kvm->irqfds.lock); in kvm_irqfd_release()
618 void kvm_irq_routing_update(struct kvm *kvm) in kvm_irq_routing_update() argument
622 spin_lock_irq(&kvm->irqfds.lock); in kvm_irq_routing_update()
624 list_for_each_entry(irqfd, &kvm->irqfds.items, list) { in kvm_irq_routing_update()
630 irqfd_update(kvm, irqfd); in kvm_irq_routing_update()
636 irqfd->kvm, irqfd->producer->irq, in kvm_irq_routing_update()
643 spin_unlock_irq(&kvm->irqfds.lock); in kvm_irq_routing_update()
778 ioeventfd_check_collision(struct kvm *kvm, struct _ioeventfd *p) in ioeventfd_check_collision() argument
782 list_for_each_entry(_p, &kvm->ioeventfds, list) in ioeventfd_check_collision()
803 static int kvm_assign_ioeventfd_idx(struct kvm *kvm, in kvm_assign_ioeventfd_idx() argument
834 mutex_lock(&kvm->slots_lock); in kvm_assign_ioeventfd_idx()
837 if (ioeventfd_check_collision(kvm, p)) { in kvm_assign_ioeventfd_idx()
844 ret = kvm_io_bus_register_dev(kvm, bus_idx, p->addr, p->length, in kvm_assign_ioeventfd_idx()
849 kvm_get_bus(kvm, bus_idx)->ioeventfd_count++; in kvm_assign_ioeventfd_idx()
850 list_add_tail(&p->list, &kvm->ioeventfds); in kvm_assign_ioeventfd_idx()
852 mutex_unlock(&kvm->slots_lock); in kvm_assign_ioeventfd_idx()
857 mutex_unlock(&kvm->slots_lock); in kvm_assign_ioeventfd_idx()
867 kvm_deassign_ioeventfd_idx(struct kvm *kvm, enum kvm_bus bus_idx, in kvm_deassign_ioeventfd_idx() argument
882 mutex_lock(&kvm->slots_lock); in kvm_deassign_ioeventfd_idx()
884 list_for_each_entry_safe(p, tmp, &kvm->ioeventfds, list) { in kvm_deassign_ioeventfd_idx()
896 kvm_io_bus_unregister_dev(kvm, bus_idx, &p->dev); in kvm_deassign_ioeventfd_idx()
897 bus = kvm_get_bus(kvm, bus_idx); in kvm_deassign_ioeventfd_idx()
905 mutex_unlock(&kvm->slots_lock); in kvm_deassign_ioeventfd_idx()
912 static int kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args) in kvm_deassign_ioeventfd() argument
915 int ret = kvm_deassign_ioeventfd_idx(kvm, bus_idx, args); in kvm_deassign_ioeventfd()
918 kvm_deassign_ioeventfd_idx(kvm, KVM_FAST_MMIO_BUS, args); in kvm_deassign_ioeventfd()
924 kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args) in kvm_assign_ioeventfd() argument
954 ret = kvm_assign_ioeventfd_idx(kvm, bus_idx, args); in kvm_assign_ioeventfd()
962 ret = kvm_assign_ioeventfd_idx(kvm, KVM_FAST_MMIO_BUS, args); in kvm_assign_ioeventfd()
970 kvm_deassign_ioeventfd_idx(kvm, bus_idx, args); in kvm_assign_ioeventfd()
976 kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args) in kvm_ioeventfd() argument
979 return kvm_deassign_ioeventfd(kvm, args); in kvm_ioeventfd()
981 return kvm_assign_ioeventfd(kvm, args); in kvm_ioeventfd()