stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Hugh Dickins <hughd@google.com>,
	Jiri Kosina <jkosina@suse.cz>
Subject: [PATCH 4.4 09/37] kaiser: fix perf crashes
Date: Wed,  3 Jan 2018 21:11:15 +0100	[thread overview]
Message-ID: <20180103195057.348172679@linuxfoundation.org> (raw)
In-Reply-To: <20180103195056.837404126@linuxfoundation.org>

4.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Hugh Dickins <hughd@google.com>


Avoid perf crashes: place debug_store in the user-mapped per-cpu area
instead of allocating, and use page allocator plus kaiser_add_mapping()
to keep the BTS and PEBS buffers user-mapped (that is, present in the
user mapping, though visible only to kernel and hardware).  The PEBS
fixup buffer does not need this treatment.

The need for a user-mapped struct debug_store showed up before doing
any conscious perf testing: in a couple of kernel paging oopses on
Westmere, implicating the debug_store offset of the per-cpu area.

Signed-off-by: Hugh Dickins <hughd@google.com>
Acked-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 arch/x86/kernel/cpu/perf_event_intel_ds.c |   57 +++++++++++++++++++++++-------
 1 file changed, 45 insertions(+), 12 deletions(-)

--- a/arch/x86/kernel/cpu/perf_event_intel_ds.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c
@@ -2,11 +2,15 @@
 #include <linux/types.h>
 #include <linux/slab.h>
 
+#include <asm/kaiser.h>
 #include <asm/perf_event.h>
 #include <asm/insn.h>
 
 #include "perf_event.h"
 
+static
+DEFINE_PER_CPU_SHARED_ALIGNED_USER_MAPPED(struct debug_store, cpu_debug_store);
+
 /* The size of a BTS record in bytes: */
 #define BTS_RECORD_SIZE		24
 
@@ -268,6 +272,39 @@ void fini_debug_store_on_cpu(int cpu)
 
 static DEFINE_PER_CPU(void *, insn_buffer);
 
