.. | .. |
---|
8 | 8 | #define PIPE_BUF_FLAG_ATOMIC 0x02 /* was atomically mapped */ |
---|
9 | 9 | #define PIPE_BUF_FLAG_GIFT 0x04 /* page is a gift */ |
---|
10 | 10 | #define PIPE_BUF_FLAG_PACKET 0x08 /* read() as a packet */ |
---|
| 11 | +#define PIPE_BUF_FLAG_CAN_MERGE 0x10 /* can merge buffers */ |
---|
| 12 | +#define PIPE_BUF_FLAG_WHOLE 0x20 /* read() must return entire buffer or error */ |
---|
| 13 | +#ifdef CONFIG_WATCH_QUEUE |
---|
| 14 | +#define PIPE_BUF_FLAG_LOSS 0x40 /* Message loss happened after this buffer */ |
---|
| 15 | +#endif |
---|
11 | 16 | |
---|
12 | 17 | /** |
---|
13 | 18 | * struct pipe_buffer - a linux kernel pipe buffer |
---|
.. | .. |
---|
29 | 34 | /** |
---|
30 | 35 | * struct pipe_inode_info - a linux kernel pipe |
---|
31 | 36 | * @mutex: mutex protecting the whole thing |
---|
32 | | - * @wait: reader/writer wait point in case of empty/full pipe |
---|
33 | | - * @nrbufs: the number of non-empty pipe buffers in this pipe |
---|
34 | | - * @buffers: total number of buffers (should be a power of 2) |
---|
35 | | - * @curbuf: the current pipe buffer entry |
---|
| 37 | + * @rd_wait: reader wait point in case of empty pipe |
---|
| 38 | + * @wr_wait: writer wait point in case of full pipe |
---|
| 39 | + * @head: The point of buffer production |
---|
| 40 | + * @tail: The point of buffer consumption |
---|
| 41 | + * @note_loss: The next read() should insert a data-lost message |
---|
| 42 | + * @max_usage: The maximum number of slots that may be used in the ring |
---|
| 43 | + * @ring_size: total number of buffers (should be a power of 2) |
---|
| 44 | + * @nr_accounted: The amount this pipe accounts for in user->pipe_bufs |
---|
36 | 45 | * @tmp_page: cached released page |
---|
37 | 46 | * @readers: number of current readers of this pipe |
---|
38 | 47 | * @writers: number of current writers of this pipe |
---|
39 | 48 | * @files: number of struct file referring this pipe (protected by ->i_lock) |
---|
40 | | - * @waiting_writers: number of writers blocked waiting for room |
---|
41 | 49 | * @r_counter: reader counter |
---|
42 | 50 | * @w_counter: writer counter |
---|
43 | 51 | * @fasync_readers: reader side fasync |
---|
44 | 52 | * @fasync_writers: writer side fasync |
---|
45 | 53 | * @bufs: the circular array of pipe buffers |
---|
46 | 54 | * @user: the user who created this pipe |
---|
| 55 | + * @watch_queue: If this pipe is a watch_queue, this is the stuff for that |
---|
47 | 56 | **/ |
---|
48 | 57 | struct pipe_inode_info { |
---|
49 | 58 | struct mutex mutex; |
---|
50 | | - wait_queue_head_t wait; |
---|
51 | | - unsigned int nrbufs, curbuf, buffers; |
---|
| 59 | + wait_queue_head_t rd_wait, wr_wait; |
---|
| 60 | + unsigned int head; |
---|
| 61 | + unsigned int tail; |
---|
| 62 | + unsigned int max_usage; |
---|
| 63 | + unsigned int ring_size; |
---|
| 64 | +#ifdef CONFIG_WATCH_QUEUE |
---|
| 65 | + bool note_loss; |
---|
| 66 | +#endif |
---|
| 67 | + unsigned int nr_accounted; |
---|
52 | 68 | unsigned int readers; |
---|
53 | 69 | unsigned int writers; |
---|
54 | 70 | unsigned int files; |
---|
55 | | - unsigned int waiting_writers; |
---|
56 | 71 | unsigned int r_counter; |
---|
57 | 72 | unsigned int w_counter; |
---|
58 | 73 | struct page *tmp_page; |
---|
.. | .. |
---|
60 | 75 | struct fasync_struct *fasync_writers; |
---|
61 | 76 | struct pipe_buffer *bufs; |
---|
62 | 77 | struct user_struct *user; |
---|
| 78 | +#ifdef CONFIG_WATCH_QUEUE |
---|
| 79 | + struct watch_queue *watch_queue; |
---|
| 80 | +#endif |
---|
63 | 81 | }; |
---|
64 | 82 | |
---|
65 | 83 | /* |
---|
66 | 84 | * Note on the nesting of these functions: |
---|
67 | 85 | * |
---|
68 | 86 | * ->confirm() |
---|
69 | | - * ->steal() |
---|
| 87 | + * ->try_steal() |
---|
70 | 88 | * |
---|
71 | | - * That is, ->steal() must be called on a confirmed buffer. |
---|
72 | | - * See below for the meaning of each operation. Also see kerneldoc |
---|
73 | | - * in fs/pipe.c for the pipe and generic variants of these hooks. |
---|
| 89 | + * That is, ->try_steal() must be called on a confirmed buffer. See below for |
---|
| 90 | + * the meaning of each operation. Also see the kerneldoc in fs/pipe.c for the |
---|
| 91 | + * pipe and generic variants of these hooks. |
---|
74 | 92 | */ |
---|
75 | 93 | struct pipe_buf_operations { |
---|
76 | | - /* |
---|
77 | | - * This is set to 1, if the generic pipe read/write may coalesce |
---|
78 | | - * data into an existing buffer. If this is set to 0, a new pipe |
---|
79 | | - * page segment is always used for new data. |
---|
80 | | - */ |
---|
81 | | - int can_merge; |
---|
82 | | - |
---|
83 | 94 | /* |
---|
84 | 95 | * ->confirm() verifies that the data in the pipe buffer is there |
---|
85 | 96 | * and that the contents are good. If the pages in the pipe belong |
---|
86 | 97 | * to a file system, we may need to wait for IO completion in this |
---|
87 | 98 | * hook. Returns 0 for good, or a negative error value in case of |
---|
88 | | - * error. |
---|
| 99 | + * error. If not present all pages are considered good. |
---|
89 | 100 | */ |
---|
90 | 101 | int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *); |
---|
91 | 102 | |
---|
.. | .. |
---|
97 | 108 | |
---|
98 | 109 | /* |
---|
99 | 110 | * Attempt to take ownership of the pipe buffer and its contents. |
---|
100 | | - * ->steal() returns 0 for success, in which case the contents |
---|
101 | | - * of the pipe (the buf->page) is locked and now completely owned |
---|
102 | | - * by the caller. The page may then be transferred to a different |
---|
103 | | - * mapping, the most often used case is insertion into different |
---|
104 | | - * file address space cache. |
---|
| 111 | + * ->try_steal() returns %true for success, in which case the contents |
---|
| 112 | + * of the pipe (the buf->page) is locked and now completely owned by the |
---|
| 113 | + * caller. The page may then be transferred to a different mapping, the |
---|
| 114 | + * most often used case is insertion into different file address space |
---|
| 115 | + * cache. |
---|
105 | 116 | */ |
---|
106 | | - int (*steal)(struct pipe_inode_info *, struct pipe_buffer *); |
---|
| 117 | + bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *); |
---|
107 | 118 | |
---|
108 | 119 | /* |
---|
109 | 120 | * Get a reference to the pipe buffer. |
---|
110 | 121 | */ |
---|
111 | 122 | bool (*get)(struct pipe_inode_info *, struct pipe_buffer *); |
---|
112 | 123 | }; |
---|
| 124 | + |
---|
| 125 | +/** |
---|
| 126 | + * pipe_empty - Return true if the pipe is empty |
---|
| 127 | + * @head: The pipe ring head pointer |
---|
| 128 | + * @tail: The pipe ring tail pointer |
---|
| 129 | + */ |
---|
| 130 | +static inline bool pipe_empty(unsigned int head, unsigned int tail) |
---|
| 131 | +{ |
---|
| 132 | + return head == tail; |
---|
| 133 | +} |
---|
| 134 | + |
---|
| 135 | +/** |
---|
| 136 | + * pipe_occupancy - Return number of slots used in the pipe |
---|
| 137 | + * @head: The pipe ring head pointer |
---|
| 138 | + * @tail: The pipe ring tail pointer |
---|
| 139 | + */ |
---|
| 140 | +static inline unsigned int pipe_occupancy(unsigned int head, unsigned int tail) |
---|
| 141 | +{ |
---|
| 142 | + return head - tail; |
---|
| 143 | +} |
---|
| 144 | + |
---|
| 145 | +/** |
---|
| 146 | + * pipe_full - Return true if the pipe is full |
---|
| 147 | + * @head: The pipe ring head pointer |
---|
| 148 | + * @tail: The pipe ring tail pointer |
---|
| 149 | + * @limit: The maximum amount of slots available. |
---|
| 150 | + */ |
---|
| 151 | +static inline bool pipe_full(unsigned int head, unsigned int tail, |
---|
| 152 | + unsigned int limit) |
---|
| 153 | +{ |
---|
| 154 | + return pipe_occupancy(head, tail) >= limit; |
---|
| 155 | +} |
---|
| 156 | + |
---|
| 157 | +/** |
---|
| 158 | + * pipe_space_for_user - Return number of slots available to userspace |
---|
| 159 | + * @head: The pipe ring head pointer |
---|
| 160 | + * @tail: The pipe ring tail pointer |
---|
| 161 | + * @pipe: The pipe info structure |
---|
| 162 | + */ |
---|
| 163 | +static inline unsigned int pipe_space_for_user(unsigned int head, unsigned int tail, |
---|
| 164 | + struct pipe_inode_info *pipe) |
---|
| 165 | +{ |
---|
| 166 | + unsigned int p_occupancy, p_space; |
---|
| 167 | + |
---|
| 168 | + p_occupancy = pipe_occupancy(head, tail); |
---|
| 169 | + if (p_occupancy >= pipe->max_usage) |
---|
| 170 | + return 0; |
---|
| 171 | + p_space = pipe->ring_size - p_occupancy; |
---|
| 172 | + if (p_space > pipe->max_usage) |
---|
| 173 | + p_space = pipe->max_usage; |
---|
| 174 | + return p_space; |
---|
| 175 | +} |
---|
113 | 176 | |
---|
114 | 177 | /** |
---|
115 | 178 | * pipe_buf_get - get a reference to a pipe_buffer |
---|
.. | .. |
---|
146 | 209 | static inline int pipe_buf_confirm(struct pipe_inode_info *pipe, |
---|
147 | 210 | struct pipe_buffer *buf) |
---|
148 | 211 | { |
---|
| 212 | + if (!buf->ops->confirm) |
---|
| 213 | + return 0; |
---|
149 | 214 | return buf->ops->confirm(pipe, buf); |
---|
150 | 215 | } |
---|
151 | 216 | |
---|
152 | 217 | /** |
---|
153 | | - * pipe_buf_steal - attempt to take ownership of a pipe_buffer |
---|
| 218 | + * pipe_buf_try_steal - attempt to take ownership of a pipe_buffer |
---|
154 | 219 | * @pipe: the pipe that the buffer belongs to |
---|
155 | 220 | * @buf: the buffer to attempt to steal |
---|
156 | 221 | */ |
---|
157 | | -static inline int pipe_buf_steal(struct pipe_inode_info *pipe, |
---|
158 | | - struct pipe_buffer *buf) |
---|
| 222 | +static inline bool pipe_buf_try_steal(struct pipe_inode_info *pipe, |
---|
| 223 | + struct pipe_buffer *buf) |
---|
159 | 224 | { |
---|
160 | | - return buf->ops->steal(pipe, buf); |
---|
| 225 | + if (!buf->ops->try_steal) |
---|
| 226 | + return false; |
---|
| 227 | + return buf->ops->try_steal(pipe, buf); |
---|
161 | 228 | } |
---|
162 | 229 | |
---|
163 | 230 | /* Differs from PIPE_BUF in that PIPE_SIZE is the length of the actual |
---|
.. | .. |
---|
173 | 240 | extern unsigned long pipe_user_pages_hard; |
---|
174 | 241 | extern unsigned long pipe_user_pages_soft; |
---|
175 | 242 | |
---|
176 | | -/* Drop the inode semaphore and wait for a pipe event, atomically */ |
---|
177 | | -void pipe_wait(struct pipe_inode_info *pipe); |
---|
| 243 | +/* Wait for a pipe to be readable/writable while dropping the pipe lock */ |
---|
| 244 | +void pipe_wait_readable(struct pipe_inode_info *); |
---|
| 245 | +void pipe_wait_writable(struct pipe_inode_info *); |
---|
178 | 246 | |
---|
179 | 247 | struct pipe_inode_info *alloc_pipe_info(void); |
---|
180 | 248 | void free_pipe_info(struct pipe_inode_info *); |
---|
181 | 249 | |
---|
182 | 250 | /* Generic pipe buffer ops functions */ |
---|
183 | 251 | bool generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *); |
---|
184 | | -int generic_pipe_buf_confirm(struct pipe_inode_info *, struct pipe_buffer *); |
---|
185 | | -int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *); |
---|
186 | | -int generic_pipe_buf_nosteal(struct pipe_inode_info *, struct pipe_buffer *); |
---|
| 252 | +bool generic_pipe_buf_try_steal(struct pipe_inode_info *, struct pipe_buffer *); |
---|
187 | 253 | void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *); |
---|
188 | | -void pipe_buf_mark_unmergeable(struct pipe_buffer *buf); |
---|
189 | 254 | |
---|
190 | 255 | extern const struct pipe_buf_operations nosteal_pipe_buf_ops; |
---|
191 | 256 | |
---|
| 257 | +unsigned long account_pipe_buffers(struct user_struct *user, |
---|
| 258 | + unsigned long old, unsigned long new); |
---|
| 259 | +bool too_many_pipe_buffers_soft(unsigned long user_bufs); |
---|
| 260 | +bool too_many_pipe_buffers_hard(unsigned long user_bufs); |
---|
| 261 | +bool pipe_is_unprivileged_user(void); |
---|
| 262 | + |
---|
192 | 263 | /* for F_SETPIPE_SZ and F_GETPIPE_SZ */ |
---|
| 264 | +int pipe_resize_ring(struct pipe_inode_info *pipe, unsigned int nr_slots); |
---|
193 | 265 | long pipe_fcntl(struct file *, unsigned int, unsigned long arg); |
---|
194 | | -struct pipe_inode_info *get_pipe_info(struct file *file); |
---|
| 266 | +struct pipe_inode_info *get_pipe_info(struct file *file, bool for_splice); |
---|
195 | 267 | |
---|
196 | 268 | int create_pipe_files(struct file **, int); |
---|
197 | 269 | unsigned int round_pipe_size(unsigned long size); |
---|