From: Peter Zijlstra <peterz@infradead.org>
To: "Liang, Kan" <kan.liang@linux.intel.com>
Cc: Will Deacon <will@kernel.org>,
Michael Ellerman <mpe@ellerman.id.au>,
mingo@redhat.com, acme@kernel.org, linux-kernel@vger.kernel.org,
mark.rutland@arm.com, alexander.shishkin@linux.intel.com,
jolsa@redhat.com, eranian@google.com, ak@linux.intel.com,
dave.hansen@intel.com, kirill.shutemov@linux.intel.com,
benh@kernel.crashing.org, paulus@samba.org,
David Miller <davem@davemloft.net>,
vbabka@suse.cz, willy@infradead.org
Subject: Re: [PATCH V9 1/4] perf/core: Add PERF_SAMPLE_DATA_PAGE_SIZE
Date: Wed, 11 Nov 2020 13:43:57 +0100 [thread overview]
Message-ID: <20201111124357.GS2651@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20201111112246.GR2651@hirez.programming.kicks-ass.net>
On Wed, Nov 11, 2020 at 12:22:46PM +0100, Peter Zijlstra wrote:
> Trying to match the Code: to PageHuge as generate here makes this the
> PageCompound() test burning, not even compound_head() going bad.
>
> must ponder more...
Oooh.. does this help?
---
kernel/events/core.c | 81 +++++++++++++++++++++++++++++++---------------------
1 file changed, 49 insertions(+), 32 deletions(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index d2f3ca792936..3b42576c99f1 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7015,65 +7015,82 @@ static u64 perf_virt_to_phys(u64 virt)
*/
__weak u64 arch_perf_get_page_size(struct mm_struct *mm, unsigned long addr)
{
+#ifdef CONFIG_ARCH_HAS_PTE_SPECIAL
struct page *page;
- pgd_t *pgd;
- p4d_t *p4d;
- pud_t *pud;
- pmd_t *pmd;
- pte_t *pte;
-
- pgd = pgd_offset(mm, addr);
- if (pgd_none(*pgd))
+ pgd_t *pgdp, pgd;
+ p4d_t *p4dp, p4d;
+ pud_t *pudp, pud;
+ pmd_t *pmdp, pmd;
+ pte_t *ptep, pte;
+
+ pgdp = pgd_offset(mm, addr);
+ pgd = READ_ONCE(*pgdp);
+ if (pgd_none(pgd))
return 0;
- p4d = p4d_offset(pgd, addr);
- if (!p4d_present(*p4d))
+ p4dp = p4d_offset(&pgd, addr);
+ p4d = READ_ONCE(*p4dp);
+ if (!p4d_present(p4d))
return 0;
- if (p4d_leaf(*p4d))
+ if (p4d_leaf(p4d))
return 1ULL << P4D_SHIFT;
- pud = pud_offset(p4d, addr);
- if (!pud_present(*pud))
+ pudp = pud_offset(&p4d, addr);
+ pud = READ_ONCE(*pudp);
+ if (!pud_present(pud))
return 0;
- if (pud_leaf(*pud)) {
+ if (pud_leaf(pud)) {
#ifdef pud_page
- page = pud_page(*pud);
- if (PageHuge(page))
- return page_size(compound_head(page));
+ if (!pud_devmap(pud)) {
+ page = pud_page(pud);
+ if (PageHuge(page))
+ return page_size(compound_head(page));
+ }
#endif
return 1ULL << PUD_SHIFT;
}
- pmd = pmd_offset(pud, addr);
- if (!pmd_present(*pmd))
+ pmdp = pmd_offset(&pud, addr);
+ pmd = READ_ONCE(*pmdp);
+ if (!pmd_present(pmd))
return 0;
- if (pmd_leaf(*pmd)) {
+ if (pmd_leaf(pmd)) {
#ifdef pmd_page
- page = pmd_page(*pmd);
- if (PageHuge(page))
- return page_size(compound_head(page));
+ if (!pmd_devmap(pmd)) {
+ page = pmd_page(pmd);
+ if (PageHuge(page))
+ return page_size(compound_head(page));
+ }
#endif
return 1ULL << PMD_SHIFT;
}
- pte = pte_offset_map(pmd, addr);
- if (!pte_present(*pte)) {
- pte_unmap(pte);
+ ptep = pte_offset_map(&pmd, addr);
+ pte = READ_ONCE(*ptep); // gup_get_pte()
+ if (!pte_present(pte)) {
+ pte_unmap(ptep);
return 0;
}
- page = pte_page(*pte);
- if (PageHuge(page)) {
- u64 size = page_size(compound_head(page));
- pte_unmap(pte);
- return size;
+ if (!pte_devmap(pte) && !pte_special(pte)) {
+ page = pte_page(pte);
+ if (PageHuge(page)) {
+ u64 size = page_size(compound_head(page));
+ pte_unmap(ptep);
+ return size;
+ }
}
- pte_unmap(pte);
+ pte_unmap(ptep);
return PAGE_SIZE;
+
+#else /* CONFIG_ARCH_HAS_PTE_SPECIAL */
+
+ return 0;
+#endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */
}
#else
next prev parent reply other threads:[~2020-11-11 12:44 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-01 13:57 [PATCH V9 0/4] Add the page size in the perf record (kernel) kan.liang
2020-10-01 13:57 ` [PATCH V9 1/4] perf/core: Add PERF_SAMPLE_DATA_PAGE_SIZE kan.liang
2020-10-09 9:09 ` Peter Zijlstra
2020-10-09 9:16 ` Peter Zijlstra
2020-10-09 9:37 ` Will Deacon
2020-10-09 9:53 ` Peter Zijlstra
2020-10-20 2:49 ` Leo Yan
2020-10-20 7:19 ` Peter Zijlstra
2020-10-20 8:16 ` Leo Yan
2020-10-09 12:29 ` Liang, Kan
2020-10-09 12:57 ` Peter Zijlstra
2020-10-09 13:28 ` Michael Ellerman
2020-10-12 8:48 ` Will Deacon
2020-10-13 14:57 ` Liang, Kan
2020-10-13 15:46 ` Peter Zijlstra
2020-10-13 16:34 ` Peter Zijlstra
2020-11-04 17:11 ` Liang, Kan
2020-11-10 15:20 ` Liang, Kan
2020-11-11 9:57 ` Peter Zijlstra
2020-11-11 11:22 ` Peter Zijlstra
2020-11-11 12:43 ` Peter Zijlstra [this message]
2020-11-11 15:30 ` Matthew Wilcox
2020-11-11 15:52 ` Peter Zijlstra
2020-11-11 15:57 ` Peter Zijlstra
2020-11-11 16:38 ` Matthew Wilcox
2020-11-11 17:22 ` Peter Zijlstra
2020-11-11 18:26 ` Matthew Wilcox
2020-11-11 20:00 ` Peter Zijlstra
2020-11-11 22:33 ` Matthew Wilcox
2020-11-12 9:53 ` Peter Zijlstra
2020-11-12 11:36 ` Peter Zijlstra
2020-11-12 14:01 ` Matthew Wilcox
2020-10-29 10:51 ` [tip: perf/core] " tip-bot2 for Kan Liang
2020-10-01 13:57 ` [PATCH V9 2/4] perf/x86/intel: Support PERF_SAMPLE_DATA_PAGE_SIZE kan.liang
2020-10-29 10:51 ` [tip: perf/core] " tip-bot2 for Kan Liang
2020-10-01 13:57 ` [PATCH V9 3/4] powerpc/perf: " kan.liang
2020-10-29 10:51 ` [tip: perf/core] " tip-bot2 for Kan Liang
2020-10-01 13:57 ` [PATCH V9 4/4] perf/core: Add support for PERF_SAMPLE_CODE_PAGE_SIZE kan.liang
2020-10-29 10:51 ` [tip: perf/core] " tip-bot2 for Stephane Eranian
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201111124357.GS2651@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=benh@kernel.crashing.org \
--cc=dave.hansen@intel.com \
--cc=davem@davemloft.net \
--cc=eranian@google.com \
--cc=jolsa@redhat.com \
--cc=kan.liang@linux.intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
--cc=vbabka@suse.cz \
--cc=will@kernel.org \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.