Loading arch/arm64/configs/vendor/genericarmv8-64_defconfig +1 −0 Original line number Diff line number Diff line Loading @@ -275,6 +275,7 @@ CONFIG_HH_CTRL=y CONFIG_HH_MSGQ=y CONFIG_HH_RM_DRV=y CONFIG_HH_DBL=y CONFIG_HH_IRQ_LEND=y CONFIG_HH_MEM_NOTIFIER=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_BALLOON=y Loading arch/arm64/configs/vendor/lahaina_GKI.config +1 −0 Original line number Diff line number Diff line Loading @@ -204,3 +204,4 @@ CONFIG_SPS=m CONFIG_SPS_SUPPORT_NDP_BAM=y # CONFIG_SPS_SUPPORT_BAMDMA is not set # CONFIG_USB_BAM is not set CONFIG_HH_IRQ_LEND=m drivers/virt/haven/hh_irq_lend.c +15 −12 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ struct hh_irq_entry { hh_vmid_t vmid; enum hh_vm_names vm_name; hh_irq_handle_fn handle; void *data; Loading Loading @@ -80,12 +81,21 @@ static int hh_irq_lent_nb_handler(struct notifier_block *this, { unsigned long flags; enum hh_irq_label label; enum hh_vm_names owner_name; struct hh_irq_entry *entry; struct hh_rm_notif_vm_irq_lent_payload *lent = data; int ret; if (cmd != HH_RM_NOTIF_VM_IRQ_LENT) return NOTIFY_DONE; ret = hh_rm_get_vm_name(lent->owner_vmid, &owner_name); if (ret) { pr_warn_ratelimited("%s: unknown name for vmid: %d\n", __func__, lent->owner_vmid); return ret; } spin_lock_irqsave(&hh_irq_lend_lock, flags); for (label = 0; label < HH_IRQ_LABEL_MAX; label++) { entry = &hh_irq_entries[label]; Loading @@ -93,8 +103,8 @@ static int hh_irq_lent_nb_handler(struct notifier_block *this, continue; if (label == lent->virq_label && (entry->vmid == HH_VM_MAX || entry->vmid == lent->owner_vmid)) { (entry->vm_name == HH_VM_MAX || entry->vm_name == owner_name)) { entry->vmid = lent->owner_vmid; entry->virq_handle = lent->virq_handle; Loading Loading @@ -207,7 +217,6 @@ EXPORT_SYMBOL(hh_irq_reclaim); int hh_irq_wait_for_lend(enum hh_irq_label label, enum hh_vm_names name, hh_irq_handle_fn on_lend, void *data) { int ret; unsigned long flags; struct hh_irq_entry *entry; Loading @@ -222,19 +231,13 @@ int hh_irq_wait_for_lend(enum hh_irq_label label, enum hh_vm_names name, return -EINVAL; } ret = hh_rm_get_vmid(name, &entry->vmid); if (ret) { entry->state = HH_IRQ_STATE_NONE; spin_unlock_irqrestore(&hh_irq_lend_lock, flags); return ret; } entry->vm_name = name; entry->handle = on_lend; entry->data = data; entry->state = HH_IRQ_STATE_WAIT_LEND; spin_unlock_irqrestore(&hh_irq_lend_lock, flags); return ret; return 0; } EXPORT_SYMBOL(hh_irq_wait_for_lend); Loading Loading @@ -304,7 +307,7 @@ int hh_irq_release(enum hh_irq_label label) ret = hh_rm_vm_irq_release_notify(entry->vmid, entry->virq_handle); if (!ret) entry->state = HH_IRQ_STATE_NONE; entry->state = HH_IRQ_STATE_WAIT_LEND; return ret; } EXPORT_SYMBOL(hh_irq_release); Loading drivers/virt/haven/hh_rm_iface.c +5 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ int hh_rm_vm_irq_accept(hh_virq_handle_t virq_handle, int virq) kfree(resp_payload); return ret; } EXPORT_SYMBOL(hh_rm_vm_irq_accept); /** * hh_rm_vm_irq_lend: Lend an IRQ to another VM Loading Loading @@ -333,6 +334,7 @@ int hh_rm_vm_irq_lend_notify(hh_vmid_t vmid, int virq, int label, return hh_rm_vm_irq_notify(&vmid, 1, HH_VM_IRQ_NOTIFY_FLAGS_LENT, *virq_handle); } EXPORT_SYMBOL(hh_rm_vm_irq_lend_notify); /** * hh_rm_vm_irq_release: Return a lent IRQ Loading Loading @@ -371,6 +373,7 @@ static int hh_rm_vm_irq_release(hh_virq_handle_t virq_handle) return ret; } EXPORT_SYMBOL(hh_rm_vm_irq_release); /** * hh_rm_vm_irq_release_notify: Release IRQ back to a VM and notify that it has Loading @@ -389,6 +392,7 @@ int hh_rm_vm_irq_release_notify(hh_vmid_t vmid, hh_virq_handle_t virq_handle) return hh_rm_vm_irq_notify(NULL, 0, HH_VM_IRQ_NOTIFY_FLAGS_RELEASED, virq_handle); } EXPORT_SYMBOL(hh_rm_vm_irq_release_notify); /** * hh_rm_vm_irq_reclaim: Return a lent IRQ Loading Loading @@ -427,6 +431,7 @@ int hh_rm_vm_irq_reclaim(hh_virq_handle_t virq_handle) return ret; } EXPORT_SYMBOL(hh_rm_vm_irq_reclaim); /** * hh_rm_vm_alloc_vmid: Return a vmid associated with the vm loaded into Loading Loading
arch/arm64/configs/vendor/genericarmv8-64_defconfig +1 −0 Original line number Diff line number Diff line Loading @@ -275,6 +275,7 @@ CONFIG_HH_CTRL=y CONFIG_HH_MSGQ=y CONFIG_HH_RM_DRV=y CONFIG_HH_DBL=y CONFIG_HH_IRQ_LEND=y CONFIG_HH_MEM_NOTIFIER=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_BALLOON=y Loading
arch/arm64/configs/vendor/lahaina_GKI.config +1 −0 Original line number Diff line number Diff line Loading @@ -204,3 +204,4 @@ CONFIG_SPS=m CONFIG_SPS_SUPPORT_NDP_BAM=y # CONFIG_SPS_SUPPORT_BAMDMA is not set # CONFIG_USB_BAM is not set CONFIG_HH_IRQ_LEND=m
drivers/virt/haven/hh_irq_lend.c +15 −12 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ struct hh_irq_entry { hh_vmid_t vmid; enum hh_vm_names vm_name; hh_irq_handle_fn handle; void *data; Loading Loading @@ -80,12 +81,21 @@ static int hh_irq_lent_nb_handler(struct notifier_block *this, { unsigned long flags; enum hh_irq_label label; enum hh_vm_names owner_name; struct hh_irq_entry *entry; struct hh_rm_notif_vm_irq_lent_payload *lent = data; int ret; if (cmd != HH_RM_NOTIF_VM_IRQ_LENT) return NOTIFY_DONE; ret = hh_rm_get_vm_name(lent->owner_vmid, &owner_name); if (ret) { pr_warn_ratelimited("%s: unknown name for vmid: %d\n", __func__, lent->owner_vmid); return ret; } spin_lock_irqsave(&hh_irq_lend_lock, flags); for (label = 0; label < HH_IRQ_LABEL_MAX; label++) { entry = &hh_irq_entries[label]; Loading @@ -93,8 +103,8 @@ static int hh_irq_lent_nb_handler(struct notifier_block *this, continue; if (label == lent->virq_label && (entry->vmid == HH_VM_MAX || entry->vmid == lent->owner_vmid)) { (entry->vm_name == HH_VM_MAX || entry->vm_name == owner_name)) { entry->vmid = lent->owner_vmid; entry->virq_handle = lent->virq_handle; Loading Loading @@ -207,7 +217,6 @@ EXPORT_SYMBOL(hh_irq_reclaim); int hh_irq_wait_for_lend(enum hh_irq_label label, enum hh_vm_names name, hh_irq_handle_fn on_lend, void *data) { int ret; unsigned long flags; struct hh_irq_entry *entry; Loading @@ -222,19 +231,13 @@ int hh_irq_wait_for_lend(enum hh_irq_label label, enum hh_vm_names name, return -EINVAL; } ret = hh_rm_get_vmid(name, &entry->vmid); if (ret) { entry->state = HH_IRQ_STATE_NONE; spin_unlock_irqrestore(&hh_irq_lend_lock, flags); return ret; } entry->vm_name = name; entry->handle = on_lend; entry->data = data; entry->state = HH_IRQ_STATE_WAIT_LEND; spin_unlock_irqrestore(&hh_irq_lend_lock, flags); return ret; return 0; } EXPORT_SYMBOL(hh_irq_wait_for_lend); Loading Loading @@ -304,7 +307,7 @@ int hh_irq_release(enum hh_irq_label label) ret = hh_rm_vm_irq_release_notify(entry->vmid, entry->virq_handle); if (!ret) entry->state = HH_IRQ_STATE_NONE; entry->state = HH_IRQ_STATE_WAIT_LEND; return ret; } EXPORT_SYMBOL(hh_irq_release); Loading
drivers/virt/haven/hh_rm_iface.c +5 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ int hh_rm_vm_irq_accept(hh_virq_handle_t virq_handle, int virq) kfree(resp_payload); return ret; } EXPORT_SYMBOL(hh_rm_vm_irq_accept); /** * hh_rm_vm_irq_lend: Lend an IRQ to another VM Loading Loading @@ -333,6 +334,7 @@ int hh_rm_vm_irq_lend_notify(hh_vmid_t vmid, int virq, int label, return hh_rm_vm_irq_notify(&vmid, 1, HH_VM_IRQ_NOTIFY_FLAGS_LENT, *virq_handle); } EXPORT_SYMBOL(hh_rm_vm_irq_lend_notify); /** * hh_rm_vm_irq_release: Return a lent IRQ Loading Loading @@ -371,6 +373,7 @@ static int hh_rm_vm_irq_release(hh_virq_handle_t virq_handle) return ret; } EXPORT_SYMBOL(hh_rm_vm_irq_release); /** * hh_rm_vm_irq_release_notify: Release IRQ back to a VM and notify that it has Loading @@ -389,6 +392,7 @@ int hh_rm_vm_irq_release_notify(hh_vmid_t vmid, hh_virq_handle_t virq_handle) return hh_rm_vm_irq_notify(NULL, 0, HH_VM_IRQ_NOTIFY_FLAGS_RELEASED, virq_handle); } EXPORT_SYMBOL(hh_rm_vm_irq_release_notify); /** * hh_rm_vm_irq_reclaim: Return a lent IRQ Loading Loading @@ -427,6 +431,7 @@ int hh_rm_vm_irq_reclaim(hh_virq_handle_t virq_handle) return ret; } EXPORT_SYMBOL(hh_rm_vm_irq_reclaim); /** * hh_rm_vm_alloc_vmid: Return a vmid associated with the vm loaded into Loading