--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1657,6 +1657,11 @@
 		void *buffer, size_t *lenp, loff_t *ppos);
 int perf_event_max_stack_handler(const struct ctl_table *table, int write,
 		void *buffer, size_t *lenp, loff_t *ppos);
+
+static inline bool perf_paranoid_any(void)
+{
+	return sysctl_perf_event_paranoid > 2;
+}
 
 /* Access to perf_event_open(2) syscall. */
 #define PERF_SECURITY_OPEN		0
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -462,8 +462,13 @@
  *   0 - disallow raw tracepoint access for unpriv
  *   1 - disallow cpu events for unpriv
  *   2 - disallow kernel profiling for unpriv
+ *   3 - disallow all unpriv perf event use
  */
+#ifdef CONFIG_SECURITY_PERF_EVENTS_RESTRICT
+int sysctl_perf_event_paranoid __read_mostly = 3;
+#else
 int sysctl_perf_event_paranoid __read_mostly = 2;
+#endif
 
 /* Minimum for 512 kiB + 1 user control page */
 int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024); /* 'free' kiB per user */
@@ -12843,6 +12848,9 @@
 	if (err)
 		return err;
 
+	if (perf_paranoid_any() && !capable(CAP_SYS_ADMIN))
+		return -EACCES;
+
 	/* Do we allow access to perf_event_open(2) ? */
 	err = security_perf_event_open(PERF_SECURITY_OPEN);
 	if (err)
--- a/security/Kconfig
+++ b/security/Kconfig
@@ -50,6 +50,15 @@
 	  Never override memory mapping permissions
 
 endchoice
+
+config SECURITY_PERF_EVENTS_RESTRICT
+	bool "Restrict unprivileged use of performance events"
+	depends on PERF_EVENTS
+	help
+	  If you say Y here, the kernel.perf_event_paranoid sysctl
+	  will be set to 3 by default, and no unprivileged use of the
+	  perf_event_open syscall will be permitted unless it is
+	  changed.
 
 config SECURITY
 	bool "Enable different security models"
