Commit 086ee11b authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'akpm' (patches from Andrew)

Merge misc fixes from Andrew Morton:
 "12 patches.

  Subsystems affected by this patch series: MAINTAINERS, mailmap, memfd,
  and mm (hugetlb, kasan, hugetlbfs, pagemap, selftests, memcg, and
  slab)"

* emailed patches from Andrew Morton <akpm@linux-foundation.org>:
  selftests/memfd: clean up mapping in mfd_fail_write
  mailmap: update Roman Gushchin's email
  MAINTAINERS, SLAB: add Roman as reviewer, git tree
  MAINTAINERS: add Shakeel as a memcg co-maintainer
  MAINTAINERS: remove Vladimir from memcg maintainers
  MAINTAINERS: add Roman as a memcg co-maintainer
  selftest/vm: fix map_fixed_noreplace test failure
  mm: fix use-after-free bug when mm->mmap is reused after being freed
  hugetlbfs: fix a truncation issue in hugepages parameter
  kasan: test: prevent cache merging in kmem_cache_double_destroy
  mm/hugetlb: fix kernel crash with hugetlb mremap
  MAINTAINERS: add sysctl-next git tree
parents 2c8c230e fda153c8
...@@ -333,6 +333,9 @@ Rémi Denis-Courmont <rdenis@simphalempin.com> ...@@ -333,6 +333,9 @@ Rémi Denis-Courmont <rdenis@simphalempin.com>
Ricardo Ribalda <ribalda@kernel.org> <ricardo@ribalda.com> Ricardo Ribalda <ribalda@kernel.org> <ricardo@ribalda.com>
Ricardo Ribalda <ribalda@kernel.org> Ricardo Ribalda Delgado <ribalda@kernel.org> Ricardo Ribalda <ribalda@kernel.org> Ricardo Ribalda Delgado <ribalda@kernel.org>
Ricardo Ribalda <ribalda@kernel.org> <ricardo.ribalda@gmail.com> Ricardo Ribalda <ribalda@kernel.org> <ricardo.ribalda@gmail.com>
Roman Gushchin <roman.gushchin@linux.dev> <guro@fb.com>
Roman Gushchin <roman.gushchin@linux.dev> <guroan@gmail.com>
Roman Gushchin <roman.gushchin@linux.dev> <klamm@yandex-team.ru>
Ross Zwisler <zwisler@kernel.org> <ross.zwisler@linux.intel.com> Ross Zwisler <zwisler@kernel.org> <ross.zwisler@linux.intel.com>
Rudolf Marek <R.Marek@sh.cvut.cz> Rudolf Marek <R.Marek@sh.cvut.cz>
Rui Saraiva <rmps@joel.ist.utl.pt> Rui Saraiva <rmps@joel.ist.utl.pt>
......
...@@ -4913,7 +4913,8 @@ F: kernel/cgroup/cpuset.c ...@@ -4913,7 +4913,8 @@ F: kernel/cgroup/cpuset.c
CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG) CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG)
M: Johannes Weiner <hannes@cmpxchg.org> M: Johannes Weiner <hannes@cmpxchg.org>
M: Michal Hocko <mhocko@kernel.org> M: Michal Hocko <mhocko@kernel.org>
M: Vladimir Davydov <vdavydov.dev@gmail.com> M: Roman Gushchin <roman.gushchin@linux.dev>
M: Shakeel Butt <shakeelb@google.com>
L: cgroups@vger.kernel.org L: cgroups@vger.kernel.org
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Maintained S: Maintained
...@@ -15567,6 +15568,7 @@ M: Iurii Zaikin <yzaikin@google.com> ...@@ -15567,6 +15568,7 @@ M: Iurii Zaikin <yzaikin@google.com>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
L: linux-fsdevel@vger.kernel.org L: linux-fsdevel@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git sysctl-next
F: fs/proc/proc_sysctl.c F: fs/proc/proc_sysctl.c
F: include/linux/sysctl.h F: include/linux/sysctl.h
F: kernel/sysctl-test.c F: kernel/sysctl-test.c
...@@ -17760,8 +17762,10 @@ M: David Rientjes <rientjes@google.com> ...@@ -17760,8 +17762,10 @@ M: David Rientjes <rientjes@google.com>
M: Joonsoo Kim <iamjoonsoo.kim@lge.com> M: Joonsoo Kim <iamjoonsoo.kim@lge.com>
M: Andrew Morton <akpm@linux-foundation.org> M: Andrew Morton <akpm@linux-foundation.org>
M: Vlastimil Babka <vbabka@suse.cz> M: Vlastimil Babka <vbabka@suse.cz>
R: Roman Gushchin <roman.gushchin@linux.dev>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab.git
F: include/linux/sl?b*.h F: include/linux/sl?b*.h
F: mm/sl?b* F: mm/sl?b*
......
...@@ -869,11 +869,14 @@ static void kmem_cache_invalid_free(struct kunit *test) ...@@ -869,11 +869,14 @@ static void kmem_cache_invalid_free(struct kunit *test)
kmem_cache_destroy(cache); kmem_cache_destroy(cache);
} }
static void empty_cache_ctor(void *object) { }
static void kmem_cache_double_destroy(struct kunit *test) static void kmem_cache_double_destroy(struct kunit *test)
{ {
struct kmem_cache *cache; struct kmem_cache *cache;
cache = kmem_cache_create("test_cache", 200, 0, 0, NULL); /* Provide a constructor to prevent cache merging. */
cache = kmem_cache_create("test_cache", 200, 0, 0, empty_cache_ctor);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
kmem_cache_destroy(cache); kmem_cache_destroy(cache);
KUNIT_EXPECT_KASAN_FAIL(test, kmem_cache_destroy(cache)); KUNIT_EXPECT_KASAN_FAIL(test, kmem_cache_destroy(cache));
......
...@@ -4159,10 +4159,10 @@ static int __init hugepages_setup(char *s) ...@@ -4159,10 +4159,10 @@ static int __init hugepages_setup(char *s)
pr_warn("HugeTLB: architecture can't support node specific alloc, ignoring!\n"); pr_warn("HugeTLB: architecture can't support node specific alloc, ignoring!\n");
return 0; return 0;
} }
if (tmp >= nr_online_nodes)
goto invalid;
node = tmp; node = tmp;
p += count + 1; p += count + 1;
if (node < 0 || node >= nr_online_nodes)
goto invalid;
/* Parse hugepages */ /* Parse hugepages */
if (sscanf(p, "%lu%n", &tmp, &count) != 1) if (sscanf(p, "%lu%n", &tmp, &count) != 1)
goto invalid; goto invalid;
...@@ -4851,14 +4851,13 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, ...@@ -4851,14 +4851,13 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
} }
static void move_huge_pte(struct vm_area_struct *vma, unsigned long old_addr, static void move_huge_pte(struct vm_area_struct *vma, unsigned long old_addr,
unsigned long new_addr, pte_t *src_pte) unsigned long new_addr, pte_t *src_pte, pte_t *dst_pte)
{ {
struct hstate *h = hstate_vma(vma); struct hstate *h = hstate_vma(vma);
struct mm_struct *mm = vma->vm_mm; struct mm_struct *mm = vma->vm_mm;
pte_t *dst_pte, pte;
spinlock_t *src_ptl, *dst_ptl; spinlock_t *src_ptl, *dst_ptl;
pte_t pte;
dst_pte = huge_pte_offset(mm, new_addr, huge_page_size(h));
dst_ptl = huge_pte_lock(h, mm, dst_pte); dst_ptl = huge_pte_lock(h, mm, dst_pte);
src_ptl = huge_pte_lockptr(h, mm, src_pte); src_ptl = huge_pte_lockptr(h, mm, src_pte);
...@@ -4917,7 +4916,7 @@ int move_hugetlb_page_tables(struct vm_area_struct *vma, ...@@ -4917,7 +4916,7 @@ int move_hugetlb_page_tables(struct vm_area_struct *vma,
if (!dst_pte) if (!dst_pte)
break; break;
move_huge_pte(vma, old_addr, new_addr, src_pte); move_huge_pte(vma, old_addr, new_addr, src_pte, dst_pte);
} }
flush_tlb_range(vma, old_end - len, old_end); flush_tlb_range(vma, old_end - len, old_end);
mmu_notifier_invalidate_range_end(&range); mmu_notifier_invalidate_range_end(&range);
......
...@@ -3186,6 +3186,7 @@ void exit_mmap(struct mm_struct *mm) ...@@ -3186,6 +3186,7 @@ void exit_mmap(struct mm_struct *mm)
vma = remove_vma(vma); vma = remove_vma(vma);
cond_resched(); cond_resched();
} }
mm->mmap = NULL;
mmap_write_unlock(mm); mmap_write_unlock(mm);
vm_unacct_memory(nr_accounted); vm_unacct_memory(nr_accounted);
} }
......
...@@ -455,6 +455,7 @@ static void mfd_fail_write(int fd) ...@@ -455,6 +455,7 @@ static void mfd_fail_write(int fd)
printf("mmap()+mprotect() didn't fail as expected\n"); printf("mmap()+mprotect() didn't fail as expected\n");
abort(); abort();
} }
munmap(p, mfd_def_size);
} }
/* verify PUNCH_HOLE fails */ /* verify PUNCH_HOLE fails */
......
...@@ -17,9 +17,6 @@ ...@@ -17,9 +17,6 @@
#define MAP_FIXED_NOREPLACE 0x100000 #define MAP_FIXED_NOREPLACE 0x100000
#endif #endif
#define BASE_ADDRESS (256ul * 1024 * 1024)
static void dump_maps(void) static void dump_maps(void)
{ {
char cmd[32]; char cmd[32];
...@@ -28,18 +25,46 @@ static void dump_maps(void) ...@@ -28,18 +25,46 @@ static void dump_maps(void)
system(cmd); system(cmd);
} }
static unsigned long find_base_addr(unsigned long size)
{
void *addr;
unsigned long flags;
flags = MAP_PRIVATE | MAP_ANONYMOUS;
addr = mmap(NULL, size, PROT_NONE, flags, -1, 0);
if (addr == MAP_FAILED) {
printf("Error: couldn't map the space we need for the test\n");
return 0;
}
if (munmap(addr, size) != 0) {
printf("Error: couldn't map the space we need for the test\n");
return 0;
}
return (unsigned long)addr;
}
int main(void) int main(void)
{ {
unsigned long base_addr;
unsigned long flags, addr, size, page_size; unsigned long flags, addr, size, page_size;
char *p; char *p;
page_size = sysconf(_SC_PAGE_SIZE); page_size = sysconf(_SC_PAGE_SIZE);
//let's find a base addr that is free before we start the tests
size = 5 * page_size;
base_addr = find_base_addr(size);
if (!base_addr) {
printf("Error: couldn't map the space we need for the test\n");
return 1;
}
flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE; flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE;
// Check we can map all the areas we need below // Check we can map all the areas we need below
errno = 0; errno = 0;
addr = BASE_ADDRESS; addr = base_addr;
size = 5 * page_size; size = 5 * page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
...@@ -60,7 +85,7 @@ int main(void) ...@@ -60,7 +85,7 @@ int main(void)
printf("unmap() successful\n"); printf("unmap() successful\n");
errno = 0; errno = 0;
addr = BASE_ADDRESS + page_size; addr = base_addr + page_size;
size = 3 * page_size; size = 3 * page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p); printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
...@@ -80,7 +105,7 @@ int main(void) ...@@ -80,7 +105,7 @@ int main(void)
* +4 | free | new * +4 | free | new
*/ */
errno = 0; errno = 0;
addr = BASE_ADDRESS; addr = base_addr;
size = 5 * page_size; size = 5 * page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p); printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
...@@ -101,7 +126,7 @@ int main(void) ...@@ -101,7 +126,7 @@ int main(void)
* +4 | free | * +4 | free |
*/ */
errno = 0; errno = 0;
addr = BASE_ADDRESS + (2 * page_size); addr = base_addr + (2 * page_size);
size = page_size; size = page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p); printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
...@@ -121,7 +146,7 @@ int main(void) ...@@ -121,7 +146,7 @@ int main(void)
* +4 | free | new * +4 | free | new
*/ */
errno = 0; errno = 0;
addr = BASE_ADDRESS + (3 * page_size); addr = base_addr + (3 * page_size);
size = 2 * page_size; size = 2 * page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p); printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
...@@ -141,7 +166,7 @@ int main(void) ...@@ -141,7 +166,7 @@ int main(void)
* +4 | free | * +4 | free |
*/ */
errno = 0; errno = 0;
addr = BASE_ADDRESS; addr = base_addr;
size = 2 * page_size; size = 2 * page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p); printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
...@@ -161,7 +186,7 @@ int main(void) ...@@ -161,7 +186,7 @@ int main(void)
* +4 | free | * +4 | free |
*/ */
errno = 0; errno = 0;
addr = BASE_ADDRESS; addr = base_addr;
size = page_size; size = page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p); printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
...@@ -181,7 +206,7 @@ int main(void) ...@@ -181,7 +206,7 @@ int main(void)
* +4 | free | new * +4 | free | new
*/ */
errno = 0; errno = 0;
addr = BASE_ADDRESS + (4 * page_size); addr = base_addr + (4 * page_size);
size = page_size; size = page_size;
p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0); p = mmap((void *)addr, size, PROT_NONE, flags, -1, 0);
printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p); printf("mmap() @ 0x%lx-0x%lx p=%p result=%m\n", addr, addr + size, p);
...@@ -192,7 +217,7 @@ int main(void) ...@@ -192,7 +217,7 @@ int main(void)
return 1; return 1;
} }
addr = BASE_ADDRESS; addr = base_addr;
size = 5 * page_size; size = 5 * page_size;
if (munmap((void *)addr, size) != 0) { if (munmap((void *)addr, size) != 0) {
dump_maps(); dump_maps();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment