Commit b1a62749 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'akpm' (patches from Andrew)

Pull updates from Andrew Morton:
 "A few fixes and stragglers.

  Subsystems affected by this patch series: mm/memory-failure, ocfs2,
  lib/lzo, misc"

* emailed patches from Andrew Morton <akpm@linux-foundation.org>:
  amdgpu: a NULL ->mm does not mean a thread is a kthread
  lib/lzo: fix ambiguous encoding bug in lzo-rle
  ocfs2: fix build failure when TCP/IP is disabled
  mm/memory-failure: send SIGBUS(BUS_MCEERR_AR) only to current thread
  mm/memory-failure: prioritize prctl(PR_MCE_KILL) over vm.memory_failure_early_kill
parents b961f8dc 8449d150
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -159,11 +159,15 @@ Byte sequences
           distance = 16384 + (H << 14) + D
           state = S (copy S literals after this block)
           End of stream is reached if distance == 16384
           In version 1 only, to prevent ambiguity with the RLE case when
           ((distance & 0x803f) == 0x803f) && (261 <= length <= 264), the
           compressor must not emit block copies where distance and length
           meet these conditions.

        In version 1 only, this instruction is also used to encode a run of
           zeros if distance = 0xbfff, i.e. H = 1 and the D bits are all 1.
           In this case, it is followed by a fourth byte, X.
           run length = ((X << 3) | (0 0 0 0 0 L L L)) + 4.
           run length = ((X << 3) | (0 0 0 0 0 L L L)) + 4

      0 0 1 L L L L L  (32..63)
           Copy of small block within 16kB distance (preferably less than 34B)
+1 −1
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct kgd_dev *dst, struct kgd_dev *s
			pagefault_disable();				\
			if ((mmptr) == current->mm) {			\
				valid = !get_user((dst), (wptr));	\
			} else if (current->mm == NULL) {		\
			} else if (current->flags & PF_KTHREAD) {	\
				kthread_use_mm(mmptr);			\
				valid = !get_user((dst), (wptr));	\
				kthread_unuse_mm(mmptr);		\
+1 −1
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
config OCFS2_FS
	tristate "OCFS2 file system support"
	depends on NET && SYSFS && CONFIGFS_FS
	depends on INET && SYSFS && CONFIGFS_FS
	select JBD2
	select CRC32
	select QUOTA
+13 −0
Original line number Diff line number Diff line
@@ -268,6 +268,19 @@ m_len_done:
				*op++ = (M4_MARKER | ((m_off >> 11) & 8)
						| (m_len - 2));
			else {
				if (unlikely(((m_off & 0x403f) == 0x403f)
						&& (m_len >= 261)
						&& (m_len <= 264))
						&& likely(bitstream_version)) {
					// Under lzo-rle, block copies
					// for 261 <= length <= 264 and
					// (distance & 0x80f3) == 0x80f3
					// can result in ambiguous
					// output. Adjust length
					// to 260 to prevent ambiguity.
					ip -= m_len - 260;
					m_len = 260;
				}
				m_len -= M4_MAX_LEN;
				*op++ = (M4_MARKER | ((m_off >> 11) & 8));
				while (unlikely(m_len > 255)) {
+26 −17
Original line number Diff line number Diff line
@@ -212,15 +212,13 @@ static int kill_proc(struct to_kill *tk, unsigned long pfn, int flags)
	short addr_lsb = tk->size_shift;
	int ret = 0;

	if ((t->mm == current->mm) || !(flags & MF_ACTION_REQUIRED))
	pr_err("Memory failure: %#lx: Sending SIGBUS to %s:%d due to hardware memory corruption\n",
			pfn, t->comm, t->pid);

	if (flags & MF_ACTION_REQUIRED) {
		if (t->mm == current->mm)
		WARN_ON_ONCE(t != current);
		ret = force_sig_mceerr(BUS_MCEERR_AR,
					 (void __user *)tk->addr, addr_lsb);
		/* send no signal to non-current processes */
	} else {
		/*
		 * Don't use force here, it's convenient if the signal
@@ -402,9 +400,15 @@ static struct task_struct *find_early_kill_thread(struct task_struct *tsk)
{
	struct task_struct *t;

	for_each_thread(tsk, t)
		if ((t->flags & PF_MCE_PROCESS) && (t->flags & PF_MCE_EARLY))
	for_each_thread(tsk, t) {
		if (t->flags & PF_MCE_PROCESS) {
			if (t->flags & PF_MCE_EARLY)
				return t;
		} else {
			if (sysctl_memory_failure_early_kill)
				return t;
		}
	}
	return NULL;
}

@@ -413,22 +417,27 @@ static struct task_struct *find_early_kill_thread(struct task_struct *tsk)
 * to be signaled when some page under the process is hwpoisoned.
 * Return task_struct of the dedicated thread (main thread unless explicitly
 * specified) if the process is "early kill," and otherwise returns NULL.
 *
 * Note that the above is true for Action Optional case, but not for Action
 * Required case where SIGBUS should sent only to the current thread.
 */
static struct task_struct *task_early_kill(struct task_struct *tsk,
					   int force_early)
{
	struct task_struct *t;
	if (!tsk->mm)
		return NULL;
	if (force_early)
		return tsk;
	t = find_early_kill_thread(tsk);
	if (t)
		return t;
	if (sysctl_memory_failure_early_kill)
		return tsk;
	if (force_early) {
		/*
		 * Comparing ->mm here because current task might represent
		 * a subthread, while tsk always points to the main thread.
		 */
		if (tsk->mm == current->mm)
			return current;
		else
			return NULL;
	}
	return find_early_kill_thread(tsk);
}

/*
 * Collect processes when the error hit an anonymous page.