vhost: use new eventfd copy
authorPavel Boldin <pboldin@mirantis.com>
Wed, 28 Oct 2015 18:33:49 +0000 (20:33 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 30 Oct 2015 19:06:51 +0000 (20:06 +0100)
Signed-off-by: Pavel Boldin <pboldin@mirantis.com>
Acked-by: Huawei Xie <huawei.xie@intel.com>
lib/librte_vhost/vhost_cuse/eventfd_copy.c
lib/librte_vhost/vhost_cuse/eventfd_copy.h
lib/librte_vhost/vhost_cuse/vhost-net-cdev.c

index 4d697a2..154b32a 100644 (file)
 
 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;
 }
index 19ae30d..5f446ca 100644 (file)
 #ifndef _EVENTFD_H
 #define _EVENTFD_H
 
+int
+eventfd_init(void);
+
+int
+eventfd_free(void);
+
 int
 eventfd_copy(int target_fd, int target_pid);
 
index 1ae7c49..ae7ad8d 100644 (file)
@@ -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.