+static void *dsalloc(size_t size, gfp_t flags, int node)
+{
+#ifdef CONFIG_KAISER
+	unsigned int order = get_order(size);
+	struct page *page;
+	unsigned long addr;
+
+	page = __alloc_pages_node(node, flags | __GFP_ZERO, order);
+	if (!page)
+		return NULL;
+	addr = (unsigned long)page_address(page);
+	if (kaiser_add_mapping(addr, size, __PAGE_KERNEL) < 0) {
+		__free_pages(page, order);
+		addr = 0;
+	}
+	return (void *)addr;
+#else
+	return kmalloc_node(size, flags | __GFP_ZERO, node);
+#endif
+}
+
+static void dsfree(const void *buffer, size_t size)
+{
+#ifdef CONFIG_KAISER
+	if (!buffer)
+		return;
+	kaiser_remove_mapping((unsigned long)buffer, size);
+	free_pages((unsigned long)buffer, get_order(size));
+#else
+	kfree(buffer);
+#endif
+}
+
 static int alloc_pebs_buffer(int cpu)
 {
 	struct debug_store *ds = per_cpu(cpu_hw_events, cpu).ds;
@@ -278,7 +315,7 @@ static int alloc_pebs_buffer(int cpu)
 	if (!x86_pmu.pebs)
 		return 0;
 
-	buffer = kzalloc_node(x86_pmu.pebs_buffer_size, GFP_KERNEL, node);
+	buffer = dsalloc(x86_pmu.pebs_buffer_size, GFP_KERNEL, node);
 	if (unlikely(!buffer))
 		return -ENOMEM;
 
@@ -289,7 +326,7 @@ static int alloc_pebs_buffer(int cpu)
 	if (x86_pmu.intel_cap.pebs_format < 2) {
 		ibuffer = kzalloc_node(PEBS_FIXUP_SIZE, GFP_KERNEL, node);
 		if (!ibuffer) {
-			kfree(buffer);
+			dsfree(buffer, x86_pmu.pebs_buffer_size);
 			return -ENOMEM;
 		}
 		per_cpu(insn_buffer, cpu) = ibuffer;
@@ -315,7 +352,8 @@ static void release_pebs_buffer(int cpu)
 	kfree(per_cpu(insn_buffer, cpu));
 	per_cpu(insn_buffer, cpu) = NULL;
 
-	kfree((void *)(unsigned long)ds->pebs_buffer_base);
+	dsfree((void *)(unsigned long)ds->pebs_buffer_base,
+			x86_pmu.pebs_buffer_size);
 	ds->pebs_buffer_base = 0;
 }
 
@@ -329,7 +367,7 @@ static int alloc_bts_buffer(int cpu)
 	if (!x86_pmu.bts)
 		return 0;
 
-	buffer = kzalloc_node(BTS_BUFFER_SIZE, GFP_KERNEL | __GFP_NOWARN, node);
+	buffer = dsalloc(BTS_BUFFER_SIZE, GFP_KERNEL | __GFP_NOWARN, node);
 	if (unlikely(!buffer)) {
 		WARN_ONCE(1, "%s: BTS buffer allocation failure\n", __func__);
 		return -ENOMEM;
@@ -355,19 +393,15 @@ static void release_bts_buffer(int cpu)
 	if (!ds || !x86_pmu.bts)
 		return;
 
-	kfree((void *)(unsigned long)ds->bts_buffer_base);
+	dsfree((void *)(unsigned long)ds->bts_buffer_base, BTS_BUFFER_SIZE);
 	ds->bts_buffer_base = 0;
 }
 
 static int alloc_ds_buffer(int cpu)
 {
-	int node = cpu_to_node(cpu);
-	struct debug_store *ds;
-
-	ds = kzalloc_node(sizeof(*ds), GFP_KERNEL, node);
-	if (unlikely(!ds))
-		return -ENOMEM;
+	struct debug_store *ds = per_cpu_ptr(&cpu_debug_store, cpu);
 
+	memset(ds, 0, sizeof(*ds));
 	per_cpu(cpu_hw_events, cpu).ds = ds;
 
 	return 0;
@@ -381,7 +415,6 @@ static void release_ds_buffer(int cpu)
 		return;
 
 	per_cpu(cpu_hw_events, cpu).ds = NULL;
-	kfree(ds);
 }
 
 void release_ds_buffers(void)

  parent reply	other threads:[~2018-01-03 20:13 UTC|newest]

Thread overview: 144+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-03 20:11 [PATCH 4.4 00/37] 4.4.110-stable review Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 01/37] x86/boot: Add early cmdline parsing for options with arguments Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 02/37] KAISER: Kernel Address Isolation Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 03/37] kaiser: merged update Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 04/37] kaiser: do not set _PAGE_NX on pgd_none Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 05/37] kaiser: stack map PAGE_SIZE at THREAD_SIZE-PAGE_SIZE Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 06/37] kaiser: fix build and FIXME in alloc_ldt_struct() Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 07/37] kaiser: KAISER depends on SMP Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 08/37] kaiser: fix regs to do_nmi() ifndef CONFIG_KAISER Greg Kroah-Hartman
2018-01-03 20:11 ` Greg Kroah-Hartman [this message]
2018-01-03 20:11 ` [PATCH 4.4 10/37] kaiser: ENOMEM if kaiser_pagetable_walk() NULL Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 11/37] kaiser: tidied up asm/kaiser.h somewhat Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 12/37] kaiser: tidied up kaiser_add/remove_mapping slightly Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 13/37] kaiser: kaiser_remove_mapping() move along the pgd Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 14/37] kaiser: cleanups while trying for gold link Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 15/37] kaiser: name that 0x1000 KAISER_SHADOW_PGD_OFFSET Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 16/37] kaiser: delete KAISER_REAL_SWITCH option Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 17/37] kaiser: vmstat show NR_KAISERTABLE as nr_overhead Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 18/37] kaiser: enhanced by kernel and user PCIDs Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 19/37] kaiser: load_new_mm_cr3() let SWITCH_USER_CR3 flush user Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 20/37] kaiser: PCID 0 for kernel and 128 for user Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 21/37] kaiser: x86_cr3_pcid_noflush and x86_cr3_pcid_user Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 22/37] kaiser: paranoid_entry pass cr3 need to paranoid_exit Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 23/37] kaiser: _pgd_alloc() without __GFP_REPEAT to avoid stalls Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 24/37] kaiser: fix unlikely error in alloc_ldt_struct() Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 25/37] kaiser: add "nokaiser" boot option, using ALTERNATIVE Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 26/37] x86/kaiser: Rename and simplify X86_FEATURE_KAISER handling Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 27/37] x86/kaiser: Check boottime cmdline params Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 28/37] kaiser: use ALTERNATIVE instead of x86_cr3_pcid_noflush Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 29/37] kaiser: drop is_atomic arg to kaiser_pagetable_walk() Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 30/37] kaiser: asm/tlbflush.h handle noPGE at lower level Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 31/37] kaiser: kaiser_flush_tlb_on_return_to_user() check PCID Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 32/37] x86/paravirt: Dont patch flush_tlb_single Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 33/37] x86/kaiser: Reenable PARAVIRT Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 34/37] kaiser: disabled on Xen PV Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 35/37] x86/kaiser: Move feature detection up Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 36/37] KPTI: Rename to PAGE_TABLE_ISOLATION Greg Kroah-Hartman
2018-01-03 20:11 ` [PATCH 4.4 37/37] KPTI: Report when enabled Greg Kroah-Hartman
2018-01-03 22:08 ` [PATCH 4.4 00/37] 4.4.110-stable review Nathan Chancellor
2018-01-04  8:10   ` Greg Kroah-Hartman
2018-01-04  6:50 ` Naresh Kamboju
2018-01-04 16:38 ` Pavel Tatashin
2018-01-04 16:53   ` Greg Kroah-Hartman
2018-01-04 17:01     ` Guenter Roeck
2018-01-04 17:09       ` Greg Kroah-Hartman
2018-01-04 17:02     ` Pavel Tatashin
2018-01-04 17:03     ` Willy Tarreau
2018-01-04 17:11       ` Greg Kroah-Hartman
2018-01-04 17:13         ` Willy Tarreau
2018-01-04 17:14         ` Greg Kroah-Hartman
2018-01-04 17:16           ` Greg Kroah-Hartman
2018-01-04 17:56             ` Guenter Roeck
2018-01-05 15:00               ` Greg Kroah-Hartman
2018-01-05 18:12                 ` Guenter Roeck
2018-01-05 20:53                   ` Greg Kroah-Hartman
2018-01-04 20:11   ` Linus Torvalds
2018-01-04 17:03 ` Guenter Roeck
2018-01-04 19:38 ` Thomas Voegtle
2018-01-04 19:50   ` Greg Kroah-Hartman
2018-01-04 20:16     ` Thomas Voegtle
2018-01-04 20:29       ` Linus Torvalds
2018-01-04 20:43         ` Andy Lutomirski
2018-01-04 20:57           ` Hugh Dickins
2018-01-04 21:16             ` Andy Lutomirski
2018-01-04 21:23             ` Pavel Tatashin
2018-01-04 21:37               ` Hugh Dickins
2018-01-04 21:48                 ` Pavel Tatashin
2018-01-04 22:33                   ` Linus Torvalds
2018-01-05 14:59                   ` Greg Kroah-Hartman
2018-01-05 15:32                     ` Pavel Tatashin
2018-01-05 15:51                       ` Greg Kroah-Hartman
2018-01-05 15:57                         ` Willy Tarreau
2018-01-05 18:01                           ` Greg Kroah-Hartman
2018-01-05 16:26                         ` Pavel Tatashin
2018-01-05 16:57                       ` Andy Lutomirski
2018-01-05 17:14                         ` Pavel Tatashin
2018-01-05 17:43                           ` Andy Lutomirski
2018-01-05 17:48                             ` Pavel Tatashin
2018-01-05 17:52                               ` Greg Kroah-Hartman
2018-01-05 18:15                                 ` Andy Lutomirski
2018-01-05 18:21                                   ` Pavel Tatashin
2018-01-05 19:14                                     ` Pavel Tatashin
2018-01-05 19:18                                       ` Pavel Tatashin
2018-01-05 20:45                                         ` Greg Kroah-Hartman
2018-01-05 21:03                                           ` Pavel Tatashin
2018-01-05 23:15                                             ` Hugh Dickins
2018-01-06  1:16                                               ` Pavel Tatashin
2018-01-07 10:45                                             ` Greg Kroah-Hartman
2018-01-07 14:17                                               ` Pavel Tatashin
2018-01-07 15:06                                                 ` Pavel Tatashin
2018-01-08  7:46                                                   ` Greg Kroah-Hartman
2018-01-08 20:38                                                     ` Pavel Tatashin
2018-01-08 21:24                                                       ` Pavel Tatashin
2018-01-11 18:36                                                         ` Pavel Tatashin
2018-01-11 18:40                                                           ` Pavel Tatashin
2018-01-11 19:09                                                             ` Linus Torvalds
2018-01-11 20:37                                                               ` Thomas Gleixner
2018-01-11 20:46                                                                 ` Linus Torvalds
2018-01-11 21:32                                                                   ` Thomas Gleixner
2018-01-11 22:30                                                                     ` Thomas Gleixner
2018-01-11 22:42                                                                       ` Steven Sistare
2018-01-11 22:47                                                                         ` Thomas Gleixner
2018-01-12  1:15                                                                           ` Guenter Roeck
2018-01-11 22:59                                                                         ` Linus Torvalds
2018-01-11 23:03                                                                       ` Thomas Gleixner
2018-01-12  7:19                                                                         ` Greg Kroah-Hartman
2018-01-12  8:03                                                                           ` Thomas Gleixner
2018-01-11 21:35                                                                   ` Steven Sistare
2018-01-11 21:44                                                                     ` Thomas Gleixner
2018-01-11 20:10                                                           ` Greg Kroah-Hartman
2018-01-11 20:17                                                             ` Linus Torvalds
2018-01-11 20:18                                                             ` Pavel Tatashin
2018-01-05 20:48                                   ` Greg Kroah-Hartman
2018-01-05  5:33           ` Andy Lutomirski
2018-01-05 10:12             ` Kees Cook
2018-01-05 12:14               ` Greg Kroah-Hartman
2018-01-05 13:08               ` Greg Kroah-Hartman
2018-01-04 20:10   ` Guenter Roeck
2018-01-05 14:58   ` Greg Kroah-Hartman
2018-01-05 15:25     ` Thomas Voegtle
2018-01-05 15:48       ` Greg Kroah-Hartman
2018-01-04 22:00 ` Shuah Khan
2018-01-05  7:55   ` Greg Kroah-Hartman
2018-01-04 23:45 ` Guenter Roeck
2018-01-04 23:58   ` Linus Torvalds
2018-01-05  4:37   ` Mike Galbraith
2018-01-05 12:17     ` Greg Kroah-Hartman
2018-01-05 13:03       ` Mike Galbraith
2018-01-05 13:34         ` Greg Kroah-Hartman
2018-01-05 14:03           ` Mike Galbraith
2018-01-05 23:28             ` Hugh Dickins
2018-01-06  2:58               ` Mike Galbraith
2018-01-05 13:41   ` Greg Kroah-Hartman
2018-01-05 17:51     ` Guenter Roeck
2018-01-05 17:20 ` Alice Ferrazzi
2018-01-05 18:01   ` Greg Kroah-Hartman
2018-01-09 19:49     ` Serge E. Hallyn
2018-01-10  8:48       ` Greg Kroah-Hartman
2018-01-10 16:45         ` Serge E. Hallyn
2018-01-05 17:56 ` Guenter Roeck
2018-01-05 20:54   ` Greg Kroah-Hartman
2018-01-05 21:21     ` Guenter Roeck
2018-01-06  1:35     ` Guenter Roeck
     [not found] ` <5a4df377.03a5500a.51f2e.f41f@mx.google.com>
     [not found]   ` <7hmv1t2mq2.fsf@baylibre.com>
2018-01-08 15:06     ` Guillaume Tucker

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=20180103195057.348172679@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=hughd@google.com \
    --cc=jkosina@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.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 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).