sparse irq
中断分配流程
19) | vfio_pci_set_msi_trigger [vfio_pci]() {
19) | pci_enable_msi_range() {
19) 0.841 us | pci_msi_supported();
19) | pci_msi_vec_count() {
19) | msi_capability_init() {
19) | msi_setup_entry() {
19) | arch_msi_mask_irq() {
19) 0.039 us | default_msi_mask_irq();
19) | arch_setup_msi_irqs() {
19) | irq_remapping_setup_msi_irqs() {
19) | irq_alloc_hwirqs() {
19) | __irq_alloc_descs() {
19) | arch_setup_hwirq() {
19) | __assign_irq_vector() {
19) | irq_modify_status() {
19) | intel_msi_alloc_irq() {
19) | alloc_irte() {
19) | setup_msi_irq() {
19) | assign_irq_vector() {
19) | __assign_irq_vector() {
19) | compose_remapped_msi_msg() {
19) | intel_compose_msi_msg() {
19) 0.031 us | prepare_irte();
19) | modify_irte() {
19) | setup_remapped_irq() {
19) | __irq_set_handler() {
19) | pci_intx() {
19) 0.027 us | pcibios_free_irq();
19) | irq_bypass_register_producer [irqbypass]() {
19) | __connect [irqbypass]() {
19) 0.029 us | kvm_arch_irq_bypass_stop [kvm]();
19) | kvm_arch_irq_bypass_add_producer [kvm]() {
19) | vmx_update_pi_irte [kvm_intel]() {
19) 0.030 us | kvm_arch_has_assigned_device [kvm]();
19) 0.028 us | irq_remapping_cap();
19) 0.028 us | kvm_arch_irq_bypass_start [kvm]();
4) | vfio_pci_set_msi_trigger [vfio_pci]() {
4) | vfio_msi_disable [vfio_pci]() {
4) | virqfd_disable [vfio_pci]() {
4) | vfio_msi_set_block [vfio_pci]() {
4) | vfio_msi_set_vector_signal [vfio_pci]() {
4) | free_irq() {
4) 0.134 us | irq_to_desc();
4) | __free_irq() {
4) | irq_shutdown() {
4) | unregister_handler_proc() {
4) | irq_bypass_unregister_producer [irqbypass]() {
4) | __disconnect [irqbypass]() {
4) 0.029 us | kvm_arch_irq_bypass_stop [kvm]();
4) | kvm_arch_irq_bypass_del_producer [kvm]() {
4) | vmx_update_pi_irte [kvm_intel]() {
4) 0.028 us | kvm_arch_has_assigned_device [kvm]();
4) 0.040 us | irq_remapping_cap();
4) 0.028 us | kvm_arch_irq_bypass_start [kvm]();
4) | pci_disable_msi() {
4) | pci_msi_shutdown() {
4) | pci_intx() {
4) | arch_msi_mask_irq() {
4) 0.038 us | default_msi_mask_irq();
4) 0.028 us | pcibios_alloc_irq();
4) | free_msi_irqs() {
4) | arch_teardown_msi_irqs() {
4) | default_teardown_msi_irqs() {
4) | arch_teardown_msi_irq() {
4) | native_teardown_msi_irq() {
4) | irq_free_hwirqs() {
4) | irq_modify_status() {
4) | arch_teardown_hwirq() {
4) | free_remapped_irq() {
4) | free_irte() {
Radix trees介绍
https://lwn.net/Articles/175432/
动态分配irq_desc,这里的Radix trees实质有点像页表,与数组比有两个优点:
- 动态扩展
- 对于不连续情况,中间空间无需分配