Skip to content

Commit

Permalink
Merge tag 'mm-hotfixes-stable-2023-11-17-14-04' of git://git.kernel.o…
Browse files Browse the repository at this point in the history
…rg/pub/scm/linux/kernel/git/akpm/mm

Pull misc fixes from Andrew Morton:
 "Thirteen hotfixes. Seven are cc:stable and the remainder pertain to
  post-6.6 issues or aren't considered suitable for backporting"

* tag 'mm-hotfixes-stable-2023-11-17-14-04' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm:
  mm: more ptep_get() conversion
  parisc: fix mmap_base calculation when stack grows upwards
  mm/damon/core.c: avoid unintentional filtering out of schemes
  mm: kmem: drop __GFP_NOFAIL when allocating objcg vectors
  mm/damon/sysfs-schemes: handle tried region directory allocation failure
  mm/damon/sysfs-schemes: handle tried regions sysfs directory allocation failure
  mm/damon/sysfs: check error from damon_sysfs_update_target()
  mm: fix for negative counter: nr_file_hugepages
  selftests/mm: add hugetlb_fault_after_madv to .gitignore
  selftests/mm: restore number of hugepages
  selftests: mm: fix some build warnings
  selftests: mm: skip whole test instead of failure
  mm/damon/sysfs: eliminate potential uninitialized variable warning
  • Loading branch information
Linus Torvalds committed Nov 17, 2023
2 parents ffd75bc + afccb08 commit 12ee72f
Show file tree
Hide file tree
Showing 16 changed files with 57 additions and 38 deletions.
6 changes: 3 additions & 3 deletions arch/parisc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,11 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN
default 8

config ARCH_MMAP_RND_BITS_MAX
default 24 if 64BIT
default 17
default 18 if 64BIT
default 13

config ARCH_MMAP_RND_COMPAT_BITS_MAX
default 17
default 13

# unless you want to implement ACPI on PA-RISC ... ;-)
config PM
Expand Down
10 changes: 1 addition & 9 deletions arch/parisc/include/asm/elf.h
Original file line number Diff line number Diff line change
Expand Up @@ -349,15 +349,7 @@ struct pt_regs; /* forward declaration... */

#define ELF_HWCAP 0

/* Masks for stack and mmap randomization */
#define BRK_RND_MASK (is_32bit_task() ? 0x07ffUL : 0x3ffffUL)
#define MMAP_RND_MASK (is_32bit_task() ? 0x1fffUL : 0x3ffffUL)
#define STACK_RND_MASK MMAP_RND_MASK

struct mm_struct;
extern unsigned long arch_randomize_brk(struct mm_struct *);
#define arch_randomize_brk arch_randomize_brk

#define STACK_RND_MASK 0x7ff /* 8MB of VA */

#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
struct linux_binprm;
Expand Down
2 changes: 2 additions & 0 deletions arch/parisc/include/asm/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@

#ifndef __ASSEMBLY__

struct rlimit;
unsigned long mmap_upper_limit(struct rlimit *rlim_stack);
unsigned long calc_max_stack_size(unsigned long stack_max);

