static void *kvm_cpu_thread(void *arg) { char name[16]; current_kvm_cpu = arg; sprintf(name, "kvm-vcpu-%lu", current_kvm_cpu->cpu_id); kvm__set_thread_name(name); if (kvm_cpu__start(current_kvm_cpu)) goto panic_kvm; return (void *) (intptr_t) 0; panic_kvm: fprintf(stderr, "KVM exit reason: %u (\"%s\")\n", current_kvm_cpu->kvm_run->exit_reason, kvm_exit_reasons[current_kvm_cpu->kvm_run->exit_reason]); if (current_kvm_cpu->kvm_run->exit_reason == KVM_EXIT_UNKNOWN) fprintf(stderr, "KVM exit code: 0x%llu\n", (unsigned long long)current_kvm_cpu->kvm_run->hw.hardware_exit_reason); kvm_cpu__set_debug_fd(STDOUT_FILENO); kvm_cpu__show_registers(current_kvm_cpu); kvm_cpu__show_code(current_kvm_cpu); kvm_cpu__show_page_tables(current_kvm_cpu); return (void *) (intptr_t) 1; }
static void *uip_udp_socket_thread(void *p) { struct epoll_event events[UIP_UDP_MAX_EVENTS]; struct uip_udp_socket *sk; struct uip_info *info; struct uip_buf *buf; int payload_len; u8 *payload; int nfds; int i; kvm__set_thread_name("uip-udp"); info = p; do { payload = malloc(UIP_MAX_UDP_PAYLOAD); } while (!payload); while (1) { nfds = epoll_wait(info->udp_epollfd, events, UIP_UDP_MAX_EVENTS, -1); if (nfds == -1) continue; for (i = 0; i < nfds; i++) { sk = events[i].data.ptr; payload_len = recvfrom(sk->fd, payload, UIP_MAX_UDP_PAYLOAD, 0, NULL, NULL); if (payload_len < 0) continue; /* * Get free buffer to send data to guest */ buf = uip_buf_get_free(info); uip_udp_make_pkg(info, sk, buf, payload, payload_len); /* * Send data received from socket to guest */ uip_buf_set_used(info, buf); } } free(payload); pthread_exit(NULL); return NULL; }
static void *thread_pool__threadfunc(void *param) { pthread_cleanup_push(thread_pool__threadfunc_cleanup, NULL); kvm__set_thread_name("threadpool-worker"); while (running) { struct thread_pool__job *curjob = NULL; mutex_lock(&job_mutex); while (running && (curjob = thread_pool__job_pop_locked()) == NULL) pthread_cond_wait(&job_cond, &job_mutex.mutex); mutex_unlock(&job_mutex); if (running) thread_pool__handle_job(curjob); } pthread_cleanup_pop(0); return NULL; }