diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0001-kaiser-fix-intel_bts-perf-crashes.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.9.21/0001-kaiser-fix-intel_bts-perf-crashes.patch | 135 |
1 files changed, 0 insertions, 135 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0001-kaiser-fix-intel_bts-perf-crashes.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0001-kaiser-fix-intel_bts-perf-crashes.patch deleted file mode 100644 index 3e53e978..00000000 --- a/common/recipes-kernel/linux/linux-yocto-4.9.21/0001-kaiser-fix-intel_bts-perf-crashes.patch +++ /dev/null @@ -1,135 +0,0 @@ -From f07b0b948b09b02e7386560ad509d1afdbd6ef0b Mon Sep 17 00:00:00 2001 -From: Hugh Dickins <hughd@google.com> -Date: Mon, 29 Jan 2018 18:16:55 -0800 -Subject: [PATCH 01/42] kaiser: fix intel_bts perf crashes -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Vince reported perf_fuzzer quickly locks up on 4.15-rc7 with PTI; -Robert reported Bad RIP with KPTI and Intel BTS also on 4.15-rc7: -honggfuzz -f /tmp/somedirectorywithatleastonefile \ - --linux_perf_bts_edge -s -- /bin/true -(honggfuzz from https://github.com/google/honggfuzz) crashed with -BUG: unable to handle kernel paging request at ffff9d3215100000 -(then narrowed it down to -perf record --per-thread -e intel_bts//u -- /bin/ls). - -The intel_bts driver does not use the 'normal' BTS buffer which is -exposed through kaiser_add_mapping(), but instead uses the memory -allocated for the perf AUX buffer. - -This obviously comes apart when using PTI, because then the kernel -mapping, which includes that AUX buffer memory, disappears while -switched to user page tables. - -Easily fixed in old-Kaiser backports, by applying kaiser_add_mapping() -to those pages; perhaps not so easy for upstream, where 4.15-rc8 commit -99a9dc98ba52 ("x86,perf: Disable intel_bts when PTI") disables for now. - -Slightly reorganized surrounding code in bts_buffer_setup_aux(), -so it can better match bts_buffer_free_aux(): free_aux with an #ifdef -to avoid the loop when PTI is off, but setup_aux needs to loop anyway -(and kaiser_add_mapping() is cheap when PTI config is off or "pti=off"). - -Reported-by: Vince Weaver <vincent.weaver@maine.edu> -Reported-by: Robert Święcki <robert@swiecki.net> -Analyzed-by: Peter Zijlstra <peterz@infradead.org> -Analyzed-by: Stephane Eranian <eranian@google.com> -Cc: Thomas Gleixner <tglx@linutronix.de> -Cc: Ingo Molnar <mingo@kernel.org> -Cc: Andy Lutomirski <luto@amacapital.net> -Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> -Cc: Linus Torvalds <torvalds@linux-foundation.org> -Cc: Vince Weaver <vince@deater.net> -Cc: Jiri Kosina <jkosina@suse.cz> -Signed-off-by: Hugh Dickins <hughd@google.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---- - arch/x86/events/intel/bts.c | 44 +++++++++++++++++++++++++++++++++----------- - 1 file changed, 33 insertions(+), 11 deletions(-) - -diff --git a/arch/x86/events/intel/bts.c b/arch/x86/events/intel/bts.c -index 982c9e3..21298c1 100644 ---- a/arch/x86/events/intel/bts.c -+++ b/arch/x86/events/intel/bts.c -@@ -22,6 +22,7 @@ - #include <linux/debugfs.h> - #include <linux/device.h> - #include <linux/coredump.h> -+#include <linux/kaiser.h> - - #include <asm-generic/sizes.h> - #include <asm/perf_event.h> -@@ -77,6 +78,23 @@ static size_t buf_size(struct page *page) - return 1 << (PAGE_SHIFT + page_private(page)); - } - -+static void bts_buffer_free_aux(void *data) -+{ -+#ifdef CONFIG_PAGE_TABLE_ISOLATION -+ struct bts_buffer *buf = data; -+ int nbuf; -+ -+ for (nbuf = 0; nbuf < buf->nr_bufs; nbuf++) { -+ struct page *page = buf->buf[nbuf].page; -+ void *kaddr = page_address(page); -+ size_t page_size = buf_size(page); -+ -+ kaiser_remove_mapping((unsigned long)kaddr, page_size); -+ } -+#endif -+ kfree(data); -+} -+ - static void * - bts_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool overwrite) - { -@@ -113,29 +131,33 @@ bts_buffer_setup_aux(int cpu, void **pages, int nr_pages, bool overwrite) - buf->real_size = size - size % BTS_RECORD_SIZE; - - for (pg = 0, nbuf = 0, offset = 0, pad = 0; nbuf < buf->nr_bufs; nbuf++) { -- unsigned int __nr_pages; -+ void *kaddr = pages[pg]; -+ size_t page_size; -+ -+ page = virt_to_page(kaddr); -+ page_size = buf_size(page); -+ -+ if (kaiser_add_mapping((unsigned long)kaddr, -+ page_size, __PAGE_KERNEL) < 0) { -+ buf->nr_bufs = nbuf; -+ bts_buffer_free_aux(buf); -+ return NULL; -+ } - -- page = virt_to_page(pages[pg]); -- __nr_pages = PagePrivate(page) ? 1 << page_private(page) : 1; - buf->buf[nbuf].page = page; - buf->buf[nbuf].offset = offset; - buf->buf[nbuf].displacement = (pad ? BTS_RECORD_SIZE - pad : 0); -- buf->buf[nbuf].size = buf_size(page) - buf->buf[nbuf].displacement; -+ buf->buf[nbuf].size = page_size - buf->buf[nbuf].displacement; - pad = buf->buf[nbuf].size % BTS_RECORD_SIZE; - buf->buf[nbuf].size -= pad; - -- pg += __nr_pages; -- offset += __nr_pages << PAGE_SHIFT; -+ pg += page_size >> PAGE_SHIFT; -+ offset += page_size; - } - - return buf; - } - --static void bts_buffer_free_aux(void *data) --{ -- kfree(data); --} -- - static unsigned long bts_buffer_offset(struct bts_buffer *buf, unsigned int idx) - { - return buf->buf[idx].offset + buf->buf[idx].displacement; --- -2.7.4 - |