local_t                         committing;
        local_t                         commits;
        local_t                         pages_touched;
+       local_t                         pages_lost;
        local_t                         pages_read;
        long                            last_pages_touch;
        size_t                          shortest_full;
 size_t ring_buffer_nr_dirty_pages(struct trace_buffer *buffer, int cpu)
 {
        size_t read;
+       size_t lost;
        size_t cnt;
 
        read = local_read(&buffer->buffers[cpu]->pages_read);
+       lost = local_read(&buffer->buffers[cpu]->pages_lost);
        cnt = local_read(&buffer->buffers[cpu]->pages_touched);
+
+       if (WARN_ON_ONCE(cnt < lost))
+               return 0;
+
+       cnt -= lost;
+
        /* The reader can read an empty page, but not more than that */
        if (cnt < read) {
                WARN_ON_ONCE(read > cnt + 1);
                         */
                        local_add(page_entries, &cpu_buffer->overrun);
                        local_sub(BUF_PAGE_SIZE, &cpu_buffer->entries_bytes);
+                       local_inc(&cpu_buffer->pages_lost);
                }
 
                /*
                 */
                local_add(entries, &cpu_buffer->overrun);
                local_sub(BUF_PAGE_SIZE, &cpu_buffer->entries_bytes);
+               local_inc(&cpu_buffer->pages_lost);
 
                /*
                 * The entries will be zeroed out when we move the
        local_set(&cpu_buffer->committing, 0);
        local_set(&cpu_buffer->commits, 0);
        local_set(&cpu_buffer->pages_touched, 0);
+       local_set(&cpu_buffer->pages_lost, 0);
        local_set(&cpu_buffer->pages_read, 0);
        cpu_buffer->last_pages_touch = 0;
        cpu_buffer->shortest_full = 0;