aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2019-05-13 12:53:03 -0400
committerWill Deacon <will.deacon@arm.com>2019-05-13 13:01:56 -0400
commit14ae42a6f0b13130a97d94d23481128961de5d38 (patch)
treec2725f3a573da711269bad4b21f286b5bf9eb99f
parenta98d9ae937d256ed679a935fc82d9deaa710d98e (diff)
drivers/perf: arm_spe: Don't error on high-order pages for aux buf
Since commit 5768402fd9c6 ("perf/ring_buffer: Use high order allocations for AUX buffers optimistically"), the perf core tends to back aux buffer allocations with high-order pages with the order encoded in the PagePrivate data. The Arm SPE driver explicitly rejects such pages, causing the perf tool to fail with: | failed to mmap with 12 (Cannot allocate memory) In actual fact, we can simply treat these pages just like any other since the perf core takes care to populate the page array appropriately. In theory we could try to map with PMDs where possible, but for now, let's just get things working again. Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Fixes: 5768402fd9c6 ("perf/ring_buffer: Use high order allocations for AUX buffers optimistically") Reported-by: Hanjun Guo <guohanjun@huawei.com> Tested-by: Hanjun Guo <guohanjun@huawei.com> Tested-by: Sudeep Holla <sudeep.holla@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--drivers/perf/arm_spe_pmu.c10
1 files changed, 1 insertions, 9 deletions
diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c
index 7cb766dafe85..e120f933412a 100644
--- a/drivers/perf/arm_spe_pmu.c
+++ b/drivers/perf/arm_spe_pmu.c
@@ -855,16 +855,8 @@ static void *arm_spe_pmu_setup_aux(struct perf_event *event, void **pages,
855 if (!pglist) 855 if (!pglist)
856 goto out_free_buf; 856 goto out_free_buf;
857 857
858 for (i = 0; i < nr_pages; ++i) { 858 for (i = 0; i < nr_pages; ++i)
859 struct page *page = virt_to_page(pages[i]);
860
861 if (PagePrivate(page)) {
862 pr_warn("unexpected high-order page for auxbuf!");
863 goto out_free_pglist;
864 }
865
866 pglist[i] = virt_to_page(pages[i]); 859 pglist[i] = virt_to_page(pages[i]);
867 }
868 860
869 buf->base = vmap(pglist, nr_pages, VM_MAP, PAGE_KERNEL); 861 buf->base = vmap(pglist, nr_pages, VM_MAP, PAGE_KERNEL);
870 if (!buf->base) 862 if (!buf->base)