Linux Audio

Check our new training course

Linux kernel drivers training

Mar 31-Apr 9, 2025, special US time zones
Register
Loading...
v4.6
 
  1/*
  2 * mm/balloon_compaction.c
  3 *
  4 * Common interface for making balloon pages movable by compaction.
  5 *
  6 * Copyright (C) 2012, Red Hat, Inc.  Rafael Aquini <aquini@redhat.com>
  7 */
  8#include <linux/mm.h>
  9#include <linux/slab.h>
 10#include <linux/export.h>
 11#include <linux/balloon_compaction.h>
 12
 13/*
 14 * balloon_page_enqueue - allocates a new page and inserts it into the balloon
 15 *			  page list.
 16 * @b_dev_info: balloon device descriptor where we will insert a new page to
 17 *
 18 * Driver must call it to properly allocate a new enlisted balloon page
 19 * before definitively removing it from the guest system.
 20 * This function returns the page address for the recently enqueued page or
 21 * NULL in the case we fail to allocate a new page this turn.
 22 */
 23struct page *balloon_page_enqueue(struct balloon_dev_info *b_dev_info)
 24{
 25	unsigned long flags;
 26	struct page *page = alloc_page(balloon_mapping_gfp_mask() |
 27					__GFP_NOMEMALLOC | __GFP_NORETRY);
 28	if (!page)
 29		return NULL;
 30
 31	/*
 32	 * Block others from accessing the 'page' when we get around to
 33	 * establishing additional references. We should be the only one
 34	 * holding a reference to the 'page' at this point.
 
 35	 */
 36	BUG_ON(!trylock_page(page));
 37	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
 38	balloon_page_insert(b_dev_info, page);
 
 39	__count_vm_event(BALLOON_INFLATE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 40	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
 41	unlock_page(page);
 42	return page;
 43}
 44EXPORT_SYMBOL_GPL(balloon_page_enqueue);
 45
 46/*
 47 * balloon_page_dequeue - removes a page from balloon's page list and returns
 48 *			  the its address to allow the driver release the page.
 49 * @b_dev_info: balloon device decriptor where we will grab a page from.
 
 
 
 
 
 
 
 50 *
 51 * Driver must call it to properly de-allocate a previous enlisted balloon page
 52 * before definetively releasing it back to the guest system.
 53 * This function returns the page address for the recently dequeued page or
 54 * NULL in the case we find balloon's page list temporarily empty due to
 55 * compaction isolated pages.
 56 */
 57struct page *balloon_page_dequeue(struct balloon_dev_info *b_dev_info)
 
 58{
 59	struct page *page, *tmp;
 60	unsigned long flags;
 61	bool dequeued_page;
 62
 63	dequeued_page = false;
 64	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
 65	list_for_each_entry_safe(page, tmp, &b_dev_info->pages, lru) {
 
 
 
 66		/*
 67		 * Block others from accessing the 'page' while we get around
 68		 * establishing additional references and preparing the 'page'
 69		 * to be released by the balloon driver.
 70		 */
 71		if (trylock_page(page)) {
 72#ifdef CONFIG_BALLOON_COMPACTION
 73			if (!PagePrivate(page)) {
 74				/* raced with isolation */
 75				unlock_page(page);
 76				continue;
 77			}
 78#endif
 79			balloon_page_delete(page);
 80			__count_vm_event(BALLOON_DEFLATE);
 81			unlock_page(page);
 82			dequeued_page = true;
 83			break;
 84		}
 
 
 
 
 
 85	}
 86	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
 87
 88	if (!dequeued_page) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 89		/*
 90		 * If we are unable to dequeue a balloon page because the page
 91		 * list is empty and there is no isolated pages, then something
 92		 * went out of track and some balloon pages are lost.
 93		 * BUG() here, otherwise the balloon driver may get stuck into
 94		 * an infinite loop while attempting to release all its pages.
 95		 */
 96		spin_lock_irqsave(&b_dev_info->pages_lock, flags);
 97		if (unlikely(list_empty(&b_dev_info->pages) &&
 98			     !b_dev_info->isolated_pages))
 99			BUG();
100		spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
101		page = NULL;
102	}
103	return page;
104}
105EXPORT_SYMBOL_GPL(balloon_page_dequeue);
106
107#ifdef CONFIG_BALLOON_COMPACTION
108
109static inline void __isolate_balloon_page(struct page *page)
 
