X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_vhost%2Feventfd_link%2Feventfd_link.c;h=62c45c8da0568267b29b39b633b1451eb08f08ef;hb=292959c71961acde0cda6e77e737bb0a4df1559c;hp=fc0653a27d739de85fc76789cbde70b69620cd9d;hpb=5c7a80aec366009214bd9f30a1fc7e3389fa93fb;p=dpdk.git diff --git a/lib/librte_vhost/eventfd_link/eventfd_link.c b/lib/librte_vhost/eventfd_link/eventfd_link.c index fc0653a27d..62c45c8da0 100644 --- a/lib/librte_vhost/eventfd_link/eventfd_link.c +++ b/lib/librte_vhost/eventfd_link/eventfd_link.c @@ -1,26 +1,26 @@ /*- - * * GPL LICENSE SUMMARY - * * - * * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. - * * - * * This program is free software; you can redistribute it and/or modify - * * it under the terms of version 2 of the GNU General Public License as - * * published by the Free Software Foundation. - * * - * * This program is distributed in the hope that it will be useful, but - * * WITHOUT ANY WARRANTY; without even the implied warranty of - * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * * General Public License for more details. - * * - * * You should have received a copy of the GNU General Public License - * * along with this program; if not, write to the Free Software - * * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - * * The full GNU General Public License is included in this distribution - * * in the file called LICENSE.GPL. - * * - * * Contact Information: - * * Intel Corporation - * */ + * GPL LICENSE SUMMARY + * + * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * The full GNU General Public License is included in this distribution + * in the file called LICENSE.GPL. + * + * Contact Information: + * Intel Corporation + */ #include #include @@ -42,15 +42,15 @@ * get_files_struct is copied from fs/file.c */ struct files_struct * -get_files_struct (struct task_struct *task) +get_files_struct(struct task_struct *task) { struct files_struct *files; - task_lock (task); + task_lock(task); files = task->files; if (files) - atomic_inc (&files->count); - task_unlock (task); + atomic_inc(&files->count); + task_unlock(task); return files; } @@ -59,17 +59,15 @@ get_files_struct (struct task_struct *task) * put_files_struct is extracted from fs/file.c */ void -put_files_struct (struct files_struct *files) +put_files_struct(struct files_struct *files) { - if (atomic_dec_and_test (&files->count)) - { - BUG (); - } + if (atomic_dec_and_test(&files->count)) + BUG(); } static long -eventfd_link_ioctl (struct file *f, unsigned int ioctl, unsigned long arg) +eventfd_link_ioctl(struct file *f, unsigned int ioctl, unsigned long arg) { void __user *argp = (void __user *) arg; struct task_struct *task_target = NULL; @@ -78,96 +76,89 @@ eventfd_link_ioctl (struct file *f, unsigned int ioctl, unsigned long arg) struct fdtable *fdt; struct eventfd_copy eventfd_copy; - switch (ioctl) - { - case EVENTFD_COPY: - if (copy_from_user (&eventfd_copy, argp, sizeof (struct eventfd_copy))) - return -EFAULT; - - /* - * Find the task struct for the target pid - */ - task_target = - pid_task (find_vpid (eventfd_copy.target_pid), PIDTYPE_PID); - if (task_target == NULL) - { - printk (KERN_DEBUG "Failed to get mem ctx for target pid\n"); - return -EFAULT; - } - - files = get_files_struct (current); - if (files == NULL) - { - printk (KERN_DEBUG "Failed to get files struct\n"); - return -EFAULT; - } - - rcu_read_lock (); - file = fcheck_files (files, eventfd_copy.source_fd); - if (file) - { - if (file->f_mode & FMODE_PATH - || !atomic_long_inc_not_zero (&file->f_count)) - file = NULL; - } - rcu_read_unlock (); - put_files_struct (files); - - if (file == NULL) - { - printk (KERN_DEBUG "Failed to get file from source pid\n"); - return 0; - } - - /* - * Release the existing eventfd in the source process - */ - spin_lock (&files->file_lock); - filp_close (file, files); - fdt = files_fdtable (files); - fdt->fd[eventfd_copy.source_fd] = NULL; - spin_unlock (&files->file_lock); - - /* - * Find the file struct associated with the target fd. - */ - - files = get_files_struct (task_target); - if (files == NULL) - { - printk (KERN_DEBUG "Failed to get files struct\n"); - return -EFAULT; - } - - rcu_read_lock (); - file = fcheck_files (files, eventfd_copy.target_fd); - if (file) - { - if (file->f_mode & FMODE_PATH - || !atomic_long_inc_not_zero (&file->f_count)) + switch (ioctl) { + case EVENTFD_COPY: + if (copy_from_user(&eventfd_copy, argp, + sizeof(struct eventfd_copy))) + return -EFAULT; + + /* + * Find the task struct for the target pid + */ + task_target = + pid_task(find_vpid(eventfd_copy.target_pid), PIDTYPE_PID); + if (task_target == NULL) { + pr_debug("Failed to get mem ctx for target pid\n"); + return -EFAULT; + } + + files = get_files_struct(current); + if (files == NULL) { + pr_debug("Failed to get files struct\n"); + return -EFAULT; + } + + rcu_read_lock(); + file = fcheck_files(files, eventfd_copy.source_fd); + if (file) { + if (file->f_mode & FMODE_PATH || + !atomic_long_inc_not_zero(&file->f_count)) + file = NULL; + } + rcu_read_unlock(); + put_files_struct(files); + + if (file == NULL) { + pr_debug("Failed to get file from source pid\n"); + return 0; + } + + /* + * Release the existing eventfd in the source process + */ + spin_lock(&files->file_lock); + fput(file); + filp_close(file, files); + fdt = files_fdtable(files); + fdt->fd[eventfd_copy.source_fd] = NULL; + spin_unlock(&files->file_lock); + + /* + * Find the file struct associated with the target fd. + */ + + files = get_files_struct(task_target); + if (files == NULL) { + pr_debug("Failed to get files struct\n"); + return -EFAULT; + } + + rcu_read_lock(); + file = fcheck_files(files, eventfd_copy.target_fd); + if (file) { + if (file->f_mode & FMODE_PATH || + !atomic_long_inc_not_zero(&file->f_count)) file = NULL; - } - rcu_read_unlock (); - put_files_struct (files); - - if (file == NULL) - { - printk (KERN_DEBUG "Failed to get file from target pid\n"); - return 0; - } + } + rcu_read_unlock(); + put_files_struct(files); + if (file == NULL) { + pr_debug("Failed to get file from target pid\n"); + return 0; + } - /* - * Install the file struct from the target process into the - * file desciptor of the source process, - */ + /* + * Install the file struct from the target process into the + * file desciptor of the source process, + */ - fd_install (eventfd_copy.source_fd, file); + fd_install(eventfd_copy.source_fd, file); - return 0; + return 0; - default: - return -ENOIOCTLCMD; + default: + return -ENOIOCTLCMD; } } @@ -183,23 +174,23 @@ static struct miscdevice eventfd_link_misc = { }; static int __init -eventfd_link_init (void) +eventfd_link_init(void) { - return misc_register (&eventfd_link_misc); + return misc_register(&eventfd_link_misc); } -module_init (eventfd_link_init); +module_init(eventfd_link_init); static void __exit -eventfd_link_exit (void) +eventfd_link_exit(void) { - misc_deregister (&eventfd_link_misc); + misc_deregister(&eventfd_link_misc); } -module_exit (eventfd_link_exit); +module_exit(eventfd_link_exit); -MODULE_VERSION ("0.0.1"); -MODULE_LICENSE ("GPL v2"); -MODULE_AUTHOR ("Anthony Fee"); -MODULE_DESCRIPTION ("Link eventfd"); -MODULE_ALIAS ("devname:eventfd-link"); +MODULE_VERSION("0.0.1"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Anthony Fee"); +MODULE_DESCRIPTION("Link eventfd"); +MODULE_ALIAS("devname:eventfd-link");