diff options
Diffstat (limited to 'mm/gup.c')
| -rw-r--r-- | mm/gup.c | 14 | 
1 files changed, 10 insertions, 4 deletions
| @@ -1647,8 +1647,11 @@ check_again:  		/*  		 * drop the above get_user_pages reference.  		 */ -		for (i = 0; i < nr_pages; i++) -			put_page(pages[i]); +		if (gup_flags & FOLL_PIN) +			unpin_user_pages(pages, nr_pages); +		else +			for (i = 0; i < nr_pages; i++) +				put_page(pages[i]);  		if (migrate_pages(&cma_page_list, alloc_migration_target, NULL,  			(unsigned long)&mtc, MIGRATE_SYNC, MR_CONTIG_RANGE)) { @@ -1728,8 +1731,11 @@ static long __gup_longterm_locked(struct mm_struct *mm,  			goto out;  		if (check_dax_vmas(vmas_tmp, rc)) { -			for (i = 0; i < rc; i++) -				put_page(pages[i]); +			if (gup_flags & FOLL_PIN) +				unpin_user_pages(pages, rc); +			else +				for (i = 0; i < rc; i++) +					put_page(pages[i]);  			rc = -EOPNOTSUPP;  			goto out;  		} | 
