mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 22:21:21 +00:00
pipe: Add notification lossage handling
Add handling for loss of notifications by having read() insert a loss-notification message after it has read the pipe buffer that was last in the ring when the loss occurred. Lossage can come about either by running out of notification descriptors or by running out of space in the pipe ring. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
parent
8cfba76383
commit
e7d553d69c
4 changed files with 40 additions and 0 deletions
28
fs/pipe.c
28
fs/pipe.c
|
@ -314,6 +314,30 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to)
|
|||
unsigned int tail = pipe->tail;
|
||||
unsigned int mask = pipe->ring_size - 1;
|
||||
|
||||
#ifdef CONFIG_WATCH_QUEUE
|
||||
if (pipe->note_loss) {
|
||||
struct watch_notification n;
|
||||
|
||||
if (total_len < 8) {
|
||||
if (ret == 0)
|
||||
ret = -ENOBUFS;
|
||||
break;
|
||||
}
|
||||
|
||||
n.type = WATCH_TYPE_META;
|
||||
n.subtype = WATCH_META_LOSS_NOTIFICATION;
|
||||
n.info = watch_sizeof(n);
|
||||
if (copy_to_iter(&n, sizeof(n), to) != sizeof(n)) {
|
||||
if (ret == 0)
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
ret += sizeof(n);
|
||||
total_len -= sizeof(n);
|
||||
pipe->note_loss = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!pipe_empty(head, tail)) {
|
||||
struct pipe_buffer *buf = &pipe->bufs[tail & mask];
|
||||
size_t chars = buf->len;
|
||||
|
@ -355,6 +379,10 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to)
|
|||
if (!buf->len) {
|
||||
pipe_buf_release(pipe, buf);
|
||||
spin_lock_irq(&pipe->rd_wait.lock);
|
||||
#ifdef CONFIG_WATCH_QUEUE
|
||||
if (buf->flags & PIPE_BUF_FLAG_LOSS)
|
||||
pipe->note_loss = true;
|
||||
#endif
|
||||
tail++;
|
||||
pipe->tail = tail;
|
||||
spin_unlock_irq(&pipe->rd_wait.lock);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue