Unverified Commit 81f8d0d8 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!15123 mm, madvise: fix potential workingset node list_lru leaks

Merge Pull Request from: @ci-robot 
 
PR sync from: Wupeng Ma <mawupeng1@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/523SI6RN2QUIN3QBOCNUP25BCHX4Y5HR/ 
From: Ma Wupeng <mawupeng1@huawei.com>

fix potential workingset node list_lru leaks.

Christoph Hellwig (1):
  [Backport] mm: move mapping_set_update out of <linux/swap.h>

Kairui Song (1):
  [Backport] mm, madvise: fix potential workingset node list_lru leaks


-- 
2.43.0
 
https://gitee.com/openeuler/kernel/issues/IBMMCR 
 
Link:https://gitee.com/openeuler/kernel/pulls/15123

 

Reviewed-by: default avatarZhang Peng <zhangpeng362@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents a06323c9 f6aa763e
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -377,16 +377,6 @@ void *workingset_eviction(struct folio *folio, struct mem_cgroup *target_memcg);
void workingset_refault(struct folio *folio, void *shadow);
void workingset_activation(struct folio *folio);

/* Only track the nodes of mappings with shadow entries */
void workingset_update_node(struct xa_node *node);
extern struct list_lru shadow_nodes;
#define mapping_set_update(xas, mapping) do {				\
	if (!dax_mapping(mapping) && !shmem_mapping(mapping)) {		\
		xas_set_update(xas, workingset_update_node);		\
		xas_set_lru(xas, &shadow_nodes);			\
	}								\
} while (0)

/* linux/mm/page_alloc.c */
extern unsigned long totalreserve_pages;

+10 −0
Original line number Diff line number Diff line
@@ -1496,4 +1496,14 @@ void unlink_file_vma_batch_init(struct unlink_vma_file_batch *);
void unlink_file_vma_batch_add(struct unlink_vma_file_batch *, struct vm_area_struct *);
void unlink_file_vma_batch_final(struct unlink_vma_file_batch *);

/* Only track the nodes of mappings with shadow entries */
void workingset_update_node(struct xa_node *node);
extern struct list_lru shadow_nodes;
#define mapping_set_update(xas, mapping) do {			\
	if (!dax_mapping(mapping) && !shmem_mapping(mapping)) {	\
		xas_set_update(xas, workingset_update_node);	\
		xas_set_lru(xas, &shadow_nodes);		\
	}							\
} while (0)

#endif	/* __MM_INTERNAL_H */
+3 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/page_table_check.h>
#include <linux/swapops.h>
#include <linux/shmem_fs.h>
#include <linux/dax.h>
#include <linux/ksm.h>
#include <linux/dynamic_pool.h>

@@ -1835,6 +1836,8 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
	if (result != SCAN_SUCCEED)
		goto out;

	mapping_set_update(&xas, mapping);

	__folio_set_locked(new_folio);
	if (is_shmem)
		__folio_set_swapbacked(new_folio);
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/dax.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include "internal.h"

/*
 *		Double CLOCK lists