blob: 0d9f223d463e25e9341adb48ae1914b25421ab8d [file] [log] [blame]
Nadav Amit8b4770e2018-06-19 16:00:29 -07001// SPDX-License-Identifier: GPL-2.0
Dmitry Torokhov453dc652010-04-23 13:18:08 -04002/*
3 * VMware Balloon driver.
4 *
Nadav Amit8b4770e2018-06-19 16:00:29 -07005 * Copyright (C) 2000-2018, VMware, Inc. All Rights Reserved.
Dmitry Torokhov453dc652010-04-23 13:18:08 -04006 *
Dmitry Torokhov453dc652010-04-23 13:18:08 -04007 * This is VMware physical memory management driver for Linux. The driver
8 * acts like a "balloon" that can be inflated to reclaim physical pages by
9 * reserving them in the guest and invalidating them in the monitor,
10 * freeing up the underlying machine pages so they can be allocated to
11 * other guests. The balloon can also be deflated to allow the guest to
12 * use more physical memory. Higher level policies can control the sizes
13 * of balloons in VMs in order to manage physical memory resources.
14 */
15
16//#define DEBUG
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include <linux/types.h>
20#include <linux/kernel.h>
21#include <linux/mm.h>
Xavier Deguillardf220a802015-08-06 15:17:58 -070022#include <linux/vmalloc.h>
Dmitry Torokhov453dc652010-04-23 13:18:08 -040023#include <linux/sched.h>
24#include <linux/module.h>
25#include <linux/workqueue.h>
26#include <linux/debugfs.h>
27#include <linux/seq_file.h>
Philip P. Moltmann48e3d662015-08-06 15:18:01 -070028#include <linux/vmw_vmci_defs.h>
29#include <linux/vmw_vmci_api.h>
H. Peter Anvina10a5692010-05-09 01:13:42 -070030#include <asm/hypervisor.h>
Dmitry Torokhov453dc652010-04-23 13:18:08 -040031
32MODULE_AUTHOR("VMware, Inc.");
33MODULE_DESCRIPTION("VMware Memory Control (Balloon) Driver");
Philip P. Moltmann48e3d662015-08-06 15:18:01 -070034MODULE_VERSION("1.5.0.0-k");
Dmitry Torokhov453dc652010-04-23 13:18:08 -040035MODULE_ALIAS("dmi:*:svnVMware*:*");
36MODULE_ALIAS("vmware_vmmemctl");
37MODULE_LICENSE("GPL");
38
39/*
Nadav Amit622074a2018-09-20 10:30:11 -070040 * Use __GFP_HIGHMEM to allow pages from HIGHMEM zone. We don't allow wait
41 * (__GFP_RECLAIM) for huge page allocations. Use __GFP_NOWARN, to suppress page
42 * allocation failure warnings. Disallow access to emergency low-memory pools.
Dmitry Torokhov453dc652010-04-23 13:18:08 -040043 */
Nadav Amit622074a2018-09-20 10:30:11 -070044#define VMW_HUGE_PAGE_ALLOC_FLAGS (__GFP_HIGHMEM|__GFP_NOWARN| \
45 __GFP_NOMEMALLOC)
Dmitry Torokhov453dc652010-04-23 13:18:08 -040046
47/*
Nadav Amit622074a2018-09-20 10:30:11 -070048 * Use __GFP_HIGHMEM to allow pages from HIGHMEM zone. We allow lightweight
49 * reclamation (__GFP_NORETRY). Use __GFP_NOWARN, to suppress page allocation
50 * failure warnings. Disallow access to emergency low-memory pools.
Dmitry Torokhov453dc652010-04-23 13:18:08 -040051 */
Nadav Amit622074a2018-09-20 10:30:11 -070052#define VMW_PAGE_ALLOC_FLAGS (__GFP_HIGHMEM|__GFP_NOWARN| \
53 __GFP_NOMEMALLOC|__GFP_NORETRY)
Dmitry Torokhov453dc652010-04-23 13:18:08 -040054
Dmitry Torokhov55adaa42010-06-04 14:14:52 -070055/* Maximum number of refused pages we accumulate during inflation cycle */
56#define VMW_BALLOON_MAX_REFUSED 16
Dmitry Torokhov453dc652010-04-23 13:18:08 -040057
58/*
59 * Hypervisor communication port definitions.
60 */
61#define VMW_BALLOON_HV_PORT 0x5670
62#define VMW_BALLOON_HV_MAGIC 0x456c6d6f
Dmitry Torokhov453dc652010-04-23 13:18:08 -040063#define VMW_BALLOON_GUEST_ID 1 /* Linux */
64
Xavier Deguillardeb791002015-06-12 11:43:23 -070065enum vmwballoon_capabilities {
66 /*
67 * Bit 0 is reserved and not associated to any capability.
68 */
Philip P. Moltmann48e3d662015-08-06 15:18:01 -070069 VMW_BALLOON_BASIC_CMDS = (1 << 1),
70 VMW_BALLOON_BATCHED_CMDS = (1 << 2),
71 VMW_BALLOON_BATCHED_2M_CMDS = (1 << 3),
72 VMW_BALLOON_SIGNALLED_WAKEUP_CMD = (1 << 4),
Xavier Deguillardeb791002015-06-12 11:43:23 -070073};
74
Xavier Deguillardf220a802015-08-06 15:17:58 -070075#define VMW_BALLOON_CAPABILITIES (VMW_BALLOON_BASIC_CMDS \
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -070076 | VMW_BALLOON_BATCHED_CMDS \
Philip P. Moltmann48e3d662015-08-06 15:18:01 -070077 | VMW_BALLOON_BATCHED_2M_CMDS \
78 | VMW_BALLOON_SIGNALLED_WAKEUP_CMD)
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -070079
Nadav Amit25acbdd2018-09-20 10:30:14 -070080#define VMW_BALLOON_2M_ORDER (PMD_SHIFT - PAGE_SHIFT)
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -070081#define VMW_BALLOON_NUM_PAGE_SIZES (2)
Xavier Deguillardeb791002015-06-12 11:43:23 -070082
Xavier Deguillardf220a802015-08-06 15:17:58 -070083/*
84 * Backdoor commands availability:
85 *
86 * START, GET_TARGET and GUEST_ID are always available,
87 *
88 * VMW_BALLOON_BASIC_CMDS:
89 * LOCK and UNLOCK commands,
90 * VMW_BALLOON_BATCHED_CMDS:
91 * BATCHED_LOCK and BATCHED_UNLOCK commands.
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -070092 * VMW BALLOON_BATCHED_2M_CMDS:
Philip P. Moltmann48e3d662015-08-06 15:18:01 -070093 * BATCHED_2M_LOCK and BATCHED_2M_UNLOCK commands,
94 * VMW VMW_BALLOON_SIGNALLED_WAKEUP_CMD:
95 * VMW_BALLOON_CMD_VMCI_DOORBELL_SET command.
Xavier Deguillardf220a802015-08-06 15:17:58 -070096 */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -070097#define VMW_BALLOON_CMD_START 0
98#define VMW_BALLOON_CMD_GET_TARGET 1
99#define VMW_BALLOON_CMD_LOCK 2
100#define VMW_BALLOON_CMD_UNLOCK 3
101#define VMW_BALLOON_CMD_GUEST_ID 4
102#define VMW_BALLOON_CMD_BATCHED_LOCK 6
103#define VMW_BALLOON_CMD_BATCHED_UNLOCK 7
104#define VMW_BALLOON_CMD_BATCHED_2M_LOCK 8
105#define VMW_BALLOON_CMD_BATCHED_2M_UNLOCK 9
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700106#define VMW_BALLOON_CMD_VMCI_DOORBELL_SET 10
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700107
Nadav Amit68131182018-09-20 10:30:08 -0700108#define VMW_BALLOON_CMD_NUM 11
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400109
110/* error codes */
Xavier Deguillardeb791002015-06-12 11:43:23 -0700111#define VMW_BALLOON_SUCCESS 0
112#define VMW_BALLOON_FAILURE -1
113#define VMW_BALLOON_ERROR_CMD_INVALID 1
114#define VMW_BALLOON_ERROR_PPN_INVALID 2
115#define VMW_BALLOON_ERROR_PPN_LOCKED 3
116#define VMW_BALLOON_ERROR_PPN_UNLOCKED 4
117#define VMW_BALLOON_ERROR_PPN_PINNED 5
118#define VMW_BALLOON_ERROR_PPN_NOTNEEDED 6
119#define VMW_BALLOON_ERROR_RESET 7
120#define VMW_BALLOON_ERROR_BUSY 8
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400121
Xavier Deguillardeb791002015-06-12 11:43:23 -0700122#define VMW_BALLOON_SUCCESS_WITH_CAPABILITIES (0x03000000)
123
Nadav Amit10a95d52018-09-20 10:30:07 -0700124#define VMW_BALLOON_CMD_WITH_TARGET_MASK \
125 ((1UL << VMW_BALLOON_CMD_GET_TARGET) | \
126 (1UL << VMW_BALLOON_CMD_LOCK) | \
127 (1UL << VMW_BALLOON_CMD_UNLOCK) | \
128 (1UL << VMW_BALLOON_CMD_BATCHED_LOCK) | \
129 (1UL << VMW_BALLOON_CMD_BATCHED_UNLOCK) | \
130 (1UL << VMW_BALLOON_CMD_BATCHED_2M_LOCK) | \
131 (1UL << VMW_BALLOON_CMD_BATCHED_2M_UNLOCK))
132
Nadav Amit68131182018-09-20 10:30:08 -0700133static const char * const vmballoon_cmd_names[] = {
134 [VMW_BALLOON_CMD_START] = "start",
135 [VMW_BALLOON_CMD_GET_TARGET] = "target",
136 [VMW_BALLOON_CMD_LOCK] = "lock",
137 [VMW_BALLOON_CMD_UNLOCK] = "unlock",
138 [VMW_BALLOON_CMD_GUEST_ID] = "guestType",
139 [VMW_BALLOON_CMD_BATCHED_LOCK] = "batchLock",
140 [VMW_BALLOON_CMD_BATCHED_UNLOCK] = "batchUnlock",
141 [VMW_BALLOON_CMD_BATCHED_2M_LOCK] = "2m-lock",
142 [VMW_BALLOON_CMD_BATCHED_2M_UNLOCK] = "2m-unlock",
143 [VMW_BALLOON_CMD_VMCI_DOORBELL_SET] = "doorbellSet"
144};
145
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400146#ifdef CONFIG_DEBUG_FS
147struct vmballoon_stats {
148 unsigned int timer;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700149 unsigned int doorbell;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400150
Rakib Mullick2ca02df2011-11-02 13:40:07 -0700151 /* allocation statistics */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700152 unsigned int alloc[VMW_BALLOON_NUM_PAGE_SIZES];
153 unsigned int alloc_fail[VMW_BALLOON_NUM_PAGE_SIZES];
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700154 unsigned int refused_alloc[VMW_BALLOON_NUM_PAGE_SIZES];
155 unsigned int refused_free[VMW_BALLOON_NUM_PAGE_SIZES];
156 unsigned int free[VMW_BALLOON_NUM_PAGE_SIZES];
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400157
Nadav Amit68131182018-09-20 10:30:08 -0700158 /* Monitor operations. */
159 unsigned long ops[VMW_BALLOON_CMD_NUM];
160 unsigned long ops_fail[VMW_BALLOON_CMD_NUM];
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400161};
162
163#define STATS_INC(stat) (stat)++
164#else
165#define STATS_INC(stat)
166#endif
167
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700168static DEFINE_STATIC_KEY_TRUE(vmw_balloon_batching);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700169
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700170struct vmballoon_page_size {
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400171 /* list of reserved physical pages */
172 struct list_head pages;
173
174 /* transient list of non-balloonable pages */
175 struct list_head refused_pages;
Dmitry Torokhov55adaa42010-06-04 14:14:52 -0700176 unsigned int n_refused_pages;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700177};
178
Nadav Amit6c948752018-09-20 10:30:10 -0700179/**
180 * struct vmballoon_batch_entry - a batch entry for lock or unlock.
181 *
182 * @status: the status of the operation, which is written by the hypervisor.
183 * @reserved: reserved for future use. Must be set to zero.
184 * @pfn: the physical frame number of the page to be locked or unlocked.
185 */
186struct vmballoon_batch_entry {
187 u64 status : 5;
188 u64 reserved : PAGE_SHIFT - 5;
189 u64 pfn : 52;
190} __packed;
191
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700192struct vmballoon {
193 struct vmballoon_page_size page_sizes[VMW_BALLOON_NUM_PAGE_SIZES];
194
195 /* supported page sizes. 1 == 4k pages only, 2 == 4k and 2m pages */
196 unsigned supported_page_sizes;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400197
198 /* balloon size in pages */
199 unsigned int size;
200 unsigned int target;
201
202 /* reset flag */
203 bool reset_required;
204
Xavier Deguillardf220a802015-08-06 15:17:58 -0700205 unsigned long capabilities;
206
Nadav Amit6c948752018-09-20 10:30:10 -0700207 /**
208 * @batch_page: pointer to communication batch page.
209 *
210 * When batching is used, batch_page points to a page, which holds up to
211 * %VMW_BALLOON_BATCH_MAX_PAGES entries for locking or unlocking.
212 */
213 struct vmballoon_batch_entry *batch_page;
214
Xavier Deguillardf220a802015-08-06 15:17:58 -0700215 unsigned int batch_max_pages;
216 struct page *page;
217
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400218#ifdef CONFIG_DEBUG_FS
219 /* statistics */
220 struct vmballoon_stats stats;
221
222 /* debugfs file exporting statistics */
223 struct dentry *dbg_entry;
224#endif
225
226 struct sysinfo sysinfo;
227
228 struct delayed_work dwork;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700229
230 struct vmci_handle vmci_doorbell;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400231};
232
233static struct vmballoon balloon;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400234
Nadav Amit10a95d52018-09-20 10:30:07 -0700235static inline unsigned long
236__vmballoon_cmd(struct vmballoon *b, unsigned long cmd, unsigned long arg1,
237 unsigned long arg2, unsigned long *result)
238{
239 unsigned long status, dummy1, dummy2, dummy3, local_result;
240
Nadav Amit68131182018-09-20 10:30:08 -0700241 STATS_INC(b->stats.ops[cmd]);
242
Nadav Amit10a95d52018-09-20 10:30:07 -0700243 asm volatile ("inl %%dx" :
244 "=a"(status),
245 "=c"(dummy1),
246 "=d"(dummy2),
247 "=b"(local_result),
248 "=S"(dummy3) :
249 "0"(VMW_BALLOON_HV_MAGIC),
250 "1"(cmd),
251 "2"(VMW_BALLOON_HV_PORT),
252 "3"(arg1),
253 "4"(arg2) :
254 "memory");
255
256 /* update the result if needed */
257 if (result)
258 *result = (cmd == VMW_BALLOON_CMD_START) ? dummy1 :
259 local_result;
260
261 /* update target when applicable */
262 if (status == VMW_BALLOON_SUCCESS &&
263 ((1ul << cmd) & VMW_BALLOON_CMD_WITH_TARGET_MASK))
264 b->target = local_result;
265
Nadav Amit68131182018-09-20 10:30:08 -0700266 if (status != VMW_BALLOON_SUCCESS &&
267 status != VMW_BALLOON_SUCCESS_WITH_CAPABILITIES) {
268 STATS_INC(b->stats.ops_fail[cmd]);
269 pr_debug("%s: %s [0x%lx,0x%lx) failed, returned %ld\n",
270 __func__, vmballoon_cmd_names[cmd], arg1, arg2,
271 status);
272 }
273
Nadav Amit10a95d52018-09-20 10:30:07 -0700274 /* mark reset required accordingly */
275 if (status == VMW_BALLOON_ERROR_RESET)
276 b->reset_required = true;
277
278 return status;
279}
280
281static __always_inline unsigned long
282vmballoon_cmd(struct vmballoon *b, unsigned long cmd, unsigned long arg1,
283 unsigned long arg2)
284{
285 unsigned long dummy;
286
287 return __vmballoon_cmd(b, cmd, arg1, arg2, &dummy);
288}
289
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400290/*
291 * Send "start" command to the host, communicating supported version
292 * of the protocol.
293 */
Xavier Deguillardf220a802015-08-06 15:17:58 -0700294static bool vmballoon_send_start(struct vmballoon *b, unsigned long req_caps)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400295{
Nadav Amit10a95d52018-09-20 10:30:07 -0700296 unsigned long status, capabilities;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700297 bool success;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400298
Nadav Amit10a95d52018-09-20 10:30:07 -0700299 status = __vmballoon_cmd(b, VMW_BALLOON_CMD_START, req_caps, 0,
300 &capabilities);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700301
302 switch (status) {
303 case VMW_BALLOON_SUCCESS_WITH_CAPABILITIES:
304 b->capabilities = capabilities;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700305 success = true;
306 break;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700307 case VMW_BALLOON_SUCCESS:
308 b->capabilities = VMW_BALLOON_BASIC_CMDS;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700309 success = true;
310 break;
311 default:
312 success = false;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700313 }
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400314
Nadav Amit5081efd2018-06-19 16:00:25 -0700315 /*
316 * 2MB pages are only supported with batching. If batching is for some
317 * reason disabled, do not use 2MB pages, since otherwise the legacy
318 * mechanism is used with 2MB pages, causing a failure.
319 */
320 if ((b->capabilities & VMW_BALLOON_BATCHED_2M_CMDS) &&
321 (b->capabilities & VMW_BALLOON_BATCHED_CMDS))
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700322 b->supported_page_sizes = 2;
323 else
324 b->supported_page_sizes = 1;
325
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700326 return success;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400327}
328
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400329/*
330 * Communicate guest type to the host so that it can adjust ballooning
331 * algorithm to the one most appropriate for the guest. This command
332 * is normally issued after sending "start" command and is part of
333 * standard reset sequence.
334 */
335static bool vmballoon_send_guest_id(struct vmballoon *b)
336{
Nadav Amit10a95d52018-09-20 10:30:07 -0700337 unsigned long status;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400338
Nadav Amit10a95d52018-09-20 10:30:07 -0700339 status = vmballoon_cmd(b, VMW_BALLOON_CMD_GUEST_ID,
340 VMW_BALLOON_GUEST_ID, 0);
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400341
Nadav Amit10a95d52018-09-20 10:30:07 -0700342 if (status == VMW_BALLOON_SUCCESS)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400343 return true;
344
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400345 return false;
346}
347
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700348static u16 vmballoon_page_size(bool is_2m_page)
349{
350 if (is_2m_page)
Nadav Amit25acbdd2018-09-20 10:30:14 -0700351 return 1 << VMW_BALLOON_2M_ORDER;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700352
353 return 1;
354}
355
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400356/*
357 * Retrieve desired balloon size from the host.
358 */
Nadav Amit10a95d52018-09-20 10:30:07 -0700359static bool vmballoon_send_get_target(struct vmballoon *b)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400360{
361 unsigned long status;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400362 unsigned long limit;
363 u32 limit32;
364
365 /*
366 * si_meminfo() is cheap. Moreover, we want to provide dynamic
367 * max balloon size later. So let us call si_meminfo() every
368 * iteration.
369 */
370 si_meminfo(&b->sysinfo);
371 limit = b->sysinfo.totalram;
372
373 /* Ensure limit fits in 32-bits */
374 limit32 = (u32)limit;
375 if (limit != limit32)
376 return false;
377
Nadav Amit10a95d52018-09-20 10:30:07 -0700378 status = vmballoon_cmd(b, VMW_BALLOON_CMD_GET_TARGET, limit, 0);
379
380 if (status == VMW_BALLOON_SUCCESS)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400381 return true;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400382
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400383 return false;
384}
385
Nadav Amit622074a2018-09-20 10:30:11 -0700386static struct page *vmballoon_alloc_page(bool is_2m_page)
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700387{
388 if (is_2m_page)
Nadav Amit622074a2018-09-20 10:30:11 -0700389 return alloc_pages(VMW_HUGE_PAGE_ALLOC_FLAGS,
Nadav Amit25acbdd2018-09-20 10:30:14 -0700390 VMW_BALLOON_2M_ORDER);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700391
Nadav Amit622074a2018-09-20 10:30:11 -0700392 return alloc_page(VMW_PAGE_ALLOC_FLAGS);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700393}
394
395static void vmballoon_free_page(struct page *page, bool is_2m_page)
396{
397 if (is_2m_page)
Nadav Amit25acbdd2018-09-20 10:30:14 -0700398 __free_pages(page, VMW_BALLOON_2M_ORDER);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700399 else
400 __free_page(page);
401}
402
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400403/*
404 * Quickly release all pages allocated for the balloon. This function is
405 * called when host decides to "reset" balloon for one reason or another.
406 * Unlike normal "deflate" we do not (shall not) notify host of the pages
407 * being released.
408 */
409static void vmballoon_pop(struct vmballoon *b)
410{
411 struct page *page, *next;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700412 unsigned is_2m_pages;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400413
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700414 for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES;
415 is_2m_pages++) {
416 struct vmballoon_page_size *page_size =
417 &b->page_sizes[is_2m_pages];
418 u16 size_per_page = vmballoon_page_size(is_2m_pages);
419
420 list_for_each_entry_safe(page, next, &page_size->pages, lru) {
421 list_del(&page->lru);
422 vmballoon_free_page(page, is_2m_pages);
423 STATS_INC(b->stats.free[is_2m_pages]);
424 b->size -= size_per_page;
425 cond_resched();
426 }
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400427 }
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400428
Gil Kupferb23220f2018-06-01 00:47:47 -0700429 /* Clearing the batch_page unconditionally has no adverse effect */
430 free_page((unsigned long)b->batch_page);
431 b->batch_page = NULL;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400432}
433
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700434/**
435 * vmballoon_status_page - returns the status of (un)lock operation
436 *
437 * @b: pointer to the balloon.
438 * @idx: index for the page for which the operation is performed.
439 * @p: pointer to where the page struct is returned.
440 *
441 * Following a lock or unlock operation, returns the status of the operation for
442 * an individual page. Provides the page that the operation was performed on on
443 * the @page argument.
444 *
445 * Returns: The status of a lock or unlock operation for an individual page.
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400446 */
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700447static unsigned long vmballoon_status_page(struct vmballoon *b, int idx,
448 struct page **p)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400449{
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700450 if (static_branch_likely(&vmw_balloon_batching)) {
451 /* batching mode */
452 *p = pfn_to_page(b->batch_page[idx].pfn);
453 return b->batch_page[idx].status;
Xavier Deguillardef0f8f12015-06-12 11:43:22 -0700454 }
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400455
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700456 /* non-batching mode */
457 *p = b->page;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400458
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700459 /*
460 * If a failure occurs, the indication will be provided in the status
461 * of the entire operation, which is considered before the individual
462 * page status. So for non-batching mode, the indication is always of
463 * success.
464 */
465 return VMW_BALLOON_SUCCESS;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400466}
467
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700468/**
469 * vmballoon_lock_op - notifies the host about inflated/deflated pages.
470 * @b: pointer to the balloon.
471 * @num_pages: number of inflated/deflated pages.
472 * @is_2m_pages: whether the page(s) are 2M (or 4k).
473 * @lock: whether the operation is lock (or unlock).
474 *
475 * Notify the host about page(s) that were ballooned (or removed from the
476 * balloon) so that host can use it without fear that guest will need it (or
477 * stop using them since the VM does). Host may reject some pages, we need to
478 * check the return value and maybe submit a different page. The pages that are
479 * inflated/deflated are pointed by @b->page.
480 *
481 * Return: result as provided by the hypervisor.
482 */
483static unsigned long vmballoon_lock_op(struct vmballoon *b,
484 unsigned int num_pages,
485 bool is_2m_pages, bool lock)
Xavier Deguillardf220a802015-08-06 15:17:58 -0700486{
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700487 unsigned long cmd, pfn;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700488
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700489 if (static_branch_likely(&vmw_balloon_batching)) {
490 if (lock)
491 cmd = is_2m_pages ? VMW_BALLOON_CMD_BATCHED_2M_LOCK :
492 VMW_BALLOON_CMD_BATCHED_LOCK;
493 else
494 cmd = is_2m_pages ? VMW_BALLOON_CMD_BATCHED_2M_UNLOCK :
495 VMW_BALLOON_CMD_BATCHED_UNLOCK;
Nadav Amit10a95d52018-09-20 10:30:07 -0700496
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700497 pfn = PHYS_PFN(virt_to_phys(b->batch_page));
498 } else {
499 cmd = lock ? VMW_BALLOON_CMD_LOCK : VMW_BALLOON_CMD_UNLOCK;
500 pfn = page_to_pfn(b->page);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700501
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700502 /* In non-batching mode, PFNs must fit in 32-bit */
503 if (unlikely(pfn != (u32)pfn))
504 return VMW_BALLOON_ERROR_PPN_INVALID;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700505 }
506
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700507 return vmballoon_cmd(b, cmd, pfn, num_pages);
508}
509
510static int vmballoon_lock(struct vmballoon *b, unsigned int num_pages,
511 bool is_2m_pages)
512{
513 unsigned long batch_status;
514 int i;
515 u16 size_per_page = vmballoon_page_size(is_2m_pages);
516
517 batch_status = vmballoon_lock_op(b, num_pages, is_2m_pages, true);
518
Xavier Deguillardf220a802015-08-06 15:17:58 -0700519 for (i = 0; i < num_pages; i++) {
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700520 unsigned long status;
521 struct page *p;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700522 struct vmballoon_page_size *page_size =
523 &b->page_sizes[is_2m_pages];
Xavier Deguillardf220a802015-08-06 15:17:58 -0700524
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700525 status = vmballoon_status_page(b, i, &p);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700526
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700527 /*
528 * Failure of the whole batch overrides a single operation
529 * results.
530 */
531 if (batch_status != VMW_BALLOON_SUCCESS)
532 status = batch_status;
533
534 if (status == VMW_BALLOON_SUCCESS) {
535 /* track allocated page */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700536 list_add(&p->lru, &page_size->pages);
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700537
538 /* update balloon size */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700539 b->size += size_per_page;
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700540 continue;
541 }
542
543 /* Error occurred */
544 STATS_INC(b->stats.refused_alloc[is_2m_pages]);
545
Nadav Amit8fa3c612018-09-20 10:30:13 -0700546 /*
547 * Place page on the list of non-balloonable pages
548 * and retry allocation, unless we already accumulated
549 * too many of them, in which case take a breather.
550 */
551 list_add(&p->lru, &page_size->refused_pages);
552 page_size->n_refused_pages++;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700553 }
554
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700555 return batch_status == VMW_BALLOON_SUCCESS ? 0 : -EIO;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700556}
557
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400558/*
559 * Release the page allocated for the balloon. Note that we first notify
560 * the host so it can make sure the page will be available for the guest
561 * to use, if needed.
562 */
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700563static int vmballoon_unlock(struct vmballoon *b, unsigned int num_pages,
564 bool is_2m_pages)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400565{
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700566 int i;
567 unsigned long batch_status;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700568 u16 size_per_page = vmballoon_page_size(is_2m_pages);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700569
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700570 batch_status = vmballoon_lock_op(b, num_pages, is_2m_pages, false);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700571
572 for (i = 0; i < num_pages; i++) {
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700573 struct vmballoon_page_size *page_size;
574 unsigned long status;
575 struct page *p;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700576
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700577 status = vmballoon_status_page(b, i, &p);
578 page_size = &b->page_sizes[is_2m_pages];
579
580 /*
581 * Failure of the whole batch overrides a single operation
582 * results.
583 */
584 if (batch_status != VMW_BALLOON_SUCCESS)
585 status = batch_status;
586
587 if (status != VMW_BALLOON_SUCCESS) {
Xavier Deguillardf220a802015-08-06 15:17:58 -0700588 /*
589 * That page wasn't successfully unlocked by the
590 * hypervisor, re-add it to the list of pages owned by
591 * the balloon driver.
592 */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700593 list_add(&p->lru, &page_size->pages);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700594 } else {
595 /* deallocate page */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700596 vmballoon_free_page(p, is_2m_pages);
597 STATS_INC(b->stats.free[is_2m_pages]);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700598
599 /* update balloon size */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700600 b->size -= size_per_page;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700601 }
602 }
603
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700604 return batch_status == VMW_BALLOON_SUCCESS ? 0 : -EIO;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700605}
606
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400607/*
608 * Release pages that were allocated while attempting to inflate the
609 * balloon but were refused by the host for one reason or another.
610 */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700611static void vmballoon_release_refused_pages(struct vmballoon *b,
612 bool is_2m_pages)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400613{
614 struct page *page, *next;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700615 struct vmballoon_page_size *page_size =
616 &b->page_sizes[is_2m_pages];
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400617
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700618 list_for_each_entry_safe(page, next, &page_size->refused_pages, lru) {
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400619 list_del(&page->lru);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700620 vmballoon_free_page(page, is_2m_pages);
621 STATS_INC(b->stats.refused_free[is_2m_pages]);
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400622 }
Dmitry Torokhov55adaa42010-06-04 14:14:52 -0700623
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700624 page_size->n_refused_pages = 0;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400625}
626
Xavier Deguillardf220a802015-08-06 15:17:58 -0700627static void vmballoon_add_page(struct vmballoon *b, int idx, struct page *p)
628{
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700629 if (static_branch_likely(&vmw_balloon_batching))
630 b->batch_page[idx] = (struct vmballoon_batch_entry)
Nadav Amit6c948752018-09-20 10:30:10 -0700631 { .pfn = page_to_pfn(p) };
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700632 else
633 b->page = p;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700634}
635
Nadav Amit8b079cd2018-09-20 10:30:15 -0700636/**
637 * vmballoon_change - retrieve the required balloon change
638 *
639 * @b: pointer for the balloon.
640 *
641 * Return: the required change for the balloon size. A positive number
642 * indicates inflation, a negative number indicates a deflation.
643 */
644static int64_t vmballoon_change(struct vmballoon *b)
645{
646 int64_t size, target;
647
648 size = b->size;
649 target = b->target;
650
651 /*
652 * We must cast first because of int sizes
653 * Otherwise we might get huge positives instead of negatives
654 */
655
656 if (b->reset_required)
657 return 0;
658
659 /* consider a 2MB slack on deflate, unless the balloon is emptied */
660 if (target < size && size - target < vmballoon_page_size(true) &&
661 target != 0)
662 return 0;
663
664 return target - size;
665}
666
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400667/*
668 * Inflate the balloon towards its target size. Note that we try to limit
669 * the rate of allocation to make sure we are not choking the rest of the
670 * system.
671 */
672static void vmballoon_inflate(struct vmballoon *b)
673{
Xavier Deguillardf220a802015-08-06 15:17:58 -0700674 unsigned int num_pages = 0;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400675 int error = 0;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700676 bool is_2m_pages;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400677
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400678 /*
679 * First try NOSLEEP page allocations to inflate balloon.
680 *
681 * If we do not throttle nosleep allocations, we can drain all
682 * free pages in the guest quickly (if the balloon target is high).
683 * As a side-effect, draining free pages helps to inform (force)
684 * the guest to start swapping if balloon target is not met yet,
685 * which is a desired behavior. However, balloon driver can consume
686 * all available CPU cycles if too many pages are allocated in a
687 * second. Therefore, we throttle nosleep allocations even when
688 * the guest is not under memory pressure. OTOH, if we have already
689 * predicted that the guest is under memory pressure, then we
690 * slowdown page allocations considerably.
691 */
692
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400693 /*
694 * Start with no sleep allocation rate which may be higher
695 * than sleeping allocation rate.
696 */
Nadav Amitec992cc2018-06-19 16:00:28 -0700697 is_2m_pages = b->supported_page_sizes == VMW_BALLOON_NUM_PAGE_SIZES;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400698
Nadav Amit8b079cd2018-09-20 10:30:15 -0700699 while ((int64_t)(num_pages * vmballoon_page_size(is_2m_pages)) <
700 vmballoon_change(b)) {
Xavier Deguillard4670de4d2015-08-06 15:17:59 -0700701 struct page *page;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400702
Nadav Amit622074a2018-09-20 10:30:11 -0700703 STATS_INC(b->stats.alloc[is_2m_pages]);
704 page = vmballoon_alloc_page(is_2m_pages);
Xavier Deguillardef0f8f12015-06-12 11:43:22 -0700705 if (!page) {
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700706 STATS_INC(b->stats.alloc_fail[is_2m_pages]);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700707 if (is_2m_pages) {
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700708 vmballoon_lock(b, num_pages, true);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700709
710 /*
711 * ignore errors from locking as we now switch
712 * to 4k pages and we might get different
713 * errors.
714 */
715
716 num_pages = 0;
717 is_2m_pages = false;
718 continue;
719 }
Nadav Amit622074a2018-09-20 10:30:11 -0700720 break;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400721 }
722
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700723 vmballoon_add_page(b, num_pages++, page);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700724 if (num_pages == b->batch_max_pages) {
Nadav Amit8fa3c612018-09-20 10:30:13 -0700725 struct vmballoon_page_size *page_size =
726 &b->page_sizes[is_2m_pages];
727
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700728 error = vmballoon_lock(b, num_pages, is_2m_pages);
Nadav Amit10a95d52018-09-20 10:30:07 -0700729
Xavier Deguillardf220a802015-08-06 15:17:58 -0700730 num_pages = 0;
Nadav Amit8fa3c612018-09-20 10:30:13 -0700731
732 /*
733 * Stop allocating this page size if we already
734 * accumulated too many pages that the hypervisor
735 * refused.
736 */
737 if (page_size->n_refused_pages >=
738 VMW_BALLOON_MAX_REFUSED) {
739 if (!is_2m_pages)
740 break;
741
742 /*
743 * Release the refused pages as we move to 4k
744 * pages.
745 */
746 vmballoon_release_refused_pages(b, true);
747 is_2m_pages = true;
748 }
749
Xavier Deguillardf220a802015-08-06 15:17:58 -0700750 if (error)
751 break;
752 }
Xavier Deguillardef0f8f12015-06-12 11:43:22 -0700753
Philip P. Moltmann33d268e2015-08-06 15:18:01 -0700754 cond_resched();
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400755 }
756
Xavier Deguillardf220a802015-08-06 15:17:58 -0700757 if (num_pages > 0)
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700758 vmballoon_lock(b, num_pages, is_2m_pages);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700759
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700760 vmballoon_release_refused_pages(b, true);
761 vmballoon_release_refused_pages(b, false);
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400762}
763
764/*
765 * Decrease the size of the balloon allowing guest to use more memory.
766 */
767static void vmballoon_deflate(struct vmballoon *b)
768{
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700769 unsigned is_2m_pages;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400770
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400771 /* free pages to reach target */
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700772 for (is_2m_pages = 0; is_2m_pages < b->supported_page_sizes;
773 is_2m_pages++) {
774 struct page *page, *next;
775 unsigned int num_pages = 0;
776 struct vmballoon_page_size *page_size =
777 &b->page_sizes[is_2m_pages];
Xavier Deguillardf220a802015-08-06 15:17:58 -0700778
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700779 list_for_each_entry_safe(page, next, &page_size->pages, lru) {
Nadav Amit8b079cd2018-09-20 10:30:15 -0700780 if ((int64_t)(num_pages *
781 vmballoon_page_size(is_2m_pages)) >=
782 -vmballoon_change(b))
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700783 break;
Philip P. Moltmann33d268e2015-08-06 15:18:01 -0700784
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700785 list_del(&page->lru);
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700786 vmballoon_add_page(b, num_pages++, page);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700787
788 if (num_pages == b->batch_max_pages) {
789 int error;
790
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700791 error = vmballoon_unlock(b, num_pages,
Nadav Amit10a95d52018-09-20 10:30:07 -0700792 is_2m_pages);
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700793 num_pages = 0;
794 if (error)
795 return;
796 }
797
798 cond_resched();
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400799 }
800
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -0700801 if (num_pages > 0)
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700802 vmballoon_unlock(b, num_pages, is_2m_pages);
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400803 }
Xavier Deguillardf220a802015-08-06 15:17:58 -0700804}
805
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700806/**
807 * vmballoon_deinit_batching - disables batching mode.
808 *
809 * @b: pointer to &struct vmballoon.
810 *
811 * Disables batching, by deallocating the page for communication with the
812 * hypervisor and disabling the static key to indicate that batching is off.
813 */
814static void vmballoon_deinit_batching(struct vmballoon *b)
815{
816 free_page((unsigned long)b->batch_page);
817 b->batch_page = NULL;
818 static_branch_disable(&vmw_balloon_batching);
819 b->batch_max_pages = 1;
820}
Xavier Deguillardf220a802015-08-06 15:17:58 -0700821
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700822/**
823 * vmballoon_init_batching - enable batching mode.
824 *
825 * @b: pointer to &struct vmballoon.
826 *
827 * Enables batching, by allocating a page for communication with the hypervisor
828 * and enabling the static_key to use batching.
829 *
830 * Return: zero on success or an appropriate error-code.
831 */
832static int vmballoon_init_batching(struct vmballoon *b)
Xavier Deguillardf220a802015-08-06 15:17:58 -0700833{
Gil Kupferb23220f2018-06-01 00:47:47 -0700834 struct page *page;
835
836 page = alloc_page(GFP_KERNEL | __GFP_ZERO);
837 if (!page)
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700838 return -ENOMEM;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700839
Gil Kupferb23220f2018-06-01 00:47:47 -0700840 b->batch_page = page_address(page);
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700841 b->batch_max_pages = PAGE_SIZE / sizeof(struct vmballoon_batch_entry);
842
843 static_branch_enable(&vmw_balloon_batching);
844
845 return 0;
Xavier Deguillardf220a802015-08-06 15:17:58 -0700846}
847
848/*
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700849 * Receive notification and resize balloon
850 */
851static void vmballoon_doorbell(void *client_data)
852{
853 struct vmballoon *b = client_data;
854
855 STATS_INC(b->stats.doorbell);
856
857 mod_delayed_work(system_freezable_wq, &b->dwork, 0);
858}
859
860/*
861 * Clean up vmci doorbell
862 */
863static void vmballoon_vmci_cleanup(struct vmballoon *b)
864{
Nadav Amit10a95d52018-09-20 10:30:07 -0700865 vmballoon_cmd(b, VMW_BALLOON_CMD_VMCI_DOORBELL_SET,
866 VMCI_INVALID_ID, VMCI_INVALID_ID);
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700867
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700868 if (!vmci_handle_is_invalid(b->vmci_doorbell)) {
869 vmci_doorbell_destroy(b->vmci_doorbell);
870 b->vmci_doorbell = VMCI_INVALID_HANDLE;
871 }
872}
873
874/*
875 * Initialize vmci doorbell, to get notified as soon as balloon changes
876 */
877static int vmballoon_vmci_init(struct vmballoon *b)
878{
Nadav Amit10a95d52018-09-20 10:30:07 -0700879 unsigned long error;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700880
Nadav Amitce664332018-06-19 16:00:26 -0700881 if ((b->capabilities & VMW_BALLOON_SIGNALLED_WAKEUP_CMD) == 0)
882 return 0;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700883
Nadav Amitce664332018-06-19 16:00:26 -0700884 error = vmci_doorbell_create(&b->vmci_doorbell, VMCI_FLAG_DELAYED_CB,
885 VMCI_PRIVILEGE_FLAG_RESTRICTED,
886 vmballoon_doorbell, b);
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700887
Nadav Amitce664332018-06-19 16:00:26 -0700888 if (error != VMCI_SUCCESS)
889 goto fail;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700890
Nadav Amit10a95d52018-09-20 10:30:07 -0700891 error = __vmballoon_cmd(b, VMW_BALLOON_CMD_VMCI_DOORBELL_SET,
892 b->vmci_doorbell.context,
893 b->vmci_doorbell.resource, NULL);
Nadav Amitce664332018-06-19 16:00:26 -0700894
Nadav Amitce664332018-06-19 16:00:26 -0700895 if (error != VMW_BALLOON_SUCCESS)
896 goto fail;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700897
898 return 0;
Nadav Amitce664332018-06-19 16:00:26 -0700899fail:
900 vmballoon_vmci_cleanup(b);
901 return -EIO;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700902}
903
904/*
Xavier Deguillardf220a802015-08-06 15:17:58 -0700905 * Perform standard reset sequence by popping the balloon (in case it
906 * is not empty) and then restarting protocol. This operation normally
907 * happens when host responds with VMW_BALLOON_ERROR_RESET to a command.
908 */
909static void vmballoon_reset(struct vmballoon *b)
910{
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700911 int error;
912
913 vmballoon_vmci_cleanup(b);
914
Xavier Deguillardf220a802015-08-06 15:17:58 -0700915 /* free all pages, skipping monitor unlock */
916 vmballoon_pop(b);
917
918 if (!vmballoon_send_start(b, VMW_BALLOON_CAPABILITIES))
919 return;
920
921 if ((b->capabilities & VMW_BALLOON_BATCHED_CMDS) != 0) {
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700922 if (vmballoon_init_batching(b)) {
Xavier Deguillardf220a802015-08-06 15:17:58 -0700923 /*
924 * We failed to initialize batching, inform the monitor
925 * about it by sending a null capability.
926 *
927 * The guest will retry in one second.
928 */
929 vmballoon_send_start(b, 0);
930 return;
931 }
932 } else if ((b->capabilities & VMW_BALLOON_BASIC_CMDS) != 0) {
Nadav Amitdf8d0d42018-09-20 10:30:12 -0700933 vmballoon_deinit_batching(b);
Xavier Deguillardf220a802015-08-06 15:17:58 -0700934 }
935
936 b->reset_required = false;
Philip P. Moltmann48e3d662015-08-06 15:18:01 -0700937
938 error = vmballoon_vmci_init(b);
939 if (error)
940 pr_err("failed to initialize vmci doorbell\n");
941
Xavier Deguillardf220a802015-08-06 15:17:58 -0700942 if (!vmballoon_send_guest_id(b))
943 pr_err("failed to send guest ID to the host\n");
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400944}
945
Nadav Amit8b079cd2018-09-20 10:30:15 -0700946/**
947 * vmballoon_work - periodic balloon worker for reset, inflation and deflation.
948 *
949 * @work: pointer to the &work_struct which is provided by the workqueue.
950 *
951 * Resets the protocol if needed, gets the new size and adjusts balloon as
952 * needed. Repeat in 1 sec.
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400953 */
954static void vmballoon_work(struct work_struct *work)
955{
956 struct delayed_work *dwork = to_delayed_work(work);
957 struct vmballoon *b = container_of(dwork, struct vmballoon, dwork);
Nadav Amit8b079cd2018-09-20 10:30:15 -0700958 int64_t change = 0;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400959
960 STATS_INC(b->stats.timer);
961
962 if (b->reset_required)
963 vmballoon_reset(b);
964
Nadav Amit8b079cd2018-09-20 10:30:15 -0700965 if (vmballoon_send_get_target(b))
966 change = vmballoon_change(b);
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400967
Nadav Amit8b079cd2018-09-20 10:30:15 -0700968 if (change != 0) {
969 pr_debug("%s - size: %u, target %u", __func__,
970 b->size, b->target);
971
972 if (change > 0)
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400973 vmballoon_inflate(b);
Nadav Amit8b079cd2018-09-20 10:30:15 -0700974 else /* (change < 0) */
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400975 vmballoon_deflate(b);
976 }
977
Dmitry Torokhovbeda94d2011-07-26 16:08:56 -0700978 /*
979 * We are using a freezable workqueue so that balloon operations are
980 * stopped while the system transitions to/from sleep/hibernation.
981 */
982 queue_delayed_work(system_freezable_wq,
983 dwork, round_jiffies_relative(HZ));
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400984}
985
986/*
987 * DEBUGFS Interface
988 */
989#ifdef CONFIG_DEBUG_FS
990
991static int vmballoon_debug_show(struct seq_file *f, void *offset)
992{
993 struct vmballoon *b = f->private;
994 struct vmballoon_stats *stats = &b->stats;
Nadav Amit68131182018-09-20 10:30:08 -0700995 int i;
Dmitry Torokhov453dc652010-04-23 13:18:08 -0400996
Philip P. Moltmannb36e89d2015-08-06 15:18:00 -0700997 /* format capabilities info */
998 seq_printf(f,
999 "balloon capabilities: %#4x\n"
Philip P. Moltmannd7568c12015-08-06 15:18:01 -07001000 "used capabilities: %#4lx\n"
1001 "is resetting: %c\n",
1002 VMW_BALLOON_CAPABILITIES, b->capabilities,
1003 b->reset_required ? 'y' : 'n');
Philip P. Moltmannb36e89d2015-08-06 15:18:00 -07001004
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001005 /* format size info */
1006 seq_printf(f,
1007 "target: %8d pages\n"
1008 "current: %8d pages\n",
1009 b->target, b->size);
1010
Nadav Amit68131182018-09-20 10:30:08 -07001011 for (i = 0; i < VMW_BALLOON_CMD_NUM; i++) {
1012 if (vmballoon_cmd_names[i] == NULL)
1013 continue;
1014
1015 seq_printf(f, "%-22s: %16lu (%lu failed)\n",
1016 vmballoon_cmd_names[i], stats->ops[i],
1017 stats->ops_fail[i]);
1018 }
1019
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001020 seq_printf(f,
1021 "\n"
1022 "timer: %8u\n"
Philip P. Moltmann48e3d662015-08-06 15:18:01 -07001023 "doorbell: %8u\n"
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001024 "prim2mAlloc: %8u (%4u failed)\n"
Nadav Amit622074a2018-09-20 10:30:11 -07001025 "prim4kAlloc: %8u (%4u failed)\n"
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001026 "prim2mFree: %8u\n"
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001027 "primFree: %8u\n"
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001028 "err2mAlloc: %8u\n"
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001029 "errAlloc: %8u\n"
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001030 "err2mFree: %8u\n"
Nadav Amit68131182018-09-20 10:30:08 -07001031 "errFree: %8u\n",
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001032 stats->timer,
Philip P. Moltmann48e3d662015-08-06 15:18:01 -07001033 stats->doorbell,
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001034 stats->alloc[true], stats->alloc_fail[true],
1035 stats->alloc[false], stats->alloc_fail[false],
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001036 stats->free[true],
1037 stats->free[false],
1038 stats->refused_alloc[true], stats->refused_alloc[false],
Nadav Amit68131182018-09-20 10:30:08 -07001039 stats->refused_free[true], stats->refused_free[false]);
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001040
1041 return 0;
1042}
1043
1044static int vmballoon_debug_open(struct inode *inode, struct file *file)
1045{
1046 return single_open(file, vmballoon_debug_show, inode->i_private);
1047}
1048
1049static const struct file_operations vmballoon_debug_fops = {
1050 .owner = THIS_MODULE,
1051 .open = vmballoon_debug_open,
1052 .read = seq_read,
1053 .llseek = seq_lseek,
1054 .release = single_release,
1055};
1056
1057static int __init vmballoon_debugfs_init(struct vmballoon *b)
1058{
1059 int error;
1060
1061 b->dbg_entry = debugfs_create_file("vmmemctl", S_IRUGO, NULL, b,
1062 &vmballoon_debug_fops);
1063 if (IS_ERR(b->dbg_entry)) {
1064 error = PTR_ERR(b->dbg_entry);
1065 pr_err("failed to create debugfs entry, error: %d\n", error);
1066 return error;
1067 }
1068
1069 return 0;
1070}
1071
1072static void __exit vmballoon_debugfs_exit(struct vmballoon *b)
1073{
1074 debugfs_remove(b->dbg_entry);
1075}
1076
1077#else
1078
1079static inline int vmballoon_debugfs_init(struct vmballoon *b)
1080{
1081 return 0;
1082}
1083
1084static inline void vmballoon_debugfs_exit(struct vmballoon *b)
1085{
1086}
1087
1088#endif /* CONFIG_DEBUG_FS */
1089
1090static int __init vmballoon_init(void)
1091{
1092 int error;
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001093 unsigned is_2m_pages;
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001094 /*
1095 * Check if we are running on VMware's hypervisor and bail out
1096 * if we are not.
1097 */
Juergen Gross03b2a322017-11-09 14:27:36 +01001098 if (x86_hyper_type != X86_HYPER_VMWARE)
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001099 return -ENODEV;
1100
Philip P. Moltmann365bd7e2015-08-06 15:18:01 -07001101 for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES;
1102 is_2m_pages++) {
1103 INIT_LIST_HEAD(&balloon.page_sizes[is_2m_pages].pages);
1104 INIT_LIST_HEAD(&balloon.page_sizes[is_2m_pages].refused_pages);
1105 }
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001106
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001107 INIT_DELAYED_WORK(&balloon.dwork, vmballoon_work);
1108
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001109 error = vmballoon_debugfs_init(&balloon);
1110 if (error)
Dmitry Torokhovbeda94d2011-07-26 16:08:56 -07001111 return error;
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001112
Philip P. Moltmann48e3d662015-08-06 15:18:01 -07001113 balloon.vmci_doorbell = VMCI_INVALID_HANDLE;
Philip P. Moltmannd7568c12015-08-06 15:18:01 -07001114 balloon.batch_page = NULL;
1115 balloon.page = NULL;
1116 balloon.reset_required = true;
1117
Dmitry Torokhovbeda94d2011-07-26 16:08:56 -07001118 queue_delayed_work(system_freezable_wq, &balloon.dwork, 0);
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001119
1120 return 0;
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001121}
Nadav Amitc3cc1b02018-06-19 16:00:27 -07001122
1123/*
1124 * Using late_initcall() instead of module_init() allows the balloon to use the
1125 * VMCI doorbell even when the balloon is built into the kernel. Otherwise the
1126 * VMCI is probed only after the balloon is initialized. If the balloon is used
1127 * as a module, late_initcall() is equivalent to module_init().
1128 */
1129late_initcall(vmballoon_init);
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001130
1131static void __exit vmballoon_exit(void)
1132{
Philip P. Moltmann48e3d662015-08-06 15:18:01 -07001133 vmballoon_vmci_cleanup(&balloon);
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001134 cancel_delayed_work_sync(&balloon.dwork);
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001135
1136 vmballoon_debugfs_exit(&balloon);
1137
1138 /*
1139 * Deallocate all reserved memory, and reset connection with monitor.
1140 * Reset connection before deallocating memory to avoid potential for
1141 * additional spurious resets from guest touching deallocated pages.
1142 */
Philip P. Moltmannd7568c12015-08-06 15:18:01 -07001143 vmballoon_send_start(&balloon, 0);
Dmitry Torokhov453dc652010-04-23 13:18:08 -04001144 vmballoon_pop(&balloon);
1145}
1146module_exit(vmballoon_exit);