[PATCH] ring_bufer: fix BUF_PAGE_SIZE

From: Lai Jiangshan
Date: Wed Dec 17 2008 - 04:52:06 EST



impact: make BUF_PAGE_SIZE changeable.

Except allocating/freeing page and the code using PAGE_MASK,
all code expect buffer_page's length is BUF_PAGE_SIZE.

This patch make this behavior more concordant.

Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxx>
---
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 668bbb5..0cf6caf 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -158,6 +158,10 @@ struct buffer_page {
void *page; /* Actual data page */
};

+#define BUF_PAGE_ORDER 0
+#define BUF_PAGE_SIZE (PAGE_SIZE << BUF_PAGE_ORDER)
+#define BUF_PAGE_MASK (~(BUF_PAGE_SIZE - 1))
+
/*
* Also stolen from mm/slob.c. Thanks to Mathieu Desnoyers for pointing
* this issue out.
@@ -165,7 +169,7 @@ struct buffer_page {
static inline void free_buffer_page(struct buffer_page *bpage)
{
if (bpage->page)
- free_page((unsigned long)bpage->page);
+ free_pages((unsigned long)bpage->page, BUF_PAGE_ORDER);
kfree(bpage);
}

@@ -179,8 +183,6 @@ static inline int test_time_stamp(u64 delta)
return 0;
}

-#define BUF_PAGE_SIZE PAGE_SIZE
-
/*
* head_page == tail_page && head == tail then buffer is empty.
*/
@@ -289,7 +291,7 @@ static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
goto free_pages;
list_add(&page->list, &pages);

- addr = __get_free_page(GFP_KERNEL);
+ addr = __get_free_pages(GFP_KERNEL, BUF_PAGE_ORDER);
if (!addr)
goto free_pages;
page->page = (void *)addr;
@@ -333,7 +335,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
goto fail_free_buffer;

cpu_buffer->reader_page = page;
- addr = __get_free_page(GFP_KERNEL);
+ addr = __get_free_pages(GFP_KERNEL, BUF_PAGE_ORDER);
if (!addr)
goto fail_free_reader;
page->page = (void *)addr;
@@ -592,7 +594,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size)
if (!page)
goto free_pages;
list_add(&page->list, &pages);
- addr = __get_free_page(GFP_KERNEL);
+ addr = __get_free_pages(GFP_KERNEL, BUF_PAGE_ORDER);
if (!addr)
goto free_pages;
page->page = (void *)addr;
@@ -718,7 +720,7 @@ rb_event_index(struct ring_buffer_event *event)
{
unsigned long addr = (unsigned long)event;

- return (addr & ~PAGE_MASK) - (PAGE_SIZE - BUF_PAGE_SIZE);
+ return addr & ~BUF_PAGE_MASK;
}

static inline int
@@ -729,7 +731,7 @@ rb_is_commit(struct ring_buffer_per_cpu *cpu_buffer,
unsigned long index;

index = rb_event_index(event);
- addr &= PAGE_MASK;
+ addr &= BUF_PAGE_MASK;

return cpu_buffer->commit_page->page == (void *)addr &&
rb_commit_index(cpu_buffer) == index;
@@ -743,7 +745,7 @@ rb_set_commit_event(struct ring_buffer_per_cpu *cpu_buffer,
unsigned long index;

index = rb_event_index(event);
- addr &= PAGE_MASK;
+ addr &= BUF_PAGE_MASK;

while (cpu_buffer->commit_page->page != (void *)addr) {
RB_WARN_ON(cpu_buffer,


--
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/