// SPDX-License-Identifier: GPL-2.0
/*
 *	linux/mm/mlock.c
 *
 *  (C) Copyright 1995 Linus Torvalds
 *  (C) Copyright 2002 Christoph Hellwig
 */

/* Extracted unchanged from Linux v6.0, mm/mlock.c:186-211.
 * Complete function definition; surrounding kernel context is required.
 * Source: https://github.com/torvalds/linux/blob/v6.0/mm/mlock.c#L186
 * License text: GPL-2.0.txt (in this directory).
 */
static void mlock_pagevec(struct pagevec *pvec)
{
	struct lruvec *lruvec = NULL;
	unsigned long mlock;
	struct page *page;
	int i;

	for (i = 0; i < pagevec_count(pvec); i++) {
		page = pvec->pages[i];
		mlock = (unsigned long)page & (LRU_PAGE | NEW_PAGE);
		page = (struct page *)((unsigned long)page - mlock);
		pvec->pages[i] = page;

		if (mlock & LRU_PAGE)
			lruvec = __mlock_page(page, lruvec);
		else if (mlock & NEW_PAGE)
			lruvec = __mlock_new_page(page, lruvec);
		else
			lruvec = __munlock_page(page, lruvec);
	}

	if (lruvec)
		unlock_page_lruvec_irq(lruvec);
	release_pages(pvec->pages, pvec->nr);
	pagevec_reinit(pvec);
}

