(1)kvm_irqfd_init():为eventfd创建一个全局的工作队列,它用于在虚拟机被关闭时,关闭所有与其相关的irqfd,并等待该操作完成 (2)kmem_cache_create_usercopy()和kvm_async_pf_init()用于创建特定的slab (3)kvm_init_debug()用于为kvm创建debugfs相关接口 (4)kvm_vfio_ops_init()用于为vfio注册设备回调函数 3...
kvm_irqfd_assign: 1)分配struct kvm_kernel_irqfd结构体,并进行各个字段的初始化; 2)初始化工作队列任务,设置成irqfd_inject,用于向Guest OS注入虚拟中断; 3)初始化等待队列的唤醒函数,设置成irqfd_wakeup,当任务被唤醒时执行,在该函数中会去调度工作任务irqfd_inject; 4)初始化pll_table pt字段的处理函数,设置...
vcpu_size, vcpu_align,SLAB_ACCOUNT,offsetof(struct kvm_vcpu, arch),offsetofend(struct kvm_vcpu, stats_id)- offsetof(struct kvm_vcpu, arch),NULL);...r = kvm_irqfd_init;if(r)gotoerr_irqfd;
kvm_kernel_irqfd结构中有2个work_struct,inject和shutdown,分别负责触发中断和关闭中断,这两个work_struct各自对应的操作函数分别为irqfd_inject和irqfd_shutdown。kvm_irq_assign调用init_waitqueue_func_entry将irqfd_wakeup函数注册为irqfd中等待队列entry激活时的处理函数。这样任何写入该irqfd对应的eventfd的行为都将...
===》kvm_irqfd_init ===》kvm_arch_hardware_setup ===》kvm_arch_check_processor_compat ===》misc_register(&kvm_dev) // 创建字符设备文件/dev/kvm misc_register函数是linux内核的一个通用接口,主要作用是为了注册设备文件,kvm模块借用该接口创建了/dev/kvm设备文件,下面是设备文件的描述结构: ...
irqfd:提供一种机制,可以通过文件描述fd来向Guest注入中断,路径为紫色线条所示; ioeventfd:提供一种机制,可以通过文件描述符fd来接收Guest的信号,路径为红色线条所示; eventfd和irqfd这两种机制,都是基于eventfd来实现的; 本文会先介绍eventfd机制,然后再分别从Qemu/KVM来介绍ioeventfd和irqfd,开始吧。 2. eventfd 说...
第三阶段首先设置了irqfd中等待对象的唤醒函数irqfd_wakeup,然后用init_poll_funcptr对irqfd中的poll_table进行初始化,主要是绑定一个排队函数irqfd_ptable_queue_proc,其实这两步也可以看做是准备工作的一部分,不过由于第二部分的存在,只能安排在第三部分。接下来遍历KVM结构中的irqfd链表,检查是否有irqfd已经绑定了...
===》kvm_irqfd_init ===》kvm_arch_hardware_setup ===》kvm_arch_check_processor_compat ===》misc_register(&kvm_dev) // 创建字符设备文件/dev/kvm misc_register函数是linux内核的一个通用接口,主要作用是为了注册设备文件,kvm模块借用该接口创建了/dev/kvm设备文件,下面是设备文件的描述结构: ...
irqfd是基于eventfd的机制来实现的,用于用户态与内核态,以及内核态之间的事件通知; 事件源可以是虚拟设备,比如VFIO框架等,这个模块还没有去深入了解过,不敢妄言,后续系列会跟进; 软件流程如下图: 初始化的操作包括两部分:1)设置Routing entry(【a】vgic_init初始化的时候创建默认的entry;【b】:用户层通过KVM_SET...
irqfd是基于eventfd的机制来实现的,用于用户态与内核态,以及内核态之间的事件通知; 事件源可以是虚拟设备,比如VFIO框架等,这个模块还没有去深入了解过,不敢妄言,后续系列会跟进; 软件流程如下图: 初始化的操作包括两部分:1)设置Routing entry(【a】vgic_init初始化的时候创建默认的entry;【b】:用户层通过KVM_SET...