110{
111	struct balloon_dev_info *b_dev_info = balloon_page_device(page);
112	unsigned long flags;
113
114	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
115	ClearPagePrivate(page);
116	list_del(&page->lru);
117	b_dev_info->isolated_pages++;
118	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
 
 
119}
120
121static inline void __putback_balloon_page(struct page *page)
122{
123	struct balloon_dev_info *b_dev_info = balloon_page_device(page);
124	unsigned long flags;
125
126	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
127	SetPagePrivate(page);
128	list_add(&page->lru, &b_dev_info->pages);
129	b_dev_info->isolated_pages--;
130	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
131}
132
133/* __isolate_lru_page() counterpart for a ballooned page */
134bool balloon_page_isolate(struct page *page)
135{
136	/*
137	 * Avoid burning cycles with pages that are yet under __free_pages(),
138	 * or just got freed under us.
139	 *
140	 * In case we 'win' a race for a balloon page being freed under us and
141	 * raise its refcount preventing __free_pages() from doing its job
142	 * the put_page() at the end of this block will take care of
143	 * release this page, thus avoiding a nasty leakage.
144	 */
145	if (likely(get_page_unless_zero(page))) {
146		/*
147		 * As balloon pages are not isolated from LRU lists, concurrent
148		 * compaction threads can race against page migration functions
149		 * as well as race against the balloon driver releasing a page.
150		 *
151		 * In order to avoid having an already isolated balloon page
152		 * being (wrongly) re-isolated while it is under migration,
153		 * or to avoid attempting to isolate pages being released by
154		 * the balloon driver, lets be sure we have the page lock
155		 * before proceeding with the balloon page isolation steps.
156		 */
157		if (likely(trylock_page(page))) {
158			/*
159			 * A ballooned page, by default, has PagePrivate set.
160			 * Prevent concurrent compaction threads from isolating
161			 * an already isolated balloon page by clearing it.
162			 */
163			if (balloon_page_movable(page)) {
164				__isolate_balloon_page(page);
165				unlock_page(page);
166				return true;
167			}
168			unlock_page(page);
169		}
170		put_page(page);
171	}
172	return false;
173}
174
175/* putback_lru_page() counterpart for a ballooned page */
176void balloon_page_putback(struct page *page)
177{
178	/*
179	 * 'lock_page()' stabilizes the page and prevents races against
180	 * concurrent isolation threads attempting to re-isolate it.
181	 */
182	lock_page(page);
183
184	if (__is_movable_balloon_page(page)) {
185		__putback_balloon_page(page);
186		/* drop the extra ref count taken for page isolation */
187		put_page(page);
188	} else {
189		WARN_ON(1);
190		dump_page(page, "not movable balloon page");
191	}
192	unlock_page(page);
193}
194
195/* move_to_new_page() counterpart for a ballooned page */
196int balloon_page_migrate(struct page *newpage,
197			 struct page *page, enum migrate_mode mode)
 
