// 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:268-284.
 * Complete function definition; surrounding kernel context is required.
 * Source: https://github.com/torvalds/linux/blob/v6.0/mm/mlock.c#L268
 * License text: GPL-2.0.txt (in this directory).
 */
void mlock_new_page(struct page *page)
{
	struct pagevec *pvec;
	int nr_pages = thp_nr_pages(page);

	local_lock(&mlock_pvec.lock);
	pvec = this_cpu_ptr(&mlock_pvec.vec);
	SetPageMlocked(page);
	mod_zone_page_state(page_zone(page), NR_MLOCK, nr_pages);
	__count_vm_events(UNEVICTABLE_PGMLOCKED, nr_pages);

	get_page(page);
	if (!pagevec_add(pvec, mlock_new(page)) ||
	    PageHead(page) || lru_cache_disabled())
		mlock_pagevec(pvec);
	local_unlock(&mlock_pvec.lock);
}

