diff options
author | Daiane Angolini <daiane.angolini@foundries.io> | 2022-11-07 10:45:59 -0300 |
---|---|---|
committer | Daiane Angolini <daiane.angolini@foundries.io> | 2022-11-07 10:45:59 -0300 |
commit | 6d78b5c27405369a34f4d5af9d2ed6a93841ee80 (patch) | |
tree | 60ab9d661742a235f5db15902b8744aa53779547 /mm | |
parent | ac1185ae3d268bcc538ef3e580e1ef4ed20c1325 (diff) | |
parent | 1ded0ef2419e8f83a17d65594523ec3aeb2e3d0f (diff) |
Merge tag 'v5.15.64' into 5.15-2.1.x-imx
This is the 5.15.64 stable release
Conflicts:
net/dsa/slave.c
Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/backing-dev.c | 10 | ||||
-rw-r--r-- | mm/bootmem_info.c | 2 | ||||
-rw-r--r-- | mm/damon/dbgfs.c | 3 | ||||
-rw-r--r-- | mm/mmap.c | 8 | ||||
-rw-r--r-- | mm/page-writeback.c | 6 |
5 files changed, 21 insertions, 8 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 02c9d5c7276e..142e118ade87 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -258,10 +258,10 @@ void wb_wakeup_delayed(struct bdi_writeback *wb) unsigned long timeout; timeout = msecs_to_jiffies(dirty_writeback_interval * 10); - spin_lock_bh(&wb->work_lock); + spin_lock_irq(&wb->work_lock); if (test_bit(WB_registered, &wb->state)) queue_delayed_work(bdi_wq, &wb->dwork, timeout); - spin_unlock_bh(&wb->work_lock); + spin_unlock_irq(&wb->work_lock); } static void wb_update_bandwidth_workfn(struct work_struct *work) @@ -337,12 +337,12 @@ static void cgwb_remove_from_bdi_list(struct bdi_writeback *wb); static void wb_shutdown(struct bdi_writeback *wb) { /* Make sure nobody queues further work */ - spin_lock_bh(&wb->work_lock); + spin_lock_irq(&wb->work_lock); if (!test_and_clear_bit(WB_registered, &wb->state)) { - spin_unlock_bh(&wb->work_lock); + spin_unlock_irq(&wb->work_lock); return; } - spin_unlock_bh(&wb->work_lock); + spin_unlock_irq(&wb->work_lock); cgwb_remove_from_bdi_list(wb); /* diff --git a/mm/bootmem_info.c b/mm/bootmem_info.c index f03f42f426f6..8655492159a5 100644 --- a/mm/bootmem_info.c +++ b/mm/bootmem_info.c @@ -12,6 +12,7 @@ #include <linux/memblock.h> #include <linux/bootmem_info.h> #include <linux/memory_hotplug.h> +#include <linux/kmemleak.h> void get_page_bootmem(unsigned long info, struct page *page, unsigned long type) { @@ -34,6 +35,7 @@ void put_page_bootmem(struct page *page) ClearPagePrivate(page); set_page_private(page, 0); INIT_LIST_HEAD(&page->lru); + kmemleak_free_part(page_to_virt(page), PAGE_SIZE); free_reserved_page(page); } } diff --git a/mm/damon/dbgfs.c b/mm/damon/dbgfs.c index 36624990b577..70a5cb977ed0 100644 --- a/mm/damon/dbgfs.c +++ b/mm/damon/dbgfs.c @@ -376,6 +376,9 @@ static int dbgfs_mk_context(char *name) return -ENOENT; new_dir = debugfs_create_dir(name, root); + /* Below check is required for a potential duplicated name case */ + if (IS_ERR(new_dir)) + return PTR_ERR(new_dir); dbgfs_dirs[dbgfs_nr_ctxs] = new_dir; new_ctx = dbgfs_new_ctx(); diff --git a/mm/mmap.c b/mm/mmap.c index 031fca1a7c65..b63336f6984c 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1684,8 +1684,12 @@ int vma_wants_writenotify(struct vm_area_struct *vma, pgprot_t vm_page_prot) pgprot_val(vm_pgprot_modify(vm_page_prot, vm_flags))) return 0; - /* Do we need to track softdirty? */ - if (IS_ENABLED(CONFIG_MEM_SOFT_DIRTY) && !(vm_flags & VM_SOFTDIRTY)) + /* + * Do we need to track softdirty? hugetlb does not support softdirty + * tracking yet. + */ + if (IS_ENABLED(CONFIG_MEM_SOFT_DIRTY) && !(vm_flags & VM_SOFTDIRTY) && + !is_vm_hugetlb_page(vma)) return 1; /* Specialty mapping? */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 4812a17b288c..8ca6617b2a72 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2755,6 +2755,7 @@ static void wb_inode_writeback_start(struct bdi_writeback *wb) static void wb_inode_writeback_end(struct bdi_writeback *wb) { + unsigned long flags; atomic_dec(&wb->writeback_inodes); /* * Make sure estimate of writeback throughput gets updated after @@ -2763,7 +2764,10 @@ static void wb_inode_writeback_end(struct bdi_writeback *wb) * that if multiple inodes end writeback at a similar time, they get * batched into one bandwidth update. */ - queue_delayed_work(bdi_wq, &wb->bw_dwork, BANDWIDTH_INTERVAL); + spin_lock_irqsave(&wb->work_lock, flags); + if (test_bit(WB_registered, &wb->state)) + queue_delayed_work(bdi_wq, &wb->bw_dwork, BANDWIDTH_INTERVAL); + spin_unlock_irqrestore(&wb->work_lock, flags); } int test_clear_page_writeback(struct page *page) |