Skip to content

Commit

Permalink
tracing/user_events: Use alloc_pages instead of kzalloc() for registe…
Browse files Browse the repository at this point in the history
…r pages

kzalloc virtual addresses do not work with SetPageReserved, use the actual
page virtual addresses instead via alloc_pages.

The issue is reported when booting with user_events and
DEBUG_VM_PGFLAGS=y.

Also make the number of events based on the ORDER.

Link: https://lore.kernel.org/all/CADYN=9+xY5Vku3Ws5E9S60SM5dCFfeGeRBkmDFbcxX0ZMoFing@mail.gmail.com/
Link: https://lore.kernel.org/all/20220311223028.1865-1-beaub@linux.microsoft.com/

Cc: Beau Belgrave <beaub@linux.microsoft.com>
Reported-by: Anders Roxell <anders.roxell@linaro.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt (Google) committed Mar 11, 2022
1 parent 380af29 commit bc47ee4
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions kernel/trace/trace_events_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@

/*
* 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. */
Expand Down Expand Up @@ -1622,16 +1623,17 @@ static void set_page_reservations(bool set)

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);

Expand All @@ -1640,7 +1642,7 @@ static int __init trace_events_user_init(void)
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;
}

Expand Down

0 comments on commit bc47ee4

Please sign in to comment.