Commit 50eb842f authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'akpm' (patches from Andrew)

Merge misc fixes from Andrew Morton:
 "28 patches.

  Subsystems affected by this series: mm (memblock, pagealloc, hugetlb,
  highmem, kfence, oom-kill, madvise, kasan, userfaultfd, memcg, and
  zram), core-kernel, kconfig, fork, binfmt, MAINTAINERS, kbuild, and
  ia64"

* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (28 commits)
  zram: fix broken page writeback
  zram: fix return value on writeback_store
  mm/memcg: set memcg when splitting page
  mm/memcg: rename mem_cgroup_split_huge_fixup to split_page_memcg and add nr_pages argument
  ia64: fix ptrace(PTRACE_SYSCALL_INFO_EXIT) sign
  ia64: fix ia64_syscall_get_set_arguments() for break-based syscalls
  mm/userfaultfd: fix memory corruption due to writeprotect
  kasan: fix KASAN_STACK dependency for HW_TAGS
  kasan, mm: fix crash with HW_TAGS and DEBUG_PAGEALLOC
  mm/madvise: replace ptrace attach requirement for process_madvise
  include/linux/sched/mm.h: use rcu_dereference in in_vfork()
  kfence: fix reports if constant function prefixes exist
  kfence, slab: fix cache_alloc_debugcheck_after() for bulk allocations
  kfence: fix printk format for ptrdiff_t
  linux/compiler-clang.h: define HAVE_BUILTIN_BSWAP*
  MAINTAINERS: exclude uapi directories in API/ABI section
  binfmt_misc: fix possible deadlock in bm_register_write
  mm/highmem.c: fix zero_user_segments() with start > end
  hugetlb: do early cow when page pinned on src mm
  mm: use is_cow_mapping() across tree where proper
  ...
parents 88fe4924 2766f182
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -261,8 +261,8 @@ ABI/API
L:	linux-api@vger.kernel.org
F:	include/linux/syscalls.h
F:	kernel/sys_ni.c
F:	include/uapi/
F:	arch/*/include/uapi/
X:	include/uapi/
X:	arch/*/include/uapi/
ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
M:	Hans de Goede <hdegoede@redhat.com>
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ static inline void syscall_rollback(struct task_struct *task,
static inline long syscall_get_error(struct task_struct *task,
				     struct pt_regs *regs)
{
	return regs->r10 == -1 ? regs->r8:0;
	return regs->r10 == -1 ? -regs->r8:0;
}

static inline long syscall_get_return_value(struct task_struct *task,
+18 −6
Original line number Diff line number Diff line
@@ -2013,27 +2013,39 @@ static void syscall_get_set_args_cb(struct unw_frame_info *info, void *data)
{
	struct syscall_get_set_args *args = data;
	struct pt_regs *pt = args->regs;
	unsigned long *krbs, cfm, ndirty;
	unsigned long *krbs, cfm, ndirty, nlocals, nouts;
	int i, count;

	if (unw_unwind_to_user(info) < 0)
		return;

	/*
	 * We get here via a few paths:
	 * - break instruction: cfm is shared with caller.
	 *   syscall args are in out= regs, locals are non-empty.
	 * - epsinstruction: cfm is set by br.call
	 *   locals don't exist.
	 *
	 * For both cases argguments are reachable in cfm.sof - cfm.sol.
	 * CFM: [ ... | sor: 17..14 | sol : 13..7 | sof : 6..0 ]
	 */
	cfm = pt->cr_ifs;
	nlocals = (cfm >> 7) & 0x7f; /* aka sol */
	nouts = (cfm & 0x7f) - nlocals; /* aka sof - sol */
	krbs = (unsigned long *)info->task + IA64_RBS_OFFSET/8;
	ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19));

	count = 0;
	if (in_syscall(pt))
		count = min_t(int, args->n, cfm & 0x7f);
		count = min_t(int, args->n, nouts);

	/* Iterate over outs. */
	for (i = 0; i < count; i++) {
		int j = ndirty + nlocals + i + args->i;
		if (args->rw)
			*ia64_rse_skip_regs(krbs, ndirty + i + args->i) =
				args->args[i];
			*ia64_rse_skip_regs(krbs, j) = args->args[i];
		else
			args->args[i] = *ia64_rse_skip_regs(krbs,
				ndirty + i + args->i);
			args->args[i] = *ia64_rse_skip_regs(krbs, j);
	}

	if (!args->rw) {
+11 −6
Original line number Diff line number Diff line
@@ -627,7 +627,7 @@ static ssize_t writeback_store(struct device *dev,
	struct bio_vec bio_vec;
	struct page *page;
	ssize_t ret = len;
	int mode;
	int mode, err;
	unsigned long blk_idx = 0;

	if (sysfs_streq(buf, "idle"))
@@ -638,8 +638,8 @@ static ssize_t writeback_store(struct device *dev,
		if (strncmp(buf, PAGE_WB_SIG, sizeof(PAGE_WB_SIG) - 1))
			return -EINVAL;

		ret = kstrtol(buf + sizeof(PAGE_WB_SIG) - 1, 10, &index);
		if (ret || index >= nr_pages)
		if (kstrtol(buf + sizeof(PAGE_WB_SIG) - 1, 10, &index) ||
				index >= nr_pages)
			return -EINVAL;

		nr_pages = 1;
@@ -663,7 +663,7 @@ static ssize_t writeback_store(struct device *dev,
		goto release_init_lock;
	}

	while (nr_pages--) {
	for (; nr_pages != 0; index++, nr_pages--) {
		struct bio_vec bvec;

		bvec.bv_page = page;
@@ -728,12 +728,17 @@ static ssize_t writeback_store(struct device *dev,
		 * XXX: A single page IO would be inefficient for write
		 * but it would be not bad as starter.
		 */
		ret = submit_bio_wait(&bio);
		if (ret) {
		err = submit_bio_wait(&bio);
		if (err) {
			zram_slot_lock(zram, index);
			zram_clear_flag(zram, index, ZRAM_UNDER_WB);
			zram_clear_flag(zram, index, ZRAM_IDLE);
			zram_slot_unlock(zram, index);
			/*
			 * Return last IO error unless every IO were
			 * not suceeded.
			 */
			ret = err;
			continue;
		}

+1 −3
Original line number Diff line number Diff line
@@ -500,8 +500,6 @@ vm_fault_t vmw_bo_vm_huge_fault(struct vm_fault *vmf,
	vm_fault_t ret;
	pgoff_t fault_page_size;
	bool write = vmf->flags & FAULT_FLAG_WRITE;
	bool is_cow_mapping =
		(vma->vm_flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;

	switch (pe_size) {
	case PE_SIZE_PMD:
@@ -518,7 +516,7 @@ vm_fault_t vmw_bo_vm_huge_fault(struct vm_fault *vmf,
	}

	/* Always do write dirty-tracking and COW on PTE level. */
	if (write && (READ_ONCE(vbo->dirty) || is_cow_mapping))
	if (write && (READ_ONCE(vbo->dirty) || is_cow_mapping(vma->vm_flags)))
		return VM_FAULT_FALLBACK;

	ret = ttm_bo_vm_reserve(bo, vmf);
Loading