diff --git a/tools/kvm/disk/core.c b/tools/kvm/disk/core.c
index b313b28..dd59751 100644
--- a/tools/kvm/disk/core.c
+++ b/tools/kvm/disk/core.c
@@ -63,6 +63,8 @@ static void *disk_image__thread(void *param)
 	int nr, i;
 	u64 dummy;
 
+	kvm__set_thread_name("disk-image-io");
+
 	while (read(disk->evt, &dummy, sizeof(dummy)) > 0) {
 		nr = io_getevents(disk->ctx, 1, ARRAY_SIZE(event), event, &notime);
 		for (i = 0; i < nr; i++)
diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h
index b460656..1c7fab7 100644
--- a/tools/kvm/include/kvm/kvm.h
+++ b/tools/kvm/include/kvm/kvm.h
@@ -10,6 +10,7 @@
 #include <linux/types.h>
 #include <time.h>
 #include <signal.h>
+#include <sys/prctl.h>
 
 #define SIGKVMEXIT		(SIGRTMIN + 0)
 #define SIGKVMPAUSE		(SIGRTMIN + 1)
@@ -118,4 +119,10 @@ static inline void *guest_flat_to_host(struct kvm *kvm, unsigned long offset)
 
 bool kvm__supports_extension(struct kvm *kvm, unsigned int extension);
 
+static inline void kvm__set_thread_name(const char *name)
+{
+	prctl(PR_SET_NAME, name);
+}
+
 #endif /* KVM__KVM_H */
+
diff --git a/tools/kvm/ioeventfd.c b/tools/kvm/ioeventfd.c
index a68d8d0..ff665d4 100644
--- a/tools/kvm/ioeventfd.c
+++ b/tools/kvm/ioeventfd.c
@@ -24,6 +24,8 @@ static void *ioeventfd__thread(void *param)
 {
 	u64 tmp = 1;
 
+	kvm__set_thread_name("ioeventfd-worker");
+
 	for (;;) {
 		int nfds, i;
 
diff --git a/tools/kvm/kvm-ipc.c b/tools/kvm/kvm-ipc.c
index d23edd2..bdcc0d1 100644
--- a/tools/kvm/kvm-ipc.c
+++ b/tools/kvm/kvm-ipc.c
@@ -260,6 +260,8 @@ static void *kvm_ipc__thread(void *param)
 	struct epoll_event event;
 	struct kvm *kvm = param;
 
+	kvm__set_thread_name("kvm-ipc");
+
 	for (;;) {
 		int nfds;
 
diff --git a/tools/kvm/net/uip/tcp.c b/tools/kvm/net/uip/tcp.c
index 711a716..830aa3f 100644
--- a/tools/kvm/net/uip/tcp.c
+++ b/tools/kvm/net/uip/tcp.c
@@ -1,5 +1,6 @@
 #include "kvm/uip.h"
 
+#include <kvm/kvm.h>
 #include <linux/virtio_net.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
@@ -176,6 +177,8 @@ static void *uip_tcp_socket_thread(void *p)
 	int len, left, ret;
 	u8 *payload, *pos;
 
+	kvm__set_thread_name("uip-tcp");
+
 	sk = p;
 
 	payload = malloc(UIP_MAX_TCP_PAYLOAD);
diff --git a/tools/kvm/net/uip/udp.c b/tools/kvm/net/uip/udp.c
index d4518b2..5b6ec1c 100644
--- a/tools/kvm/net/uip/udp.c
+++ b/tools/kvm/net/uip/udp.c
@@ -1,5 +1,6 @@
 #include "kvm/uip.h"
 
+#include <kvm/kvm.h>
 #include <linux/virtio_net.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
@@ -160,6 +161,8 @@ static void *uip_udp_socket_thread(void *p)
 	int nfds;
 	int i;
 
+	kvm__set_thread_name("uip-udp");
+
 	info = p;
 
 	do {
diff --git a/tools/kvm/ui/sdl.c b/tools/kvm/ui/sdl.c
index 172a12b..9994490 100644
--- a/tools/kvm/ui/sdl.c
+++ b/tools/kvm/ui/sdl.c
@@ -206,6 +206,8 @@ static void *sdl__thread(void *p)
 	SDL_Event ev;
 	Uint32 flags;
 
+	kvm__set_thread_name("kvm-sdl-worker");
+
 	if (SDL_Init(SDL_INIT_VIDEO) != 0)
 		die("Unable to initialize SDL");
 
diff --git a/tools/kvm/ui/vnc.c b/tools/kvm/ui/vnc.c
index efdc0f4..12e4bd5 100644
--- a/tools/kvm/ui/vnc.c
+++ b/tools/kvm/ui/vnc.c
@@ -185,6 +185,8 @@ static void *vnc__thread(void *p)
 	char argv[1][1] = {{0}};
 	int argc = 1;
 
+	kvm__set_thread_name("kvm-vnc-worker");
+
 	server = rfbGetScreen(&argc, (char **) argv, fb->width, fb->height, 8, 3, 4);
 	server->frameBuffer		= fb->mem;
 	server->alwaysShared		= TRUE;
diff --git a/tools/kvm/util/threadpool.c b/tools/kvm/util/threadpool.c
index 85ac7e7..a363831 100644
--- a/tools/kvm/util/threadpool.c
+++ b/tools/kvm/util/threadpool.c
@@ -78,6 +78,8 @@ 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;
 
diff --git a/tools/kvm/virtio/blk.c b/tools/kvm/virtio/blk.c
index cff38aa..f76342c 100644
--- a/tools/kvm/virtio/blk.c
+++ b/tools/kvm/virtio/blk.c
@@ -179,6 +179,8 @@ static void *virtio_blk_thread(void *dev)
 	u64 data;
 	int r;
 
+	kvm__set_thread_name("virtio-blk-io");
+
 	while (1) {
 		r = read(bdev->io_efd, &data, sizeof(u64));
 		if (r < 0)
diff --git a/tools/kvm/virtio/net.c b/tools/kvm/virtio/net.c
index d6d344a..ac429cc 100644
--- a/tools/kvm/virtio/net.c
+++ b/tools/kvm/virtio/net.c
@@ -79,6 +79,8 @@ static void *virtio_net_rx_thread(void *p)
 	u16 head;
 	int len;
 
+	kvm__set_thread_name("virtio-net-rx");
+
 	kvm = ndev->kvm;
 	vq = &ndev->vqs[VIRTIO_NET_RX_QUEUE];
 
@@ -115,6 +117,8 @@ static void *virtio_net_tx_thread(void *p)
 	u16 head;
 	int len;
 
+	kvm__set_thread_name("virtio-net-tx");
+
 	kvm = ndev->kvm;
 	vq = &ndev->vqs[VIRTIO_NET_TX_QUEUE];
 
