Skip to content

Commit ed56829

Browse files
rostedtIngo Molnar
authored andcommitted
ring_buffer: reset buffer page when freeing
Mathieu Desnoyers pointed out that the freeing of the page frame needs to be reset otherwise we might trigger BUG_ON in the page free code. Signed-off-by: Steven Rostedt <[email protected]> Signed-off-by: Ingo Molnar <[email protected]>
1 parent a7b1374 commit ed56829

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

kernel/trace/ring_buffer.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ struct buffer_page {
127127
};
128128
};
129129

130+
/*
131+
* Also stolen from mm/slob.c. Thanks to Mathieu Desnoyers for pointing
132+
* this issue out.
133+
*/
134+
static inline void free_buffer_page(struct buffer_page *bpage)
135+
{
136+
reset_page_mapcount(&bpage->page);
137+
bpage->page.mapping = NULL;
138+
__free_page(&bpage->page);
139+
}
140+
130141
/*
131142
* We need to fit the time_stamp delta into 27 bits.
132143
*/
@@ -240,7 +251,7 @@ static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
240251
free_pages:
241252
list_for_each_entry_safe(page, tmp, &pages, list) {
242253
list_del_init(&page->list);
243-
__free_page(&page->page);
254+
free_buffer_page(page);
244255
}
245256
return -ENOMEM;
246257
}
@@ -284,7 +295,7 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
284295

285296
list_for_each_entry_safe(page, tmp, head, list) {
286297
list_del_init(&page->list);
287-
__free_page(&page->page);
298+
free_buffer_page(page);
288299
}
289300
kfree(cpu_buffer);
290301
}
@@ -393,7 +404,7 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages)
393404
p = cpu_buffer->pages.next;
394405
page = list_entry(p, struct buffer_page, list);
395406
list_del_init(&page->list);
396-
__free_page(&page->page);
407+
free_buffer_page(page);
397408
}
398409
BUG_ON(list_empty(&cpu_buffer->pages));
399410

@@ -520,7 +531,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size)
520531
free_pages:
521532
list_for_each_entry_safe(page, tmp, &pages, list) {
522533
list_del_init(&page->list);
523-
__free_page(&page->page);
534+
free_buffer_page(page);
524535
}
525536
return -ENOMEM;
526537
}

0 commit comments

Comments
 (0)