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;
                        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);
 
 #define PIPE_BUF_FLAG_GIFT     0x04    /* page is a gift */
 #define PIPE_BUF_FLAG_PACKET   0x08    /* read() as a packet */
 #define PIPE_BUF_FLAG_WHOLE    0x10    /* read() must return entire buffer or error */
+#ifdef CONFIG_WATCH_QUEUE
+#define PIPE_BUF_FLAG_LOSS     0x20    /* Message loss happened after this buffer */
+#endif
 
 /**
  *     struct pipe_buffer - a linux kernel pipe buffer
  *     @wr_wait: writer wait point in case of full pipe
  *     @head: The point of buffer production
  *     @tail: The point of buffer consumption
+ *     @note_loss: The next read() should insert a data-lost message
  *     @max_usage: The maximum number of slots that may be used in the ring
  *     @ring_size: total number of buffers (should be a power of 2)
  *     @nr_accounted: The amount this pipe accounts for in user->pipe_bufs
        unsigned int tail;
        unsigned int max_usage;
        unsigned int ring_size;
+#ifdef CONFIG_WATCH_QUEUE
+       bool note_loss;
+#endif
        unsigned int nr_accounted;
        unsigned int readers;
        unsigned int writers;
 
                                               (n.n.info & WATCH_INFO_ID) >>
                                               WATCH_INFO_ID__SHIFT);
                                        break;
+                               case WATCH_META_LOSS_NOTIFICATION:
+                                       printf("-- LOSS --\n");
+                                       break;
                                default:
                                        printf("other meta record\n");
                                        break;