Re: [PATCH v6] Unified trace buffer

From: Peter Zijlstra
Date: Fri Sep 26 2008 - 16:10:23 EST


On Fri, 2008-09-26 at 14:05 -0400, Steven Rostedt wrote:
> +static void
> +rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned
> nr_pages)
> +{
> + struct page *page;
> + struct list_head *p;
> + unsigned i;
> +
> + atomic_inc(&cpu_buffer->record_disabled);

You probably want synchronize_sched() here (and similar other places) to
ensure any active writer on the corresponding cpu is actually stopped.

Which suggests you want to use something like ring_buffer_lock_cpu() and
implement that as above.

> + for (i = 0; i < nr_pages; i++) {
> + BUG_ON(list_empty(&cpu_buffer->pages));
> + p = cpu_buffer->pages.next;
> + page = list_entry(p, struct page, lru);
> + list_del_init(&page->lru);
> + __free_page(page);
> + }
> + BUG_ON(list_empty(&cpu_buffer->pages));
> +
> + __ring_buffer_reset_cpu(cpu_buffer);
> +
> + check_pages(cpu_buffer);
> +
> + atomic_dec(&cpu_buffer->record_disabled);
> +
> +}

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/