hi, all:
I create a vm with six nic, after the vm start, i delete tree nics.
all the three nic delete logic will happen in a thread , every nic delete has the
following process:
int vnf_control_del_network(void *arg)
{
。。。。。
call_id = virConnectDomainEventRegisterAny(conn, dom, VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED,
VIR_DOMAIN_EVENT_CALLBACK(vnf_control_del_network_cb), cb_para,
vnf_control_del_network_cb_free);
flags |= VIR_DOMAIN_AFFECT_CONFIG;
if (virDomainIsActive(dom) == 1) {
flags |= VIR_DOMAIN_AFFECT_LIVE;
}
ret = virDomainDetachDeviceFlags(dom, xml, flags); // detach a nic from vm guest os
。。。。
}
void vnf_control_del_network_cb(virConnectPtr conn, virDomainPtr dom, const char
*dev,void * opaque) //this callback can't already trigger to run ,why ?
{
struct vnf_del_netwk_opaque * arg = (struct vnf_del_netwk_opaque *)opaque;
........ do someing;
if(0 == virConnectDomainEventDeregisterAny(conn, arg->call_id))
printf("succ to deRegister, conn:%p, call id:%d\n", conn,
arg->call_id);
else
printf("fail to deRegister, conn:%p, call id:%d\n", conn, arg->call_id)
}
void* vnf_worker_proc(void *arg)
{
vnf_mission_t *mission = NULL;
pthread_t tid = pthread_self();
vnf_task_ctx_t *task = vnf_task_get_task_info(tid);
assert(task);
pthread_detach(tid);
while (1) {
mission = vnf_mission_queue_get(task);
if (mission == NULL) {
sleep(1);
continue;
}
VNF_IMAGE_DBG("tid:%lu, get one mission from mission queue\n", tid);
vnf_op_process(&mission->info); //this cause vnf_control_del_network
called
if (mission) {
vnf_mission_free(mission);
}
if(virEventRunDefaultImpl() < 0) {
VNF_IMAGE_DBG("virEventRunDefaultImpl() called failure\n");
}
}
return NULL;
}
Show replies by date