LCOV - code coverage report
Current view: top level - include/linux - eventpoll.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-achx @ Mon Jul 31 20:08:12 PDT 2023 Lines: 5 5 100.0 %
Date: 2023-07-31 20:08:12 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2             : /*
       3             :  *  include/linux/eventpoll.h ( Efficient event polling implementation )
       4             :  *  Copyright (C) 2001,...,2006  Davide Libenzi
       5             :  *
       6             :  *  Davide Libenzi <davidel@xmailserver.org>
       7             :  */
       8             : #ifndef _LINUX_EVENTPOLL_H
       9             : #define _LINUX_EVENTPOLL_H
      10             : 
      11             : #include <uapi/linux/eventpoll.h>
      12             : #include <uapi/linux/kcmp.h>
      13             : 
      14             : 
      15             : /* Forward declarations to avoid compiler errors */
      16             : struct file;
      17             : 
      18             : 
      19             : #ifdef CONFIG_EPOLL
      20             : 
      21             : #ifdef CONFIG_KCMP
      22             : struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd, unsigned long toff);
      23             : #endif
      24             : 
      25             : /* Used to release the epoll bits inside the "struct file" */
      26             : void eventpoll_release_file(struct file *file);
      27             : 
      28             : /*
      29             :  * This is called from inside fs/file_table.c:__fput() to unlink files
      30             :  * from the eventpoll interface. We need to have this facility to cleanup
      31             :  * correctly files that are closed without being removed from the eventpoll
      32             :  * interface.
      33             :  */
      34             : static inline void eventpoll_release(struct file *file)
      35             : {
      36             : 
      37             :         /*
      38             :          * Fast check to avoid the get/release of the semaphore. Since
      39             :          * we're doing this outside the semaphore lock, it might return
      40             :          * false negatives, but we don't care. It'll help in 99.99% of cases
      41             :          * to avoid the semaphore lock. False positives simply cannot happen
      42             :          * because the file in on the way to be removed and nobody ( but
      43             :          * eventpoll ) has still a reference to this file.
      44             :          */
      45  1595158471 :         if (likely(!file->f_ep))
      46             :                 return;
      47             : 
      48             :         /*
      49             :          * The file is being closed while it is still linked to an epoll
      50             :          * descriptor. We need to handle this by correctly unlinking it
      51             :          * from its containers.
      52             :          */
      53      127350 :         eventpoll_release_file(file);
      54             : }
      55             : 
      56             : int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
      57             :                  bool nonblock);
      58             : 
      59             : /* Tells if the epoll_ctl(2) operation needs an event copy from userspace */
      60             : static inline int ep_op_has_event(int op)
      61             : {
      62             :         return op != EPOLL_CTL_DEL;
      63             : }
      64             : 
      65             : #else
      66             : 
      67             : static inline void eventpoll_release(struct file *file) {}
      68             : 
      69             : #endif
      70             : 
      71             : #if defined(CONFIG_ARM) && defined(CONFIG_OABI_COMPAT)
      72             : /* ARM OABI has an incompatible struct layout and needs a special handler */
      73             : extern struct epoll_event __user *
      74             : epoll_put_uevent(__poll_t revents, __u64 data,
      75             :                  struct epoll_event __user *uevent);
      76             : #else
      77             : static inline struct epoll_event __user *
      78             : epoll_put_uevent(__poll_t revents, __u64 data,
      79             :                  struct epoll_event __user *uevent)
      80             : {
      81   234399898 :         if (__put_user(revents, &uevent->events) ||
      82   234425861 :             __put_user(data, &uevent->data))
      83             :                 return NULL;
      84             : 
      85   234480608 :         return uevent+1;
      86             : }
      87             : #endif
      88             : 
      89             : #endif /* #ifndef _LINUX_EVENTPOLL_H */

Generated by: LCOV version 1.14