/*
Expand Down
2 changes: 1 addition & 1 deletion arch/parisc/kernel/sys_parisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ unsigned long calc_max_stack_size(unsigned long stack_max)
* indicating that "current" should be used instead of a passed-in
* value from the exec bprm as done with arch_pick_mmap_layout().
*/
static unsigned long mmap_upper_limit(struct rlimit *rlim_stack)
unsigned long mmap_upper_limit(struct rlimit *rlim_stack)
{
unsigned long stack_base;

Expand Down
2 changes: 1 addition & 1 deletion mm/damon/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -924,7 +924,7 @@ static bool __damos_filter_out(struct damon_ctx *ctx, struct damon_target *t,
matched = true;
break;
default:
break;
return false;
}

return matched == filter->matching;
Expand Down
5 changes: 5 additions & 0 deletions mm/damon/sysfs-schemes.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ damon_sysfs_scheme_regions_alloc(void)
struct damon_sysfs_scheme_regions *regions = kmalloc(sizeof(*regions),
GFP_KERNEL);

if (!regions)
return NULL;

regions->kobj = (struct kobject){};
INIT_LIST_HEAD(&regions->regions_list);
regions->nr_regions = 0;
Expand Down Expand Up @@ -1823,6 +1826,8 @@ static int damon_sysfs_before_damos_apply(struct damon_ctx *ctx,
return 0;

region = damon_sysfs_scheme_region_alloc(r);
if (!region)
return 0;
list_add_tail(&region->list, &sysfs_regions->regions_list);
sysfs_regions->nr_regions++;
if (kobject_init_and_add(&region->kobj,
Expand Down
6 changes: 4 additions & 2 deletions mm/damon/sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1172,7 +1172,7 @@ static int damon_sysfs_update_target(struct damon_target *target,
struct damon_ctx *ctx,
struct damon_sysfs_target *sys_target)
{
int err;
int err = 0;

if (damon_target_has_pid(ctx)) {
err = damon_sysfs_update_target_pid(target, sys_target->pid);
Expand Down Expand Up @@ -1203,8 +1203,10 @@ static int damon_sysfs_set_targets(struct damon_ctx *ctx,

damon_for_each_target_safe(t, next, ctx) {
if (i < sysfs_targets->nr) {
damon_sysfs_update_target(t, ctx,
err = damon_sysfs_update_target(t, ctx,
sysfs_targets->targets_arr[i]);
if (err)
return err;
} else {
if (damon_target_has_pid(ctx))
put_pid(t->pid);
Expand Down
2 changes: 1 addition & 1 deletion mm/filemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -3443,7 +3443,7 @@ static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf,
* handled in the specific fault path, and it'll prohibit the
* fault-around logic.
*/
if (!pte_none(vmf->pte[count]))
if (!pte_none(ptep_get(&vmf->pte[count])))
goto skip;

count++;
Expand Down
16 changes: 9 additions & 7 deletions mm/huge_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -2769,13 +2769,15 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
int nr = folio_nr_pages(folio);

xas_split(&xas, folio, folio_order(folio));
if (folio_test_swapbacked(folio)) {
__lruvec_stat_mod_folio(folio, NR_SHMEM_THPS,
-nr);
} else {
__lruvec_stat_mod_folio(folio, NR_FILE_THPS,
-nr);
filemap_nr_thps_dec(mapping);
if (folio_test_pmd_mappable(folio)) {
if (folio_test_swapbacked(folio)) {
__lruvec_stat_mod_folio(folio,
NR_SHMEM_THPS, -nr);
} else {
__lruvec_stat_mod_folio(folio,
NR_FILE_THPS, -nr);
filemap_nr_thps_dec(mapping);
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion mm/ksm.c
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ static int break_ksm_pmd_entry(pmd_t *pmd, unsigned long addr, unsigned long nex
page = pfn_swap_entry_to_page(entry);
}
/* return 1 if the page is an normal ksm page or KSM-placed zero page */
ret = (page && PageKsm(page)) || is_ksm_zero_pte(*pte);
ret = (page && PageKsm(page)) || is_ksm_zero_pte(ptent);
pte_unmap_unlock(pte, ptl);
return ret;
}
Expand Down
3 changes: 2 additions & 1 deletion mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2936,7 +2936,8 @@ void mem_cgroup_commit_charge(struct folio *folio, struct mem_cgroup *memcg)
* Moreover, it should not come from DMA buffer and is not readily
* reclaimable. So those GFP bits should be masked off.
*/
#define OBJCGS_CLEAR_MASK (__GFP_DMA | __GFP_RECLAIMABLE | __GFP_ACCOUNT)
#define OBJCGS_CLEAR_MASK (__GFP_DMA | __GFP_RECLAIMABLE | \
__GFP_ACCOUNT | __GFP_NOFAIL)

/*
* mod_objcg_mlstate() may be called with irq enabled, so
Expand Down
2 changes: 1 addition & 1 deletion mm/userfaultfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ static int mfill_atomic_pte_poison(pmd_t *dst_pmd,

ret = -EEXIST;
/* Refuse to overwrite any PTE, even a PTE marker (e.g. UFFD WP). */
if (!pte_none(*dst_pte))
if (!pte_none(ptep_get(dst_pte)))
goto out_unlock;

set_pte_at(dst_mm, dst_addr, dst_pte, _dst_pte);
Expand Down
10 changes: 10 additions & 0 deletions mm/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,15 @@ static int mmap_is_legacy(struct rlimit *rlim_stack)

static unsigned long mmap_base(unsigned long rnd, struct rlimit *rlim_stack)
{
#ifdef CONFIG_STACK_GROWSUP
/*
* For an upwards growing stack the calculation is much simpler.
* Memory for the maximum stack size is reserved at the top of the
* task. mmap_base starts directly below the stack and grows
* downwards.
*/
return PAGE_ALIGN_DOWN(mmap_upper_limit(rlim_stack) - rnd);
#else
unsigned long gap = rlim_stack->rlim_cur;
unsigned long pad = stack_guard_gap;

Expand All @@ -431,6 +440,7 @@ static unsigned long mmap_base(unsigned long rnd, struct rlimit *rlim_stack)
gap = MAX_GAP;

return PAGE_ALIGN(STACK_TOP - gap - rnd);
#endif
}

void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack)
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/mm/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,4 @@ mdwe_test
gup_longterm
mkdirty
va_high_addr_switch
hugetlb_fault_after_madv
23 changes: 12 additions & 11 deletions tools/testing/selftests/mm/pagemap_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,19 @@ int init_uffd(void)

uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK | UFFD_USER_MODE_ONLY);
if (uffd == -1)
ksft_exit_fail_msg("uffd syscall failed\n");
return uffd;

uffdio_api.api = UFFD_API;
uffdio_api.features = UFFD_FEATURE_WP_UNPOPULATED | UFFD_FEATURE_WP_ASYNC |
UFFD_FEATURE_WP_HUGETLBFS_SHMEM;
if (ioctl(uffd, UFFDIO_API, &uffdio_api))
ksft_exit_fail_msg("UFFDIO_API\n");
return -1;

if (!(uffdio_api.api & UFFDIO_REGISTER_MODE_WP) ||
!(uffdio_api.features & UFFD_FEATURE_WP_UNPOPULATED) ||
!(uffdio_api.features & UFFD_FEATURE_WP_ASYNC) ||
!(uffdio_api.features & UFFD_FEATURE_WP_HUGETLBFS_SHMEM))
ksft_exit_fail_msg("UFFDIO_API error %llu\n", uffdio_api.api);
return -1;

return 0;
}
Expand Down Expand Up @@ -1151,15 +1151,15 @@ int sanity_tests(void)
/* 9. Memory mapped file */
fd = open(__FILE__, O_RDONLY);
if (fd < 0)
ksft_exit_fail_msg("%s Memory mapped file\n");
ksft_exit_fail_msg("%s Memory mapped file\n", __func__);

ret = stat(__FILE__, &sbuf);
if (ret < 0)
ksft_exit_fail_msg("error %d %d %s\n", ret, errno, strerror(errno));

fmem = mmap(NULL, sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (fmem == MAP_FAILED)
ksft_exit_fail_msg("error nomem %ld %s\n", errno, strerror(errno));
ksft_exit_fail_msg("error nomem %d %s\n", errno, strerror(errno));

tmp_buf = malloc(sbuf.st_size);
memcpy(tmp_buf, fmem, sbuf.st_size);
Expand Down Expand Up @@ -1189,7 +1189,7 @@ int sanity_tests(void)

fmem = mmap(NULL, buf_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (fmem == MAP_FAILED)
ksft_exit_fail_msg("error nomem %ld %s\n", errno, strerror(errno));
ksft_exit_fail_msg("error nomem %d %s\n", errno, strerror(errno));

wp_init(fmem, buf_size);
wp_addr_range(fmem, buf_size);
Expand Down Expand Up @@ -1479,6 +1479,10 @@ int main(void)
struct stat sbuf;

ksft_print_header();

if (init_uffd())
return ksft_exit_pass();

ksft_set_plan(115);

page_size = getpagesize();
Expand All @@ -1488,9 +1492,6 @@ int main(void)
if (pagemap_fd < 0)
return -EINVAL;

if (init_uffd())
ksft_exit_fail_msg("uffd init failed\n");

/* 1. Sanity testing */
sanity_tests_sd();

Expand Down Expand Up @@ -1595,7 +1596,7 @@ int main(void)

fmem = mmap(NULL, sbuf.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (fmem == MAP_FAILED)
ksft_exit_fail_msg("error nomem %ld %s\n", errno, strerror(errno));
ksft_exit_fail_msg("error nomem %d %s\n", errno, strerror(errno));

wp_init(fmem, sbuf.st_size);
wp_addr_range(fmem, sbuf.st_size);
Expand Down Expand Up @@ -1623,7 +1624,7 @@ int main(void)

fmem = mmap(NULL, buf_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (fmem == MAP_FAILED)
ksft_exit_fail_msg("error nomem %ld %s\n", errno, strerror(errno));
ksft_exit_fail_msg("error nomem %d %s\n", errno, strerror(errno));

wp_init(fmem, buf_size);
wp_addr_range(fmem, buf_size);
Expand Down
3 changes: 3 additions & 0 deletions tools/testing/selftests/mm/run_vmtests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,12 @@ CATEGORY="hugetlb" run_test ./hugepage-mremap
CATEGORY="hugetlb" run_test ./hugepage-vmemmap
CATEGORY="hugetlb" run_test ./hugetlb-madvise

nr_hugepages_tmp=$(cat /proc/sys/vm/nr_hugepages)
# For this test, we need one and just one huge page
echo 1 > /proc/sys/vm/nr_hugepages
CATEGORY="hugetlb" run_test ./hugetlb_fault_after_madv
# Restore the previous number of huge pages, since further tests rely on it
echo "$nr_hugepages_tmp" > /proc/sys/vm/nr_hugepages

if test_selected "hugetlb"; then
echo "NOTE: These hugetlb tests provide minimal coverage. Use"
Expand Down

0 comments on commit 12ee72f

Please sign in to comment.