Commit 91feca5e authored by Alexander Shishkin's avatar Alexander Shishkin Committed by Ingo Molnar

perf/x86/intel/pt: Free up space in a ToPA descriptor

Currently, we're storing physical address of a ToPA table in its
descriptor, which is completely unnecessary. Since the descriptor
and the table itself share the same page, reducing the descriptor
size leaves more space for the table.
Signed-off-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Link: http://lkml.kernel.org/r/20190821124727.73310-6-alexander.shishkin@linux.intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 38bb8d77
...@@ -548,14 +548,12 @@ static void pt_config_buffer(void *buf, unsigned int topa_idx, ...@@ -548,14 +548,12 @@ static void pt_config_buffer(void *buf, unsigned int topa_idx,
/** /**
* struct topa - ToPA metadata * struct topa - ToPA metadata
* @list: linkage to struct pt_buffer's list of tables * @list: linkage to struct pt_buffer's list of tables
* @phys: physical address of this page
* @offset: offset of the first entry in this table in the buffer * @offset: offset of the first entry in this table in the buffer
* @size: total size of all entries in this table * @size: total size of all entries in this table
* @last: index of the last initialized entry in this table * @last: index of the last initialized entry in this table
*/ */
struct topa { struct topa {
struct list_head list; struct list_head list;
u64 phys;
u64 offset; u64 offset;
size_t size; size_t size;
int last; int last;
...@@ -589,6 +587,11 @@ static inline struct topa_page *topa_entry_to_page(struct topa_entry *te) ...@@ -589,6 +587,11 @@ static inline struct topa_page *topa_entry_to_page(struct topa_entry *te)
return (struct topa_page *)((unsigned long)te & PAGE_MASK); return (struct topa_page *)((unsigned long)te & PAGE_MASK);
} }
static inline phys_addr_t topa_pfn(struct topa *topa)
{
return PFN_DOWN(virt_to_phys(topa_to_page(topa)));
}
/* make -1 stand for the last table entry */ /* make -1 stand for the last table entry */
#define TOPA_ENTRY(t, i) \ #define TOPA_ENTRY(t, i) \
((i) == -1 \ ((i) == -1 \
...@@ -615,14 +618,13 @@ static struct topa *topa_alloc(int cpu, gfp_t gfp) ...@@ -615,14 +618,13 @@ static struct topa *topa_alloc(int cpu, gfp_t gfp)
tp = page_address(p); tp = page_address(p);
tp->topa.last = 0; tp->topa.last = 0;
tp->topa.phys = page_to_phys(p);
/* /*
* In case of singe-entry ToPA, always put the self-referencing END * In case of singe-entry ToPA, always put the self-referencing END
* link as the 2nd entry in the table * link as the 2nd entry in the table
*/ */
if (!intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries)) { if (!intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries)) {
TOPA_ENTRY(&tp->topa, 1)->base = tp->topa.phys; TOPA_ENTRY(&tp->topa, 1)->base = page_to_phys(p);
TOPA_ENTRY(&tp->topa, 1)->end = 1; TOPA_ENTRY(&tp->topa, 1)->end = 1;
} }
...@@ -666,7 +668,7 @@ static void topa_insert_table(struct pt_buffer *buf, struct topa *topa) ...@@ -666,7 +668,7 @@ static void topa_insert_table(struct pt_buffer *buf, struct topa *topa)
BUG_ON(last->last != TENTS_PER_PAGE - 1); BUG_ON(last->last != TENTS_PER_PAGE - 1);
TOPA_ENTRY(last, -1)->base = topa->phys >> TOPA_SHIFT; TOPA_ENTRY(last, -1)->base = topa_pfn(topa);
TOPA_ENTRY(last, -1)->end = 1; TOPA_ENTRY(last, -1)->end = 1;
} }
...@@ -739,8 +741,8 @@ static void pt_topa_dump(struct pt_buffer *buf) ...@@ -739,8 +741,8 @@ static void pt_topa_dump(struct pt_buffer *buf)
struct topa_page *tp = topa_to_page(topa); struct topa_page *tp = topa_to_page(topa);
int i; int i;
pr_debug("# table @%p (%016Lx), off %llx size %zx\n", tp->table, pr_debug("# table @%p, off %llx size %zx\n", tp->table,
topa->phys, topa->offset, topa->size); topa->offset, topa->size);
for (i = 0; i < TENTS_PER_PAGE; i++) { for (i = 0; i < TENTS_PER_PAGE; i++) {
pr_debug("# entry @%p (%lx sz %u %c%c%c) raw=%16llx\n", pr_debug("# entry @%p (%lx sz %u %c%c%c) raw=%16llx\n",
&tp->table[i], &tp->table[i],
...@@ -1111,7 +1113,7 @@ static int pt_buffer_init_topa(struct pt_buffer *buf, int cpu, ...@@ -1111,7 +1113,7 @@ static int pt_buffer_init_topa(struct pt_buffer *buf, int cpu,
/* link last table to the first one, unless we're double buffering */ /* link last table to the first one, unless we're double buffering */
if (intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries)) { if (intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries)) {
TOPA_ENTRY(buf->last, -1)->base = buf->first->phys >> TOPA_SHIFT; TOPA_ENTRY(buf->last, -1)->base = topa_pfn(buf->first);
TOPA_ENTRY(buf->last, -1)->end = 1; TOPA_ENTRY(buf->last, -1)->end = 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment