总结,notifiers for Pre-copy 和 Post-copy 主要是 virtio 和 vhost 在用,可以先不看。

Notifiers for Pre-copy

precopy_notifier_list / QEMU

这是一个全局的变量,专为 precopy 设计:

static NotifierWithReturnList precopy_notifier_list;

precopy_infrastructure_init() 负责初始化(不重要):

main
    qemu_init
        qemu_init_subsystems
            precopy_infrastructure_init
                notifier_with_return_list_init
                    QLIST_INIT(&list->notifiers);

precopy_add_notifier() 负责添加 callback 函数,目前看来只有 virtio 相关的 code 调用了这个函数来加 notifier,暂时先不看:

precopy_add_notifier
    notifier_with_return_list_add
        QLIST_INSERT_HEAD(&list->notifiers, notifier, node);

precopy_notify() 负责进行通知:

precopy_notify
    notifier_with_return_list_notify^

Notifiers for Post-copy

postcopy_notifier_list / QEMU

这是一个全局的变量,专为 postcopy 设计:

static NotifierWithReturnList postcopy_notifier_list;

postcopy_infrastructure_init() 负责初始化(和 Pre-copy 其实是一样的):

main
    qemu_init
        qemu_init_subsystems
            postcopy_infrastructure_init
                notifier_with_return_list_init
                    QLIST_INIT(&list->notifiers);

postcopy_add_notifier() 负责添加 callback 函数(目前是 vhost 在用,先不管):

postcopy_add_notifier
    notifier_with_return_list_add
        QLIST_INSERT_HEAD(&list->notifiers, notifier, node);

postcopy_notify() 负责进行通知:

postcopy_notify
    notifier_with_return_list_notify^