/*
* Limits how many trace_event calls user processes can create:
- * Must be multiple of PAGE_SIZE.
+ * Must be a power of two of PAGE_SIZE.
*/
-#define MAX_PAGES 1
+#define MAX_PAGE_ORDER 0
+#define MAX_PAGES (1 << MAX_PAGE_ORDER)
#define MAX_EVENTS (MAX_PAGES * PAGE_SIZE)
/* Limit how long of an event name plus args within the subsystem. */
static int __init trace_events_user_init(void)
{
+ struct page *pages;
int ret;
/* Zero all bits beside 0 (which is reserved for failures) */
bitmap_zero(page_bitmap, MAX_EVENTS);
set_bit(0, page_bitmap);
- register_page_data = kzalloc(MAX_EVENTS, GFP_KERNEL);
-
- if (!register_page_data)
+ pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, MAX_PAGE_ORDER);
+ if (!pages)
return -ENOMEM;
+ register_page_data = page_address(pages);
set_page_reservations(true);
if (ret) {
pr_warn("user_events could not register with tracefs\n");
set_page_reservations(false);
- kfree(register_page_data);
+ __free_pages(pages, MAX_PAGE_ORDER);
return ret;
}