1
2#ifndef _LINUX_PIPE_FS_I_H
3#define _LINUX_PIPE_FS_I_H
4
5#define PIPE_DEF_BUFFERS 16
6
7#define PIPE_BUF_FLAG_LRU 0x01
8#define PIPE_BUF_FLAG_ATOMIC 0x02
9#define PIPE_BUF_FLAG_GIFT 0x04
10#define PIPE_BUF_FLAG_PACKET 0x08
11#define PIPE_BUF_FLAG_CAN_MERGE 0x10
12#define PIPE_BUF_FLAG_WHOLE 0x20
13#ifdef CONFIG_WATCH_QUEUE
14#define PIPE_BUF_FLAG_LOSS 0x40
15#endif
16
17
18
19
20
21
22
23
24
25
26struct pipe_buffer {
27 struct page *page;
28 unsigned int offset, len;
29 const struct pipe_buf_operations *ops;
30 unsigned int flags;
31 unsigned long private;
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
58struct pipe_inode_info {
59 struct mutex mutex;
60 wait_queue_head_t rd_wait, wr_wait;
61 unsigned int head;
62 unsigned int tail;
63 unsigned int max_usage;
64 unsigned int ring_size;
65#ifdef CONFIG_WATCH_QUEUE
66 bool note_loss;
67#endif
68 unsigned int nr_accounted;
69 unsigned int readers;
70 unsigned int writers;
71 unsigned int files;
72 unsigned int r_counter;
73 unsigned int w_counter;
74 unsigned int poll_usage;
75 struct page *tmp_page;
76 struct fasync_struct *fasync_readers;
77 struct fasync_struct *fasync_writers;
78 struct pipe_buffer *bufs;
79 struct user_struct *user;
80#ifdef CONFIG_WATCH_QUEUE
81 struct watch_queue *watch_queue;
82#endif
83};
84
85
86
87
88
89
90
91
92
93
94
95struct pipe_buf_operations {
96
97
98
99
100
101
102
103 int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *);
104
105
106
107
108
109 void (*release)(struct pipe_inode_info *, struct pipe_buffer *);
110
111
112
113
114
115
116
117
118
119 bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *);
120
121
122
123
124 bool (*get)(struct pipe_inode_info *, struct pipe_buffer *);
125};
126
127
128
129
130
131
132static inline bool pipe_empty(unsigned int head, unsigned int tail)
133{
134 return head == tail;
135}
136
137
138
139
140
141
142static inline unsigned int pipe_occupancy(unsigned int head, unsigned int tail)
143{
144 return head - tail;
145}
146
147
148
149
150
151
152
153static inline bool pipe_full(unsigned int head, unsigned int tail,
154 unsigned int limit)
155{
156 return pipe_occupancy(head, tail) >= limit;
157}
158
159
160
161
162
163
164
165static inline unsigned int pipe_space_for_user(unsigned int head, unsigned int tail,
166 struct pipe_inode_info *pipe)
167{
168 unsigned int p_occupancy, p_space;
169
170 p_occupancy = pipe_occupancy(head, tail);
171 if (p_occupancy >= pipe->max_usage)
172 return 0;
173 p_space = pipe->ring_size - p_occupancy;
174 if (p_space > pipe->max_usage)
175 p_space = pipe->max_usage;
176 return p_space;
177}
178
179
180
181
182
183
184
185
186static inline __must_check bool pipe_buf_get(struct pipe_inode_info *pipe,
187 struct pipe_buffer *buf)
188{
189 return buf->ops->get(pipe, buf);
190}
191
192
193
194
195
196
197static inline void pipe_buf_release(struct pipe_inode_info *pipe,
198 struct pipe_buffer *buf)
199{
200 const struct pipe_buf_operations *ops = buf->ops;
201
202 buf->ops = NULL;
203 ops->release(pipe, buf);
204}
205
206
207
208
209
210
211static inline int pipe_buf_confirm(struct pipe_inode_info *pipe,
212 struct pipe_buffer *buf)
213{
214 if (!buf->ops->confirm)
215 return 0;
216 return buf->ops->confirm(pipe, buf);
217}
218
219
220
221
222
223
224static inline bool pipe_buf_try_steal(struct pipe_inode_info *pipe,
225 struct pipe_buffer *buf)
226{
227 if (!buf->ops->try_steal)
228 return false;
229 return buf->ops->try_steal(pipe, buf);
230}
231
232
233
234#define PIPE_SIZE PAGE_SIZE
235
236
237void pipe_lock(struct pipe_inode_info *);
238void pipe_unlock(struct pipe_inode_info *);
239void pipe_double_lock(struct pipe_inode_info *, struct pipe_inode_info *);
240
241extern unsigned int pipe_max_size;
242extern unsigned long pipe_user_pages_hard;
243extern unsigned long pipe_user_pages_soft;
244
245
246void pipe_wait_readable(struct pipe_inode_info *);
247void pipe_wait_writable(struct pipe_inode_info *);
248
249struct pipe_inode_info *alloc_pipe_info(void);
250void free_pipe_info(struct pipe_inode_info *);
251
252
253bool generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *);
254bool generic_pipe_buf_try_steal(struct pipe_inode_info *, struct pipe_buffer *);
255void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *);
256
257extern const struct pipe_buf_operations nosteal_pipe_buf_ops;
258
259#ifdef CONFIG_WATCH_QUEUE
260unsigned long account_pipe_buffers(struct user_struct *user,
261 unsigned long old, unsigned long new);
262bool too_many_pipe_buffers_soft(unsigned long user_bufs);
263bool too_many_pipe_buffers_hard(unsigned long user_bufs);
264bool pipe_is_unprivileged_user(void);
265#endif
266
267
268#ifdef CONFIG_WATCH_QUEUE
269int pipe_resize_ring(struct pipe_inode_info *pipe, unsigned int nr_slots);
270#endif
271long pipe_fcntl(struct file *, unsigned int, unsigned long arg);
272struct pipe_inode_info *get_pipe_info(struct file *file, bool for_splice);
273
274int create_pipe_files(struct file **, int);
275unsigned int round_pipe_size(unsigned long size);
276
277#endif
278