e1000 emulation Interrupt handling on Linux KVM

qemu

cpu_exec -> cpu_init -> cpu_x86_init -> qemu_init_vcpu -> qemu_kvm_start_vcpu -> qemu_thread_create(qemu_kvm_cpu_thread_fn) -> kvm_cpu_exec -> kvm_vcpu_ioctl(KVM_RUN) -> ** block **

linux kernel

kvm_vcpu_ioctl -> kvm_arch_vcpu_ioctl_run -> __vcpu_run -> ** VMENTER ** -> ** guest mode ** -> ** HW INTR ** -> ** VMEXIT ** -> ** invoke intrhand ** -> e1000_intr -> __napi_schedule -> ** return from intr ** -> ** invoke softirq ** -> net_rx_action -> e1000_clean -> e1000_celan_rx_irq -> e1000_receive_skb -> napi_gro_receive -> dev_gro_receive -> napi_gro_complete -> netif_receive_skb -> __netif_receive_skb -> rx_handler -> br_handle_frame -> br_forward -> __br_forward -> br_deliver -> __br_deliver -> br_netpoll_send_skb -> netpoll_send_skb -> netpoll_send_skb_on_dev -> tun_net_xmit -> wake_up_interruptible_poll -> ** wake up ** -> tun_do_read -> ** return from syscall 'read' **

qemu

main -> main_loop -> main_loop_wait -> qemu_iohandler_poll -> tap_send -> tap_read_packet -> read -> **block ** -> qemu_send_packet_async(tap_send_completed) -> qemu_net_queue_send(tap_send_completed) ->qemu_net_queue_deliver -> queue->deliver -> qemu_deliver_packet -> vc->info->receive -> e1000_receive -> set_interrupt_cause -> qemu_set_irq -> irq->handler -> ... -> ioapic_set_irq -> ioapic_service -> apic_deliver_irq -> apic_bus_deliver -> apic_set_irq -> apic_update_irq -> cpu_interrupt -> kvm_handle_interrupt -> ... -> kvm_arch_pre_run -> kvm_vcpu_ioctl(KVM_INTERRUPT)

linux kernel

kvm_vcpu_ioctl -> kvm_arch_vcpu_ioctl -> kvm_vcpu_ioctl_interrupt -> kvm_queue_interrupt & kvm_make_request(KVM_REQ_EVENT)