From 40e8552e32569116cc1b119287a3e308ef00a6d8 Mon Sep 17 00:00:00 2001 From: Pavel Boldin Date: Wed, 28 Oct 2015 20:33:49 +0200 Subject: [PATCH] vhost: use new eventfd copy Signed-off-by: Pavel Boldin Acked-by: Huawei Xie --- lib/librte_vhost/vhost_cuse/eventfd_copy.c | 54 +++++++++++++------- lib/librte_vhost/vhost_cuse/eventfd_copy.h | 6 +++ lib/librte_vhost/vhost_cuse/vhost-net-cdev.c | 3 ++ 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/lib/librte_vhost/vhost_cuse/eventfd_copy.c b/lib/librte_vhost/vhost_cuse/eventfd_copy.c index 4d697a2739..154b32a44e 100644 --- a/lib/librte_vhost/vhost_cuse/eventfd_copy.c +++ b/lib/librte_vhost/vhost_cuse/eventfd_copy.c @@ -46,6 +46,32 @@ static const char eventfd_cdev[] = "/dev/eventfd-link"; +static int eventfd_link = -1; + +int +eventfd_init(void) +{ + if (eventfd_link >= 0) + return 0; + + eventfd_link = open(eventfd_cdev, O_RDWR); + if (eventfd_link < 0) { + RTE_LOG(ERR, VHOST_CONFIG, + "eventfd_link module is not loaded\n"); + return -1; + } + + return 0; +} + +int +eventfd_free(void) +{ + if (eventfd_link >= 0) + close(eventfd_link); + return 0; +} + /* * This function uses the eventfd_link kernel module to copy an eventfd file * descriptor provided by QEMU in to our process space. @@ -53,36 +79,26 @@ static const char eventfd_cdev[] = "/dev/eventfd-link"; int eventfd_copy(int target_fd, int target_pid) { - int eventfd_link, ret; - struct eventfd_copy eventfd_copy; - int fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); + int ret; + struct eventfd_copy2 eventfd_copy2; - if (fd == -1) - return -1; /* Open the character device to the kernel module. */ /* TODO: check this earlier rather than fail until VM boots! */ - eventfd_link = open(eventfd_cdev, O_RDWR); - if (eventfd_link < 0) { - RTE_LOG(ERR, VHOST_CONFIG, - "eventfd_link module is not loaded\n"); - close(fd); + if (eventfd_init() < 0) return -1; - } - eventfd_copy.source_fd = fd; - eventfd_copy.target_fd = target_fd; - eventfd_copy.target_pid = target_pid; + eventfd_copy2.fd = target_fd; + eventfd_copy2.pid = target_pid; + eventfd_copy2.flags = O_NONBLOCK | O_CLOEXEC; /* Call the IOCTL to copy the eventfd. */ - ret = ioctl(eventfd_link, EVENTFD_COPY, &eventfd_copy); - close(eventfd_link); + ret = ioctl(eventfd_link, EVENTFD_COPY2, &eventfd_copy2); if (ret < 0) { RTE_LOG(ERR, VHOST_CONFIG, - "EVENTFD_COPY ioctl failed\n"); - close(fd); + "EVENTFD_COPY2 ioctl failed\n"); return -1; } - return fd; + return ret; } diff --git a/lib/librte_vhost/vhost_cuse/eventfd_copy.h b/lib/librte_vhost/vhost_cuse/eventfd_copy.h index 19ae30ddb8..5f446ca01e 100644 --- a/lib/librte_vhost/vhost_cuse/eventfd_copy.h +++ b/lib/librte_vhost/vhost_cuse/eventfd_copy.h @@ -33,6 +33,12 @@ #ifndef _EVENTFD_H #define _EVENTFD_H +int +eventfd_init(void); + +int +eventfd_free(void); + int eventfd_copy(int target_fd, int target_pid); diff --git a/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c b/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c index 1ae7c490a2..ae7ad8df7f 100644 --- a/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c +++ b/lib/librte_vhost/vhost_cuse/vhost-net-cdev.c @@ -373,6 +373,9 @@ rte_vhost_driver_register(const char *dev_name) return -1; } + if (eventfd_init() < 0) + return -1; + /* * The device name is created. This is passed to QEMU so that it can * register the device with our application. -- 2.20.1