Messages in this thread Patch in this message | | | From | Alexander Shishkin <> | Subject | [PATCH 2/2] perf/x86/intel/bts: Fix the use of page_private() | Date | Thu, 5 Dec 2019 17:28:53 +0300 |
| |
Commit
8062382c8dbe2 ("perf/x86/intel/bts: Add BTS PMU driver")
uses page_private(page) without checking the PagePrivate(page) first, which seems like a potential bug, considering that page->private aliases with other stuff in struct page.
Fix this by checking PagePrivate() first.
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Fixes: 8062382c8dbe2 ("perf/x86/intel/bts: Add BTS PMU driver") --- arch/x86/events/intel/bts.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/arch/x86/events/intel/bts.c b/arch/x86/events/intel/bts.c index d53b4fb86d87..9e4da1c5a129 100644 --- a/arch/x86/events/intel/bts.c +++ b/arch/x86/events/intel/bts.c @@ -63,9 +63,17 @@ struct bts_buffer { static struct pmu bts_pmu; +static int buf_nr_pages(struct page *page) +{ + if (!PagePrivate(page)) + return 1; + + return 1 << page_private(page); +} + static size_t buf_size(struct page *page) { - return 1 << (PAGE_SHIFT + page_private(page)); + return 1 << (PAGE_SHIFT + buf_nr_pages(page)); } static void * @@ -83,7 +91,7 @@ bts_buffer_setup_aux(struct perf_event *event, void **pages, /* count all the high order buffers */ for (pg = 0, nbuf = 0; pg < nr_pages;) { page = virt_to_page(pages[pg]); - pg += 1 << page_private(page); + pg += buf_nr_pages(page); nbuf++; } @@ -107,7 +115,7 @@ bts_buffer_setup_aux(struct perf_event *event, void **pages, unsigned int __nr_pages; page = virt_to_page(pages[pg]); - __nr_pages = PagePrivate(page) ? 1 << page_private(page) : 1; + __nr_pages = buf_nr_pages(page); buf->buf[nbuf].page = page; buf->buf[nbuf].offset = offset; buf->buf[nbuf].displacement = (pad ? BTS_RECORD_SIZE - pad : 0); -- 2.24.0
| |