All of lore.kernel.org
 help / color / mirror / Atom feed
* [4.13,35/36] x86/mcelog: Get rid of RCU remnants
  2017-11-06  9:12 [PATCH 4.13 00/36] 4.13.12-stable review Greg Kroah-Hartman
@ 2017-11-06  9:12 ` Greg Kroah-Hartman
  2017-11-06  9:12 ` [PATCH 4.13 02/36] ALSA: seq: Fix nested rwsem annotation for lockdep splat Greg Kroah-Hartman
                   ` (32 subsequent siblings)
  33 siblings, 0 replies; 42+ messages in thread
From: Greg Kroah-Hartman @ 2017-11-06  9:12 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, stable, Jeremy Cline, Borislav Petkov,
	Thomas Gleixner, Andi Kleen, linux-edac, Laura Abbott

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

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

From: Borislav Petkov <bp@suse.de>

commit 7298f08ea8870d44d36c7d6cd07dd0303faef6c2 upstream.

Jeremy reported a suspicious RCU usage warning in mcelog.

/dev/mcelog is called in process context now as part of the notifier
chain and doesn't need any of the fancy RCU and lockless accesses which
it did in atomic context.

Axe it all in favor of a simple mutex synchronization which cures the
problem reported.

Fixes: 5de97c9f6d85 ("x86/mce: Factor out and deprecate the /dev/mcelog driver")
Reported-by: Jeremy Cline <jcline@redhat.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-and-tested-by: Tony Luck <tony.luck@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: linux-edac@vger.kernel.org
Cc: Laura Abbott <labbott@redhat.com>
Link: https://lkml.kernel.org/r/20171101164754.xzzmskl4ngrqc5br@pd.tnic
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1498969
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 arch/x86/kernel/cpu/mcheck/dev-mcelog.c |  119 ++++++--------------------------
 1 file changed, 26 insertions(+), 93 deletions(-)



--
To unsubscribe from this list: send the line "unsubscribe linux-edac" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

--- a/arch/x86/kernel/cpu/mcheck/dev-mcelog.c
+++ b/arch/x86/kernel/cpu/mcheck/dev-mcelog.c
@@ -24,14 +24,6 @@ static DEFINE_MUTEX(mce_chrdev_read_mute
 static char mce_helper[128];
 static char *mce_helper_argv[2] = { mce_helper, NULL };
 
-#define mce_log_get_idx_check(p) \
-({ \
-	RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \
-			 !lockdep_is_held(&mce_chrdev_read_mutex), \
-			 "suspicious mce_log_get_idx_check() usage"); \
-	smp_load_acquire(&(p)); \
-})
-
 /*
  * Lockless MCE logging infrastructure.
  * This avoids deadlocks on printk locks without having to break locks. Also
@@ -53,43 +45,32 @@ static int dev_mce_log(struct notifier_b
 				void *data)
 {
 	struct mce *mce = (struct mce *)data;
-	unsigned int next, entry;
+	unsigned int entry;
+
+	mutex_lock(&mce_chrdev_read_mutex);
 
-	wmb();
-	for (;;) {
-		entry = mce_log_get_idx_check(mcelog.next);
-		for (;;) {
-
-			/*
-			 * When the buffer fills up discard new entries.
-			 * Assume that the earlier errors are the more
-			 * interesting ones:
-			 */
-			if (entry >= MCE_LOG_LEN) {
-				set_bit(MCE_OVERFLOW,
-					(unsigned long *)&mcelog.flags);
-				return NOTIFY_OK;
-			}
-			/* Old left over entry. Skip: */
-			if (mcelog.entry[entry].finished) {
-				entry++;
-				continue;
-			}
-			break;
-		}
-		smp_rmb();
-		next = entry + 1;
-		if (cmpxchg(&mcelog.next, entry, next) == entry)
-			break;
+	entry = mcelog.next;
+
+	/*
+	 * When the buffer fills up discard new entries. Assume that the
+	 * earlier errors are the more interesting ones:
+	 */
+	if (entry >= MCE_LOG_LEN) {
+		set_bit(MCE_OVERFLOW, (unsigned long *)&mcelog.flags);
+		goto unlock;
 	}
+
+	mcelog.next = entry + 1;
+
 	memcpy(mcelog.entry + entry, mce, sizeof(struct mce));
-	wmb();
 	mcelog.entry[entry].finished = 1;
-	wmb();
 
 	/* wake processes polling /dev/mcelog */
 	wake_up_interruptible(&mce_chrdev_wait);
 
+unlock:
+	mutex_unlock(&mce_chrdev_read_mutex);
+
 	return NOTIFY_OK;
 }
 
@@ -177,13 +158,6 @@ static int mce_chrdev_release(struct ino
 	return 0;
 }
 
-static void collect_tscs(void *data)
-{
-	unsigned long *cpu_tsc = (unsigned long *)data;
-
-	cpu_tsc[smp_processor_id()] = rdtsc();
-}
-
 static int mce_apei_read_done;
 
 /* Collect MCE record of previous boot in persistent storage via APEI ERST. */
@@ -231,14 +205,9 @@ static ssize_t mce_chrdev_read(struct fi
 				size_t usize, loff_t *off)
 {
 	char __user *buf = ubuf;
-	unsigned long *cpu_tsc;
-	unsigned prev, next;
+	unsigned next;
 	int i, err;
 
-	cpu_tsc = kmalloc(nr_cpu_ids * sizeof(long), GFP_KERNEL);
-	if (!cpu_tsc)
-		return -ENOMEM;
-
 	mutex_lock(&mce_chrdev_read_mutex);
 
 	if (!mce_apei_read_done) {
@@ -247,65 +216,29 @@ static ssize_t mce_chrdev_read(struct fi
 			goto out;
 	}
 
-	next = mce_log_get_idx_check(mcelog.next);
-
 	/* Only supports full reads right now */
 	err = -EINVAL;
 	if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce))
 		goto out;
 
+	next = mcelog.next;
 	err = 0;
-	prev = 0;
-	do {
-		for (i = prev; i < next; i++) {
-			unsigned long start = jiffies;
-			struct mce *m = &mcelog.entry[i];
-
-			while (!m->finished) {
-				if (time_after_eq(jiffies, start + 2)) {
-					memset(m, 0, sizeof(*m));
-					goto timeout;
-				}
-				cpu_relax();
-			}
-			smp_rmb();
-			err |= copy_to_user(buf, m, sizeof(*m));
-			buf += sizeof(*m);
-timeout:
-			;
-		}
-
-		memset(mcelog.entry + prev, 0,
-		       (next - prev) * sizeof(struct mce));
-		prev = next;
-		next = cmpxchg(&mcelog.next, prev, 0);
-	} while (next != prev);
 
-	synchronize_sched();
-
-	/*
-	 * Collect entries that were still getting written before the
-	 * synchronize.
-	 */
-	on_each_cpu(collect_tscs, cpu_tsc, 1);
-
-	for (i = next; i < MCE_LOG_LEN; i++) {
+	for (i = 0; i < next; i++) {
 		struct mce *m = &mcelog.entry[i];
 
-		if (m->finished && m->tsc < cpu_tsc[m->cpu]) {
-			err |= copy_to_user(buf, m, sizeof(*m));
-			smp_rmb();
-			buf += sizeof(*m);
-			memset(m, 0, sizeof(*m));
-		}
+		err |= copy_to_user(buf, m, sizeof(*m));
+		buf += sizeof(*m);
 	}
 
+	memset(mcelog.entry, 0, next * sizeof(struct mce));
+	mcelog.next = 0;
+
 	if (err)
 		err = -EFAULT;
 
 out:
 	mutex_unlock(&mce_chrdev_read_mutex);
-	kfree(cpu_tsc);
 
 	return err ? err : buf - ubuf;
 }

^ permalink raw reply	[flat|nested] 42+ messages in thread
* [PATCH 4.13 00/36] 4.13.12-stable review
@ 2017-11-06  9:12 Greg Kroah-Hartman
  2017-11-06  9:12 ` [PATCH 4.13 01/36] ALSA: timer: Add missing mutex lock for compat ioctls Greg Kroah-Hartman
                   ` (33 more replies)
  0 siblings, 34 replies; 42+ messages in thread
From: Greg Kroah-Hartman @ 2017-11-06  9:12 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, torvalds, akpm, linux, shuahkh, patches,
	ben.hutchings, stable

This is the start of the stable review cycle for the 4.13.12 release.
There are 36 patches in this series, all will be posted as a response
to this one.  If anyone has any issues with these being applied, please
let me know.

Responses should be made by Wed Nov  8 08:50:26 UTC 2017.
Anything received after that time might be too late.

The whole patch series can be found in one patch at:
	kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.13.12-rc1.gz
or in the git tree and branch at:
  git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.13.y
and the diffstat can be found below.

thanks,

greg k-h

-------------
Pseudo-Shortlog of commits:

Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Linux 4.13.12-rc1

Antoine Tenart <antoine.tenart@free-electrons.com>
    irqchip/irq-mvebu-gicp: Add missing spin_lock init

Borislav Petkov <bp@suse.de>
    x86/mcelog: Get rid of RCU remnants

Tejun Heo <tj@kernel.org>
    perf/cgroup: Fix perf cgroup hierarchy support

Peter Zijlstra <peterz@infradead.org>
    futex: Fix more put_pi_state() vs. exit_pi_state_list() races

Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    powerpc/kprobes: Dereference function pointers only if the address does not belong to kernel text

Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    x86: CPU: Fix up "cpu MHz" in /proc/cpuinfo

Linus Torvalds <torvalds@linux-foundation.org>
    Revert "x86: do not use cpufreq_quick_get() for /proc/cpuinfo "cpu MHz""

Matt Redfearn <matt.redfearn@imgtec.com>
    MIPS: SMP: Fix deadlock & online race

Gustavo A. R. Silva <garsilva@embeddedor.com>
    MIPS: microMIPS: Fix incorrect mask in insn_table_MM

Jason A. Donenfeld <Jason@zx2c4.com>
    MIPS: smp-cmp: Use right include for task_struct

Wei Yongjun <weiyongjun1@huawei.com>
    MIPS: bpf: Fix a typo in build_one_insn()

Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Revert "powerpc64/elfv1: Only dereference function descriptor for non-text symbols"

Jani Nikula <jani.nikula@intel.com>
    drm/i915/edp: read edp display control registers unconditionally

Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    drm/i915: Do not rely on wm preservation for ILK watermarks

Huang Ying <ying.huang@intel.com>
    mm, swap: fix race between swap count continuation operations

Mike Kravetz <mike.kravetz@oracle.com>
    fs/hugetlbfs/inode.c: fix hwpoison reserve accounting

Ashish Samant <ashish.samant@oracle.com>
    ocfs2: fstrim: Fix start offset of first cluster group during fstrim

Andrea Arcangeli <aarcange@redhat.com>
    userfaultfd: hugetlbfs: prevent UFFDIO_COPY to fill beyond the end of i_size

Leo Liu <leo.liu@amd.com>
    drm/amdgpu: allow harvesting check for Polaris VCE

Leo Liu <leo.liu@amd.com>
    drm/amdgpu: return -ENOENT from uvd 6.0 early init for harvesting

Arnd Bergmann <arnd@arndb.de>
    ARM: 8715/1: add a private asm/unaligned.h

Yan Markman <ymarkman@marvell.com>
    ARM: dts: mvebu: pl310-cache disable double-linefill

Julien Thierry <julien.thierry@arm.com>
    arm/arm64: kvm: Disable branch profiling in HYP code

Dongjiu Geng <gengdongjiu@huawei.com>
    arm/arm64: KVM: set right LR register value for 32 bit guest when inject abort

Christoffer Dall <christoffer.dall@linaro.org>
    KVM: arm64: its: Fix missing dynamic allocation check in scan_its_table

Mark Rutland <mark.rutland@arm.com>
    arm64: ensure __dump_instr() checks addr_limit

Tero Kristo <t-kristo@ti.com>
    PM / QoS: Fix default runtime_pm device resume latency

Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    PM / QoS: Fix device resume latency PM QoS

Bart Van Assche <bart.vanassche@wdc.com>
    virtio_blk: Fix an SG_IO regression

Ricard Wanderlof <ricard.wanderlof@axis.com>
    ASoC: adau17x1: Workaround for noise bug in ADC

Eric Biggers <ebiggers@google.com>
    KEYS: fix out-of-bounds read during ASN.1 parsing

Eric Biggers <ebiggers@google.com>
    KEYS: trusted: fix writing past end of buffer in trusted_read()

Eric Biggers <ebiggers@google.com>
    KEYS: return full count in keyring_read() if buffer is too small

Ronnie Sahlberg <lsahlber@redhat.com>
    cifs: check MaxPathNameComponentLength != 0 before using it

Takashi Iwai <tiwai@suse.de>
    ALSA: seq: Fix nested rwsem annotation for lockdep splat

Takashi Iwai <tiwai@suse.de>
    ALSA: timer: Add missing mutex lock for compat ioctls


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

Diffstat:

 Documentation/ABI/testing/sysfs-devices-power |   4 +-
 Makefile                                      |   4 +-
 arch/arm/boot/dts/armada-375.dtsi             |   4 +-
 arch/arm/boot/dts/armada-38x.dtsi             |   4 +-
 arch/arm/boot/dts/armada-39x.dtsi             |   4 +-
 arch/arm/include/asm/Kbuild                   |   1 -
 arch/arm/include/asm/unaligned.h              |  27 ++++++
 arch/arm/kvm/emulate.c                        |   6 +-
 arch/arm/kvm/hyp/Makefile                     |   2 +-
 arch/arm64/kernel/traps.c                     |   2 +-
 arch/arm64/kvm/hyp/Makefile                   |   2 +-
 arch/arm64/kvm/inject_fault.c                 |  16 +++-
 arch/mips/kernel/smp-cmp.c                    |   2 +-
 arch/mips/kernel/smp.c                        |  22 +++--
 arch/mips/mm/uasm-micromips.c                 |   2 +-
 arch/mips/net/ebpf_jit.c                      |   2 +-
 arch/powerpc/include/asm/code-patching.h      |  10 +--
 arch/powerpc/kernel/kprobes.c                 |   7 +-
 arch/x86/kernel/cpu/Makefile                  |   2 +-
 arch/x86/kernel/cpu/aperfmperf.c              |  11 ++-
 arch/x86/kernel/cpu/mcheck/dev-mcelog.c       | 121 ++++++--------------------
 arch/x86/kernel/cpu/proc.c                    |  12 ++-
 drivers/base/cpu.c                            |   3 +-
 drivers/base/power/domain_governor.c          |  53 ++++++-----
 drivers/base/power/qos.c                      |   2 +-
 drivers/base/power/runtime.c                  |   2 +-
 drivers/base/power/sysfs.c                    |  25 +++++-
 drivers/block/virtio_blk.c                    |  12 +++
 drivers/cpuidle/governors/menu.c              |   4 +-
 drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c         |   4 +
 drivers/gpu/drm/amd/amdgpu/vce_v3_0.c         |  12 +--
 drivers/gpu/drm/i915/intel_dp.c               |  13 ++-
 drivers/gpu/drm/i915/intel_drv.h              |   1 -
 drivers/gpu/drm/i915/intel_pm.c               |  51 +++++------
 drivers/irqchip/irq-mvebu-gicp.c              |   1 +
 fs/cifs/dir.c                                 |   5 +-
 fs/hugetlbfs/inode.c                          |   5 +-
 fs/ocfs2/alloc.c                              |  24 +++--
 include/linux/pm_qos.h                        |   8 +-
 include/linux/swap.h                          |   4 +
 kernel/events/core.c                          |   6 +-
 kernel/futex.c                                |  23 ++++-
 lib/asn1_decoder.c                            |   3 +
 mm/hugetlb.c                                  |  32 ++++++-
 mm/swapfile.c                                 |  23 +++--
 security/keys/keyring.c                       |  39 ++++-----
 security/keys/trusted.c                       |  23 ++---
 sound/core/seq/seq_clientmgr.c                |   2 +-
 sound/core/timer_compat.c                     |  17 +++-
 sound/soc/codecs/adau17x1.c                   |  24 ++++-
 sound/soc/codecs/adau17x1.h                   |   2 +
 virt/kvm/arm/vgic/vgic-its.c                  |  18 ++--
 52 files changed, 427 insertions(+), 281 deletions(-)

^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2017-11-07 10:33 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-06  9:12 [4.13,35/36] x86/mcelog: Get rid of RCU remnants Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 35/36] " Greg Kroah-Hartman
  -- strict thread matches above, loose matches on Subject: below --
2017-11-06  9:12 [PATCH 4.13 00/36] 4.13.12-stable review Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 01/36] ALSA: timer: Add missing mutex lock for compat ioctls Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 02/36] ALSA: seq: Fix nested rwsem annotation for lockdep splat Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 03/36] cifs: check MaxPathNameComponentLength != 0 before using it Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 04/36] KEYS: return full count in keyring_read() if buffer is too small Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 05/36] KEYS: trusted: fix writing past end of buffer in trusted_read() Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 06/36] KEYS: fix out-of-bounds read during ASN.1 parsing Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 07/36] ASoC: adau17x1: Workaround for noise bug in ADC Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 08/36] virtio_blk: Fix an SG_IO regression Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 09/36] PM / QoS: Fix device resume latency PM QoS Greg Kroah-Hartman
2017-11-07  0:51   ` Rafael J. Wysocki
2017-11-07 10:32     ` Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 10/36] PM / QoS: Fix default runtime_pm device resume latency Greg Kroah-Hartman
2017-11-07  0:51   ` Rafael J. Wysocki
2017-11-06  9:12 ` [PATCH 4.13 11/36] arm64: ensure __dump_instr() checks addr_limit Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 12/36] KVM: arm64: its: Fix missing dynamic allocation check in scan_its_table Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 13/36] arm/arm64: KVM: set right LR register value for 32 bit guest when inject abort Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 14/36] arm/arm64: kvm: Disable branch profiling in HYP code Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 15/36] ARM: dts: mvebu: pl310-cache disable double-linefill Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 16/36] ARM: 8715/1: add a private asm/unaligned.h Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 17/36] drm/amdgpu: return -ENOENT from uvd 6.0 early init for harvesting Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 18/36] drm/amdgpu: allow harvesting check for Polaris VCE Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 19/36] userfaultfd: hugetlbfs: prevent UFFDIO_COPY to fill beyond the end of i_size Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 20/36] ocfs2: fstrim: Fix start offset of first cluster group during fstrim Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 21/36] fs/hugetlbfs/inode.c: fix hwpoison reserve accounting Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 22/36] mm, swap: fix race between swap count continuation operations Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 25/36] Revert "powerpc64/elfv1: Only dereference function descriptor for non-text symbols" Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 26/36] MIPS: bpf: Fix a typo in build_one_insn() Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 28/36] MIPS: microMIPS: Fix incorrect mask in insn_table_MM Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 29/36] MIPS: SMP: Fix deadlock & online race Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 30/36] Revert "x86: do not use cpufreq_quick_get() for /proc/cpuinfo "cpu MHz"" Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 31/36] x86: CPU: Fix up "cpu MHz" in /proc/cpuinfo Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 32/36] powerpc/kprobes: Dereference function pointers only if the address does not belong to kernel text Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 33/36] futex: Fix more put_pi_state() vs. exit_pi_state_list() races Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 34/36] perf/cgroup: Fix perf cgroup hierarchy support Greg Kroah-Hartman
2017-11-06  9:12 ` [PATCH 4.13 36/36] irqchip/irq-mvebu-gicp: Add missing spin_lock init Greg Kroah-Hartman
2017-11-06  9:12   ` Greg Kroah-Hartman
2017-11-06 21:18 ` [PATCH 4.13 00/36] 4.13.12-stable review Guenter Roeck
2017-11-06 23:27 ` Shuah Khan
2017-11-07 10:33   ` Greg Kroah-Hartman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.