Commit 73a2c0bb authored by Nikita Panov's avatar Nikita Panov Committed by Denis Darvish
Browse files

mm: add apply_to_page_range() for replicated memory

kunpeng inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IBOJU2



-------------------------------------------------

Acked-by: default avatarArtem Kuzin <artem.kuzin@huawei.com>
Acked-by: default avatarAlexander Grubnikov <alexander.grubnikov@huawei.com>
Acked-by: default avatarIlya Hanov <ilya.hanov@huawei-partners.com>
Acked-by: default avatarDenis Darvish <darvish.denis@huawei.com>
Signed-off-by: default avatarNikita Panov <panov.nikita@huawei.com>
parent 1c434a44
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3787,6 +3787,10 @@ extern int apply_to_page_range(struct mm_struct *mm, unsigned long address,
extern int apply_to_existing_page_range(struct mm_struct *mm,
				   unsigned long address, unsigned long size,
				   pte_fn_t fn, void *data);
#ifdef CONFIG_KERNEL_REPLICATION
int apply_to_page_range_replicas(struct mm_struct *mm, unsigned long addr,
				 unsigned long size, pte_fn_t fn, void *data);
#endif /* CONFIG_KERNEL_REPLICATION && CONFIG_ARM64 */

#ifdef CONFIG_PAGE_POISONING
extern void __kernel_poison_pages(struct page *page, int numpages);
+26 −4
Original line number Diff line number Diff line
@@ -3026,7 +3026,7 @@ static int apply_to_p4d_range(struct mm_struct *mm, pgd_t *pgd,
	return err;
}

static int __apply_to_page_range(struct mm_struct *mm, unsigned long addr,
static int __apply_to_page_range(struct mm_struct *mm, pgd_t *pgtable, unsigned long addr,
				 unsigned long size, pte_fn_t fn,
				 void *data, bool create)
{
@@ -3039,7 +3039,7 @@ static int __apply_to_page_range(struct mm_struct *mm, unsigned long addr,
	if (WARN_ON(addr >= end))
		return -EINVAL;

	pgd = pgd_offset(mm, addr);
	pgd = pgd_offset_pgd(pgtable, addr);
	do {
		next = pgd_addr_end(addr, end);
		if (pgd_none(*pgd) && !create)
@@ -3070,10 +3070,32 @@ static int __apply_to_page_range(struct mm_struct *mm, unsigned long addr,
int apply_to_page_range(struct mm_struct *mm, unsigned long addr,
			unsigned long size, pte_fn_t fn, void *data)
{
	return __apply_to_page_range(mm, addr, size, fn, data, true);
	return __apply_to_page_range(mm, mm->pgd, addr, size, fn, data, true);
}
EXPORT_SYMBOL_GPL(apply_to_page_range);

#ifdef CONFIG_KERNEL_REPLICATION
/*
 * Same as apply_to_page_range(), but taking into account per-NUMA node
 * replicas.
 */
int apply_to_page_range_replicas(struct mm_struct *mm, unsigned long addr,
				 unsigned long size, pte_fn_t fn, void *data)
{
	int nid;
	int ret = 0;

	for_each_memory_node(nid) {
		ret = __apply_to_page_range(mm, per_node_pgd(mm, nid),
					    addr, size, fn, data, true);
		if (ret)
			break;
	}

	return ret;
}
#endif /* CONFIG_KERNEL_REPLICATION && CONFIG_ARM64 */

/*
 * Scan a region of virtual memory, calling a provided function on
 * each leaf page table where it exists.
@@ -3084,7 +3106,7 @@ EXPORT_SYMBOL_GPL(apply_to_page_range);
int apply_to_existing_page_range(struct mm_struct *mm, unsigned long addr,
				 unsigned long size, pte_fn_t fn, void *data)
{
	return __apply_to_page_range(mm, addr, size, fn, data, false);
	return __apply_to_page_range(mm, mm->pgd, addr, size, fn, data, false);
}
EXPORT_SYMBOL_GPL(apply_to_existing_page_range);