diff options
Diffstat (limited to 'mm/madvise.c')
| -rw-r--r-- | mm/madvise.c | 20 | 
1 files changed, 17 insertions, 3 deletions
| diff --git a/mm/madvise.c b/mm/madvise.c index 21261ff0466f..375cf32087e4 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *	linux/mm/madvise.c   * @@ -625,18 +626,26 @@ static int madvise_inject_error(int behavior,  {  	struct page *page;  	struct zone *zone; +	unsigned int order;  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; -	for (; start < end; start += PAGE_SIZE << -				compound_order(compound_head(page))) { + +	for (; start < end; start += PAGE_SIZE << order) {  		int ret;  		ret = get_user_pages_fast(start, 1, 0, &page);  		if (ret != 1)  			return ret; +		/* +		 * When soft offlining hugepages, after migrating the page +		 * we dissolve it, therefore in the second loop "page" will +		 * no longer be a compound page, and order will be 0. +		 */ +		order = compound_order(compound_head(page)); +  		if (PageHWPoison(page)) {  			put_page(page);  			continue; @@ -749,6 +758,9 @@ madvise_behavior_valid(int behavior)   *  MADV_DONTFORK - omit this area from child's address space when forking:   *		typically, to avoid COWing pages pinned by get_user_pages().   *  MADV_DOFORK - cancel MADV_DONTFORK: no longer omit this area when forking. + *  MADV_WIPEONFORK - present the child process with zero-filled memory in this + *              range after a fork. + *  MADV_KEEPONFORK - undo the effect of MADV_WIPEONFORK   *  MADV_HWPOISON - trigger memory error handler as if the given memory range   *		were corrupted by unrecoverable hardware memory failure.   *  MADV_SOFT_OFFLINE - try to soft-offline the given range of memory. @@ -769,7 +781,9 @@ madvise_behavior_valid(int behavior)   *  zero    - success   *  -EINVAL - start + len < 0, start is not page-aligned,   *		"behavior" is not a valid value, or application - *		is attempting to release locked or shared pages. + *		is attempting to release locked or shared pages, + *		or the specified address range includes file, Huge TLB, + *		MAP_SHARED or VMPFNMAP range.   *  -ENOMEM - addresses in the specified range are not currently   *		mapped, or are outside the AS of the process.   *  -EIO    - an I/O error occurred while paging in data. |