198{
199	struct balloon_dev_info *balloon = balloon_page_device(page);
200	int rc = -EAGAIN;
 
 
 
 
 
 
 
201
202	VM_BUG_ON_PAGE(!PageLocked(page), page);
203	VM_BUG_ON_PAGE(!PageLocked(newpage), newpage);
204
205	if (WARN_ON(!__is_movable_balloon_page(page))) {
206		dump_page(page, "not movable balloon page");
207		return rc;
208	}
209
210	if (balloon && balloon->migratepage)
211		rc = balloon->migratepage(balloon, newpage, page, mode);
 
 
 
 
212
213	return rc;
214}
215#endif /* CONFIG_BALLOON_COMPACTION */
v5.4
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * mm/balloon_compaction.c
  4 *
  5 * Common interface for making balloon pages movable by compaction.
  6 *
  7 * Copyright (C) 2012, Red Hat, Inc.  Rafael Aquini <aquini@redhat.com>
  8 */
  9#include <linux/mm.h>
 10#include <linux/slab.h>
 11#include <linux/export.h>
 12#include <linux/balloon_compaction.h>
 13
 14static void balloon_page_enqueue_one(struct balloon_dev_info *b_dev_info,
 15				     struct page *page)
 
 
 
 
 
 
 
 
 
 16{
 
 
 
 
 
 
 17	/*
 18	 * Block others from accessing the 'page' when we get around to
 19	 * establishing additional references. We should be the only one
 20	 * holding a reference to the 'page' at this point. If we are not, then
 21	 * memory corruption is possible and we should stop execution.
 22	 */
 23	BUG_ON(!trylock_page(page));
 
 24	balloon_page_insert(b_dev_info, page);
 25	unlock_page(page);
 26	__count_vm_event(BALLOON_INFLATE);
 27}
 28
 29/**
 30 * balloon_page_list_enqueue() - inserts a list of pages into the balloon page
 31 *				 list.
 32 * @b_dev_info: balloon device descriptor where we will insert a new page to
 33 * @pages: pages to enqueue - allocated using balloon_page_alloc.
 34 *
 35 * Driver must call this function to properly enqueue balloon pages before
 36 * definitively removing them from the guest system.
 37 *
 38 * Return: number of pages that were enqueued.
 39 */
 40size_t balloon_page_list_enqueue(struct balloon_dev_info *b_dev_info,
 41				 struct list_head *pages)
 42{
 43	struct page *page, *tmp;
 44	unsigned long flags;
 45	size_t n_pages = 0;
 46
 47	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
 48	list_for_each_entry_safe(page, tmp, pages, lru) {
 49		list_del(&page->lru);
 50		balloon_page_enqueue_one(b_dev_info, page);
 51		n_pages++;
 52	}
 53	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
 54	return n_pages;
 
 55}
 56EXPORT_SYMBOL_GPL(balloon_page_list_enqueue);
 57
 58/**
 59 * balloon_page_list_dequeue() - removes pages from balloon's page list and
 60 *				 returns a list of the pages.
 61 * @b_dev_info: balloon device decriptor where we will grab a page from.
 62 * @pages: pointer to the list of pages that would be returned to the caller.
 63 * @n_req_pages: number of requested pages.
 64 *
 65 * Driver must call this function to properly de-allocate a previous enlisted
 66 * balloon pages before definitively releasing it back to the guest system.
 67 * This function tries to remove @n_req_pages from the ballooned pages and
 68 * return them to the caller in the @pages list.
 69 *
 70 * Note that this function may fail to dequeue some pages even if the balloon
 71 * isn't empty - since the page list can be temporarily empty due to compaction
 72 * of isolated pages.
 73 *
 74 * Return: number of pages that were added to the @pages list.
 75 */
 76size_t balloon_page_list_dequeue(struct balloon_dev_info *b_dev_info,
 77				 struct list_head *pages, size_t n_req_pages)
 78{
 79	struct page *page, *tmp;
 80	unsigned long flags;
 81	size_t n_pages = 0;
 82
 
 83	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
 84	list_for_each_entry_safe(page, tmp, &b_dev_info->pages, lru) {
 85		if (n_pages == n_req_pages)
 86			break;
 87
 88		/*
 89		 * Block others from accessing the 'page' while we get around to
 90		 * establishing additional references and preparing the 'page'
 91		 * to be released by the balloon driver.
 92		 */
 93		if (!trylock_page(page))
 94			continue;
 95
 96		if (IS_ENABLED(CONFIG_BALLOON_COMPACTION) &&
 97		    PageIsolated(page)) {
 98			/* raced with isolation */
 
 
 
 
 99			unlock_page(page);
100			continue;
 
101		}
102		balloon_page_delete(page);
103		__count_vm_event(BALLOON_DEFLATE);
104		list_add(&page->lru, pages);
105		unlock_page(page);
106		n_pages++;
107	}
108	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
109
110	return n_pages;
111}
112EXPORT_SYMBOL_GPL(balloon_page_list_dequeue);
113
114/*
115 * balloon_page_alloc - allocates a new page for insertion into the balloon
116 *			page list.
117 *
118 * Driver must call this function to properly allocate a new balloon page.
119 * Driver must call balloon_page_enqueue before definitively removing the page
120 * from the guest system.
121 *
122 * Return: struct page for the allocated page or NULL on allocation failure.
123 */
124struct page *balloon_page_alloc(void)
125{
126	struct page *page = alloc_page(balloon_mapping_gfp_mask() |
127				       __GFP_NOMEMALLOC | __GFP_NORETRY |
128				       __GFP_NOWARN);
129	return page;
130}
131EXPORT_SYMBOL_GPL(balloon_page_alloc);
132
133/*
134 * balloon_page_enqueue - inserts a new page into the balloon page list.
135 *
136 * @b_dev_info: balloon device descriptor where we will insert a new page
137 * @page: new page to enqueue - allocated using balloon_page_alloc.
138 *
139 * Drivers must call this function to properly enqueue a new allocated balloon
140 * page before definitively removing the page from the guest system.
141 *
142 * Drivers must not call balloon_page_enqueue on pages that have been pushed to
143 * a list with balloon_page_push before removing them with balloon_page_pop. To
144 * enqueue a list of pages, use balloon_page_list_enqueue instead.
145 */
146void balloon_page_enqueue(struct balloon_dev_info *b_dev_info,
147			  struct page *page)
148{
149	unsigned long flags;
150
151	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
152	balloon_page_enqueue_one(b_dev_info, page);
153	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
154}
155EXPORT_SYMBOL_GPL(balloon_page_enqueue);
156
157/*
158 * balloon_page_dequeue - removes a page from balloon's page list and returns
159 *			  its address to allow the driver to release the page.
160 * @b_dev_info: balloon device decriptor where we will grab a page from.
161 *
162 * Driver must call this function to properly dequeue a previously enqueued page
163 * before definitively releasing it back to the guest system.
164 *
165 * Caller must perform its own accounting to ensure that this
166 * function is called only if some pages are actually enqueued.
167 *
168 * Note that this function may fail to dequeue some pages even if there are
169 * some enqueued pages - since the page list can be temporarily empty due to
170 * the compaction of isolated pages.
171 *
172 * TODO: remove the caller accounting requirements, and allow caller to wait
173 * until all pages can be dequeued.
174 *
175 * Return: struct page for the dequeued page, or NULL if no page was dequeued.
176 */
177struct page *balloon_page_dequeue(struct balloon_dev_info *b_dev_info)
178{
179	unsigned long flags;
180	LIST_HEAD(pages);
181	int n_pages;
182
183	n_pages = balloon_page_list_dequeue(b_dev_info, &pages, 1);
184
185	if (n_pages != 1) {
186		/*
187		 * If we are unable to dequeue a balloon page because the page
188		 * list is empty and there are no isolated pages, then something
189		 * went out of track and some balloon pages are lost.
190		 * BUG() here, otherwise the balloon driver may get stuck in
191		 * an infinite loop while attempting to release all its pages.
192		 */
193		spin_lock_irqsave(&b_dev_info->pages_lock, flags);
194		if (unlikely(list_empty(&b_dev_info->pages) &&
195			     !b_dev_info->isolated_pages))
196			BUG();
197		spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
198		return NULL;
199	}
200	return list_first_entry(&pages, struct page, lru);
201}
202EXPORT_SYMBOL_GPL(balloon_page_dequeue);
203
204#ifdef CONFIG_BALLOON_COMPACTION
205
206bool balloon_page_isolate(struct page *page, isolate_mode_t mode)
207
208{
209	struct balloon_dev_info *b_dev_info = balloon_page_device(page);
210	unsigned long flags;
211
212	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
 
213	list_del(&page->lru);
214	b_dev_info->isolated_pages++;
215	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
216
217	return true;
218}
219
220void balloon_page_putback(struct page *page)
221{
222	struct balloon_dev_info *b_dev_info = balloon_page_device(page);
223	unsigned long flags;
224
225	spin_lock_irqsave(&b_dev_info->pages_lock, flags);
 
226	list_add(&page->lru, &b_dev_info->pages);
227	b_dev_info->isolated_pages--;
228	spin_unlock_irqrestore(&b_dev_info->pages_lock, flags);
229}
230
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
232/* move_to_new_page() counterpart for a ballooned page */
233int balloon_page_migrate(struct address_space *mapping,
234		struct page *newpage, struct page *page,
235		enum migrate_mode mode)
236{
237	struct balloon_dev_info *balloon = balloon_page_device(page);
238
239	/*
240	 * We can not easily support the no copy case here so ignore it as it
241	 * is unlikely to be used with balloon pages. See include/linux/hmm.h
242	 * for a user of the MIGRATE_SYNC_NO_COPY mode.
243	 */
244	if (mode == MIGRATE_SYNC_NO_COPY)
245		return -EINVAL;
246
247	VM_BUG_ON_PAGE(!PageLocked(page), page);
248	VM_BUG_ON_PAGE(!PageLocked(newpage), newpage);
249
250	return balloon->migratepage(balloon, newpage, page, mode);
251}
 
 
252
253const struct address_space_operations balloon_aops = {
254	.migratepage = balloon_page_migrate,
255	.isolate_page = balloon_page_isolate,
256	.putback_page = balloon_page_putback,
257};
258EXPORT_SYMBOL_GPL(balloon_aops);
259
 
 
260#endif /* CONFIG_BALLOON_COMPACTION */