1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <linux/virtio.h>
23#include <linux/virtio_balloon.h>
24#include <linux/swap.h>
25#include <linux/workqueue.h>
26#include <linux/delay.h>
27#include <linux/slab.h>
28#include <linux/module.h>
29#include <linux/balloon_compaction.h>
30#include <linux/oom.h>
31#include <linux/wait.h>
32#include <linux/mm.h>
33#include <linux/mount.h>
34#include <linux/magic.h>
35
36
37
38
39
40
41#define VIRTIO_BALLOON_PAGES_PER_PAGE (unsigned)(PAGE_SIZE >> VIRTIO_BALLOON_PFN_SHIFT)
42#define VIRTIO_BALLOON_ARRAY_PFNS_MAX 256
43#define OOM_VBALLOON_DEFAULT_PAGES 256
44#define VIRTBALLOON_OOM_NOTIFY_PRIORITY 80
45
46static int oom_pages = OOM_VBALLOON_DEFAULT_PAGES;
47module_param(oom_pages, int, S_IRUSR | S_IWUSR);
48MODULE_PARM_DESC(oom_pages, "pages to free on OOM");
49
50#ifdef CONFIG_BALLOON_COMPACTION
51static struct vfsmount *balloon_mnt;
52#endif
53
54struct virtio_balloon {
55 struct virtio_device *vdev;
56 struct virtqueue *inflate_vq, *deflate_vq, *stats_vq;
57
58
59 struct work_struct update_balloon_stats_work;
60 struct work_struct update_balloon_size_work;
61
62
63 spinlock_t stop_update_lock;
64 bool stop_update;
65
66
67 wait_queue_head_t acked;
68
69
70 unsigned int num_pages;
71
72
73
74
75
76
77 struct balloon_dev_info vb_dev_info;
78
79
80 struct mutex balloon_lock;
81
82
83 unsigned int num_pfns;
84 __virtio32 pfns[VIRTIO_BALLOON_ARRAY_PFNS_MAX];
85
86
87 struct virtio_balloon_stat stats[VIRTIO_BALLOON_S_NR];
88
89
90 struct notifier_block nb;
91};
92
93static struct virtio_device_id id_table[] = {
94 { VIRTIO_ID_BALLOON, VIRTIO_DEV_ANY_ID },
95 { 0 },
96};
97
98static u32 page_to_balloon_pfn(struct page *page)
99{
100 unsigned long pfn = page_to_pfn(page);
101
102 BUILD_BUG_ON(PAGE_SHIFT < VIRTIO_BALLOON_PFN_SHIFT);
103
104 return pfn * VIRTIO_BALLOON_PAGES_PER_PAGE;
105}
106
107static void balloon_ack(struct virtqueue *vq)
108{
109 struct virtio_balloon *vb = vq->vdev->priv;
110
111 wake_up(&vb->acked);
112}
113
114static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq)
115{
116 struct scatterlist sg;
117 unsigned int len;
118
119 sg_init_one(&sg, vb->pfns, sizeof(vb->pfns[0]) * vb->num_pfns);
120
121
122 virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL);
123 virtqueue_kick(vq);
124
125
126 wait_event(vb->acked, virtqueue_get_buf(vq, &len));
127
128}
129
130static void set_page_pfns(struct virtio_balloon *vb,
131 __virtio32 pfns[], struct page *page)
132{
133 unsigned int i;
134
135
136
137
138
139 for (i = 0; i < VIRTIO_BALLOON_PAGES_PER_PAGE; i++)
140 pfns[i] = cpu_to_virtio32(vb->vdev,
141 page_to_balloon_pfn(page) + i);
142}
143
144static unsigned fill_balloon(struct virtio_balloon *vb, size_t num)
145{
146 unsigned num_allocated_pages;
147 unsigned num_pfns;
148 struct page *page;
149 LIST_HEAD(pages);
150
151
152 num = min(num, ARRAY_SIZE(vb->pfns));
153
154 for (num_pfns = 0; num_pfns < num;
155 num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) {
156 struct page *page = balloon_page_alloc();
157
158 if (!page) {
159 dev_info_ratelimited(&vb->vdev->dev,
160 "Out of puff! Can't get %u pages\n",
161 VIRTIO_BALLOON_PAGES_PER_PAGE);
162
163 msleep(200);
164 break;
165 }
166
167 balloon_page_push(&pages, page);
168 }
169
170 mutex_lock(&vb->balloon_lock);
171
172 vb->num_pfns = 0;
173
174 while ((page = balloon_page_pop(&pages))) {
175 balloon_page_enqueue(&vb->vb_dev_info, page);
176
177 set_page_pfns(vb, vb->pfns + vb->num_pfns, page);
178 vb->num_pages += VIRTIO_BALLOON_PAGES_PER_PAGE;
179 if (!virtio_has_feature(vb->vdev,
180 VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
181 adjust_managed_page_count(page, -1);
182 vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE;
183 }
184
185 num_allocated_pages = vb->num_pfns;
186
187 if (vb->num_pfns != 0)
188 tell_host(vb, vb->inflate_vq);
189 mutex_unlock(&vb->balloon_lock);
190
191 return num_allocated_pages;
192}
193
194static void release_pages_balloon(struct virtio_balloon *vb,
195 struct list_head *pages)
196{
197 struct page *page, *next;
198
199 list_for_each_entry_safe(page, next, pages, lru) {
200 if (!virtio_has_feature(vb->vdev,
201 VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
202 adjust_managed_page_count(page, 1);
203 list_del(&page->lru);
204 put_page(page);
205 }
206}
207
208static unsigned leak_balloon(struct virtio_balloon *vb, size_t num)
209{
210 unsigned num_freed_pages;
211 struct page *page;
212 struct balloon_dev_info *vb_dev_info = &vb->vb_dev_info;
213 LIST_HEAD(pages);
214
215
216 num = min(num, ARRAY_SIZE(vb->pfns));
217
218 mutex_lock(&vb->balloon_lock);
219
220 num = min(num, (size_t)vb->num_pages);
221 for (vb->num_pfns = 0; vb->num_pfns < num;
222 vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) {
223 page = balloon_page_dequeue(vb_dev_info);
224 if (!page)
225 break;
226 set_page_pfns(vb, vb->pfns + vb->num_pfns, page);
227 list_add(&page->lru, &pages);
228 vb->num_pages -= VIRTIO_BALLOON_PAGES_PER_PAGE;
229 }
230
231 num_freed_pages = vb->num_pfns;
232
233
234
235
236
237 if (vb->num_pfns != 0)
238 tell_host(vb, vb->deflate_vq);
239 release_pages_balloon(vb, &pages);
240 mutex_unlock(&vb->balloon_lock);
241 return num_freed_pages;
242}
243
244static inline void update_stat(struct virtio_balloon *vb, int idx,
245 u16 tag, u64 val)
246{
247 BUG_ON(idx >= VIRTIO_BALLOON_S_NR);
248 vb->stats[idx].tag = cpu_to_virtio16(vb->vdev, tag);
249 vb->stats[idx].val = cpu_to_virtio64(vb->vdev, val);
250}
251
252#define pages_to_bytes(x) ((u64)(x) << PAGE_SHIFT)
253
254static unsigned int update_balloon_stats(struct virtio_balloon *vb)
255{
256 unsigned long events[NR_VM_EVENT_ITEMS];
257 struct sysinfo i;
258 unsigned int idx = 0;
259 long available;
260 unsigned long caches;
261
262 all_vm_events(events);
263 si_meminfo(&i);
264
265 available = si_mem_available();
266 caches = global_node_page_state(NR_FILE_PAGES);
267
268#ifdef CONFIG_VM_EVENT_COUNTERS
269 update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_IN,
270 pages_to_bytes(events[PSWPIN]));
271 update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_OUT,
272 pages_to_bytes(events[PSWPOUT]));
273 update_stat(vb, idx++, VIRTIO_BALLOON_S_MAJFLT, events[PGMAJFAULT]);
274 update_stat(vb, idx++, VIRTIO_BALLOON_S_MINFLT, events[PGFAULT]);
275#endif
276 update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMFREE,
277 pages_to_bytes(i.freeram));
278 update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMTOT,
279 pages_to_bytes(i.totalram));
280 update_stat(vb, idx++, VIRTIO_BALLOON_S_AVAIL,
281 pages_to_bytes(available));
282 update_stat(vb, idx++, VIRTIO_BALLOON_S_CACHES,
283 pages_to_bytes(caches));
284
285 return idx;
286}
287
288
289
290
291
292
293
294
295
296
297static void stats_request(struct virtqueue *vq)
298{
299 struct virtio_balloon *vb = vq->vdev->priv;
300
301 spin_lock(&vb->stop_update_lock);
302 if (!vb->stop_update)
303 queue_work(system_freezable_wq, &vb->update_balloon_stats_work);
304 spin_unlock(&vb->stop_update_lock);
305}
306
307static void stats_handle_request(struct virtio_balloon *vb)
308{
309 struct virtqueue *vq;
310 struct scatterlist sg;
311 unsigned int len, num_stats;
312
313 num_stats = update_balloon_stats(vb);
314
315 vq = vb->stats_vq;
316 if (!virtqueue_get_buf(vq, &len))
317 return;
318 sg_init_one(&sg, vb->stats, sizeof(vb->stats[0]) * num_stats);
319 virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL);
320 virtqueue_kick(vq);
321}
322
323static void virtballoon_changed(struct virtio_device *vdev)
324{
325 struct virtio_balloon *vb = vdev->priv;
326 unsigned long flags;
327
328 spin_lock_irqsave(&vb->stop_update_lock, flags);
329 if (!vb->stop_update)
330 queue_work(system_freezable_wq, &vb->update_balloon_size_work);
331 spin_unlock_irqrestore(&vb->stop_update_lock, flags);
332}
333
334static inline s64 towards_target(struct virtio_balloon *vb)
335{
336 s64 target;
337 u32 num_pages;
338
339 virtio_cread(vb->vdev, struct virtio_balloon_config, num_pages,
340 &num_pages);
341
342
343 if (!virtio_has_feature(vb->vdev, VIRTIO_F_VERSION_1))
344 num_pages = le32_to_cpu((__force __le32)num_pages);
345
346 target = num_pages;
347 return target - vb->num_pages;
348}
349
350static void update_balloon_size(struct virtio_balloon *vb)
351{
352 u32 actual = vb->num_pages;
353
354
355 if (!virtio_has_feature(vb->vdev, VIRTIO_F_VERSION_1))
356 actual = (__force u32)cpu_to_le32(actual);
357
358 virtio_cwrite(vb->vdev, struct virtio_balloon_config, actual,
359 &actual);
360}
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375static int virtballoon_oom_notify(struct notifier_block *self,
376 unsigned long dummy, void *parm)
377{
378 struct virtio_balloon *vb;
379 unsigned long *freed;
380 unsigned num_freed_pages;
381
382 vb = container_of(self, struct virtio_balloon, nb);
383 if (!virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
384 return NOTIFY_OK;
385
386 freed = parm;
387 num_freed_pages = leak_balloon(vb, oom_pages);
388 update_balloon_size(vb);
389 *freed += num_freed_pages;
390
391 return NOTIFY_OK;
392}
393
394static void update_balloon_stats_func(struct work_struct *work)
395{
396 struct virtio_balloon *vb;
397
398 vb = container_of(work, struct virtio_balloon,
399 update_balloon_stats_work);
400 stats_handle_request(vb);
401}
402
403static void update_balloon_size_func(struct work_struct *work)
404{
405 struct virtio_balloon *vb;
406 s64 diff;
407
408 vb = container_of(work, struct virtio_balloon,
409 update_balloon_size_work);
410 diff = towards_target(vb);
411
412 if (diff > 0)
413 diff -= fill_balloon(vb, diff);
414 else if (diff < 0)
415 diff += leak_balloon(vb, -diff);
416 update_balloon_size(vb);
417
418 if (diff)
419 queue_work(system_freezable_wq, work);
420}
421
422static int init_vqs(struct virtio_balloon *vb)
423{
424 struct virtqueue *vqs[3];
425 vq_callback_t *callbacks[] = { balloon_ack, balloon_ack, stats_request };
426 static const char * const names[] = { "inflate", "deflate", "stats" };
427 int err, nvqs;
428
429
430
431
432
433 nvqs = virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ) ? 3 : 2;
434 err = virtio_find_vqs(vb->vdev, nvqs, vqs, callbacks, names, NULL);
435 if (err)
436 return err;
437
438 vb->inflate_vq = vqs[0];
439 vb->deflate_vq = vqs[1];
440 if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) {
441 struct scatterlist sg;
442 unsigned int num_stats;
443 vb->stats_vq = vqs[2];
444
445
446
447
448
449 num_stats = update_balloon_stats(vb);
450
451 sg_init_one(&sg, vb->stats, sizeof(vb->stats[0]) * num_stats);
452 if (virtqueue_add_outbuf(vb->stats_vq, &sg, 1, vb, GFP_KERNEL)
453 < 0)
454 BUG();
455 virtqueue_kick(vb->stats_vq);
456 }
457 return 0;
458}
459
460#ifdef CONFIG_BALLOON_COMPACTION
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479static int virtballoon_migratepage(struct balloon_dev_info *vb_dev_info,
480 struct page *newpage, struct page *page, enum migrate_mode mode)
481{
482 struct virtio_balloon *vb = container_of(vb_dev_info,
483 struct virtio_balloon, vb_dev_info);
484 unsigned long flags;
485
486
487
488
489
490
491
492
493
494 if (!mutex_trylock(&vb->balloon_lock))
495 return -EAGAIN;
496
497 get_page(newpage);
498
499
500 spin_lock_irqsave(&vb_dev_info->pages_lock, flags);
501 balloon_page_insert(vb_dev_info, newpage);
502 vb_dev_info->isolated_pages--;
503 __count_vm_event(BALLOON_MIGRATE);
504 spin_unlock_irqrestore(&vb_dev_info->pages_lock, flags);
505 vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE;
506 set_page_pfns(vb, vb->pfns, newpage);
507 tell_host(vb, vb->inflate_vq);
508
509
510 balloon_page_delete(page);
511 vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE;
512 set_page_pfns(vb, vb->pfns, page);
513 tell_host(vb, vb->deflate_vq);
514
515 mutex_unlock(&vb->balloon_lock);
516
517 put_page(page);
518
519 return MIGRATEPAGE_SUCCESS;
520}
521
522static struct dentry *balloon_mount(struct file_system_type *fs_type,
523 int flags, const char *dev_name, void *data)
524{
525 static const struct dentry_operations ops = {
526 .d_dname = simple_dname,
527 };
528
529 return mount_pseudo(fs_type, "balloon-kvm:", NULL, &ops,
530 BALLOON_KVM_MAGIC);
531}
532
533static struct file_system_type balloon_fs = {
534 .name = "balloon-kvm",
535 .mount = balloon_mount,
536 .kill_sb = kill_anon_super,
537};
538
539#endif
540
541static int virtballoon_probe(struct virtio_device *vdev)
542{
543 struct virtio_balloon *vb;
544 int err;
545
546 if (!vdev->config->get) {
547 dev_err(&vdev->dev, "%s failure: config access disabled\n",
548 __func__);
549 return -EINVAL;
550 }
551
552 vdev->priv = vb = kmalloc(sizeof(*vb), GFP_KERNEL);
553 if (!vb) {
554 err = -ENOMEM;
555 goto out;
556 }
557
558 INIT_WORK(&vb->update_balloon_stats_work, update_balloon_stats_func);
559 INIT_WORK(&vb->update_balloon_size_work, update_balloon_size_func);
560 spin_lock_init(&vb->stop_update_lock);
561 vb->stop_update = false;
562 vb->num_pages = 0;
563 mutex_init(&vb->balloon_lock);
564 init_waitqueue_head(&vb->acked);
565 vb->vdev = vdev;
566
567 balloon_devinfo_init(&vb->vb_dev_info);
568
569 err = init_vqs(vb);
570 if (err)
571 goto out_free_vb;
572
573 vb->nb.notifier_call = virtballoon_oom_notify;
574 vb->nb.priority = VIRTBALLOON_OOM_NOTIFY_PRIORITY;
575 err = register_oom_notifier(&vb->nb);
576 if (err < 0)
577 goto out_del_vqs;
578
579#ifdef CONFIG_BALLOON_COMPACTION
580 balloon_mnt = kern_mount(&balloon_fs);
581 if (IS_ERR(balloon_mnt)) {
582 err = PTR_ERR(balloon_mnt);
583 unregister_oom_notifier(&vb->nb);
584 goto out_del_vqs;
585 }
586
587 vb->vb_dev_info.migratepage = virtballoon_migratepage;
588 vb->vb_dev_info.inode = alloc_anon_inode(balloon_mnt->mnt_sb);
589 if (IS_ERR(vb->vb_dev_info.inode)) {
590 err = PTR_ERR(vb->vb_dev_info.inode);
591 kern_unmount(balloon_mnt);
592 unregister_oom_notifier(&vb->nb);
593 vb->vb_dev_info.inode = NULL;
594 goto out_del_vqs;
595 }
596 vb->vb_dev_info.inode->i_mapping->a_ops = &balloon_aops;
597#endif
598
599 virtio_device_ready(vdev);
600
601 if (towards_target(vb))
602 virtballoon_changed(vdev);
603 return 0;
604
605out_del_vqs:
606 vdev->config->del_vqs(vdev);
607out_free_vb:
608 kfree(vb);
609out:
610 return err;
611}
612
613static void remove_common(struct virtio_balloon *vb)
614{
615
616 while (vb->num_pages)
617 leak_balloon(vb, vb->num_pages);
618 update_balloon_size(vb);
619
620
621 vb->vdev->config->reset(vb->vdev);
622
623 vb->vdev->config->del_vqs(vb->vdev);
624}
625
626static void virtballoon_remove(struct virtio_device *vdev)
627{
628 struct virtio_balloon *vb = vdev->priv;
629
630 unregister_oom_notifier(&vb->nb);
631
632 spin_lock_irq(&vb->stop_update_lock);
633 vb->stop_update = true;
634 spin_unlock_irq(&vb->stop_update_lock);
635 cancel_work_sync(&vb->update_balloon_size_work);
636 cancel_work_sync(&vb->update_balloon_stats_work);
637
638 remove_common(vb);
639#ifdef CONFIG_BALLOON_COMPACTION
640 if (vb->vb_dev_info.inode)
641 iput(vb->vb_dev_info.inode);
642
643 kern_unmount(balloon_mnt);
644#endif
645 kfree(vb);
646}
647
648#ifdef CONFIG_PM_SLEEP
649static int virtballoon_freeze(struct virtio_device *vdev)
650{
651 struct virtio_balloon *vb = vdev->priv;
652
653
654
655
656
657 remove_common(vb);
658 return 0;
659}
660
661static int virtballoon_restore(struct virtio_device *vdev)
662{
663 struct virtio_balloon *vb = vdev->priv;
664 int ret;
665
666 ret = init_vqs(vdev->priv);
667 if (ret)
668 return ret;
669
670 virtio_device_ready(vdev);
671
672 if (towards_target(vb))
673 virtballoon_changed(vdev);
674 update_balloon_size(vb);
675 return 0;
676}
677#endif
678
679static int virtballoon_validate(struct virtio_device *vdev)
680{
681 __virtio_clear_bit(vdev, VIRTIO_F_IOMMU_PLATFORM);
682 return 0;
683}
684
685static unsigned int features[] = {
686 VIRTIO_BALLOON_F_MUST_TELL_HOST,
687 VIRTIO_BALLOON_F_STATS_VQ,
688 VIRTIO_BALLOON_F_DEFLATE_ON_OOM,
689};
690
691static struct virtio_driver virtio_balloon_driver = {
692 .feature_table = features,
693 .feature_table_size = ARRAY_SIZE(features),
694 .driver.name = KBUILD_MODNAME,
695 .driver.owner = THIS_MODULE,
696 .id_table = id_table,
697 .validate = virtballoon_validate,
698 .probe = virtballoon_probe,
699 .remove = virtballoon_remove,
700 .config_changed = virtballoon_changed,
701#ifdef CONFIG_PM_SLEEP
702 .freeze = virtballoon_freeze,
703 .restore = virtballoon_restore,
704#endif
705};
706
707module_virtio_driver(virtio_balloon_driver);
708MODULE_DEVICE_TABLE(virtio, id_table);
709MODULE_DESCRIPTION("Virtio balloon driver");
710MODULE_LICENSE("GPL");
711