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