linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: kan.liang@linux.intel.com
To: peterz@infradead.org, acme@kernel.org, tglx@linutronix.de,
	mingo@redhat.com, linux-kernel@vger.kernel.org
Cc: eranian@google.com, jolsa@redhat.com, namhyung@kernel.org,
	ak@linux.intel.com, luto@amacapital.net, vbabka@suse.cz,
	will.deacon@arm.com, kirill@shutemov.name,
	Kan Liang <kan.liang@linux.intel.com>
Subject: [PATCH V5 02/14] perf/x86: Add perf_get_page_size support
Date: Fri,  8 Feb 2019 09:54:57 -0800	[thread overview]
Message-ID: <1549648509-12704-2-git-send-email-kan.liang@linux.intel.com> (raw)
In-Reply-To: <1549648509-12704-1-git-send-email-kan.liang@linux.intel.com>

From: Kan Liang <kan.liang@linux.intel.com>

Implement a x86 specific version of perf_get_page_size(), which do full
page-table walk of a given virtual address to retrieve page size.
For x86, disabling IRQs over the walk is sufficient to prevent any tear
down of the page tables.

The new sample type requires collecting the virtual address. The virtual
address will not be output unless SAMPLE_ADDR is applied.

The large PEBS will be disabled with this sample type. Because we need
to track munmap to flush the PEBS buffer for large PEBS. Perf doesn't
support munmap tracking yet. The large PEBS can be enabled later
separately when munmap tracking is supported.

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
---

Changes since V4
- Split patch 1 of V4 into two patches.
  This patch add the x86 implementation

 arch/x86/events/core.c     | 31 +++++++++++++++++++++++++++++++
 arch/x86/events/intel/ds.c |  3 ++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
index 374a197..229a73b 100644
--- a/arch/x86/events/core.c
+++ b/arch/x86/events/core.c
@@ -2578,3 +2578,34 @@ void perf_get_x86_pmu_capability(struct x86_pmu_capability *cap)
 	cap->events_mask_len	= x86_pmu.events_mask_len;
 }
 EXPORT_SYMBOL_GPL(perf_get_x86_pmu_capability);
+
+u64 perf_get_page_size(u64 virt)
+{
+	unsigned long flags;
+	unsigned int level;
+	pte_t *pte;
+
+	if (!virt)
+		return 0;
+
+	/*
+	 * Interrupts are disabled, so it prevents any tear down
+	 * of the page tables.
+	 * See the comment near struct mmu_table_batch.
+	 */
+	local_irq_save(flags);
+	if (virt >= TASK_SIZE)
+		pte = lookup_address(virt, &level);
+	else {
+		if (current->mm) {
+			pte = lookup_address_in_pgd(pgd_offset(current->mm, virt),
+						    virt, &level);
+		} else
+			level = PG_LEVEL_NUM;
+	}
+	local_irq_restore(flags);
+	if (level >= PG_LEVEL_NUM)
+		return 0;
+
+	return (u64)page_level_size(level);
+}
diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index e9acf1d..720dc9e 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1274,7 +1274,8 @@ static void setup_pebs_sample_data(struct perf_event *event,
 	}
 
 
-	if ((sample_type & (PERF_SAMPLE_ADDR | PERF_SAMPLE_PHYS_ADDR)) &&
+	if ((sample_type & (PERF_SAMPLE_ADDR | PERF_SAMPLE_PHYS_ADDR
+			    | PERF_SAMPLE_DATA_PAGE_SIZE)) &&
 	    x86_pmu.intel_cap.pebs_format >= 1)
 		data->addr = pebs->dla;
 
-- 
2.7.4


  reply	other threads:[~2019-02-08 17:56 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-08 17:54 [PATCH V5 01/14] perf/core: Add PERF_SAMPLE_DATA_PAGE_SIZE kan.liang
2019-02-08 17:54 ` kan.liang [this message]
2019-02-08 18:47   ` [PATCH V5 02/14] perf/x86: Add perf_get_page_size support Thomas Gleixner
2019-02-08 20:07   ` Peter Zijlstra
2019-02-08 17:54 ` [PATCH V5 03/14] perf tools: Support new sample type for data page size kan.liang
2019-02-08 17:54 ` [PATCH V5 04/14] perf script: Support " kan.liang
2019-02-08 17:55 ` [PATCH V5 05/14] perf sort: Add sort option for " kan.liang
2019-02-08 17:55 ` [PATCH V5 06/14] perf mem: Factor out a function to generate sort order kan.liang
2019-02-08 17:55 ` [PATCH V5 07/14] perf mem: Clean up output format kan.liang
2019-02-08 17:55 ` [PATCH V5 08/14] perf mem: Support data page size kan.liang
2019-02-08 17:55 ` [PATCH V5 09/14] perf test: Add test case for PERF_SAMPLE_DATA_PAGE_SIZE kan.liang
2019-02-08 17:55 ` [PATCH V5 10/14] perf/core: Add support for PERF_SAMPLE_CODE_PAGE_SIZE kan.liang
2019-02-08 17:55 ` [PATCH V5 11/14] perf tools: " kan.liang
2019-02-08 17:55 ` [PATCH V5 12/14] perf script: " kan.liang
2019-02-08 17:55 ` [PATCH V5 13/14] perf report: " kan.liang
2019-02-08 17:55 ` [PATCH V5 14/14] perf test: Add test case " kan.liang

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=1549648509-12704-2-git-send-email-kan.liang@linux.intel.com \
    --to=kan.liang@linux.intel.com \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=eranian@google.com \
    --cc=jolsa@redhat.com \
    --cc=kirill@shutemov.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=vbabka@suse.cz \
    --cc=will.deacon@arm.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).