Lines Matching refs:vb

108 	struct virtio_balloon *vb = vq->vdev->priv;  in balloon_ack()  local
110 wake_up(&vb->acked); in balloon_ack()
113 static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq) in tell_host() argument
118 sg_init_one(&sg, vb->pfns, sizeof(vb->pfns[0]) * vb->num_pfns); in tell_host()
121 virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL); in tell_host()
125 wait_event(vb->acked, virtqueue_get_buf(vq, &len)); in tell_host()
138 static void fill_balloon(struct virtio_balloon *vb, size_t num) in fill_balloon() argument
140 struct balloon_dev_info *vb_dev_info = &vb->vb_dev_info; in fill_balloon()
143 num = min(num, ARRAY_SIZE(vb->pfns)); in fill_balloon()
145 mutex_lock(&vb->balloon_lock); in fill_balloon()
146 for (vb->num_pfns = 0; vb->num_pfns < num; in fill_balloon()
147 vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) { in fill_balloon()
151 dev_info_ratelimited(&vb->vdev->dev, in fill_balloon()
158 set_page_pfns(vb->pfns + vb->num_pfns, page); in fill_balloon()
159 vb->num_pages += VIRTIO_BALLOON_PAGES_PER_PAGE; in fill_balloon()
160 if (!virtio_has_feature(vb->vdev, in fill_balloon()
166 if (vb->num_pfns != 0) in fill_balloon()
167 tell_host(vb, vb->inflate_vq); in fill_balloon()
168 mutex_unlock(&vb->balloon_lock); in fill_balloon()
171 static void release_pages_balloon(struct virtio_balloon *vb) in release_pages_balloon() argument
176 for (i = 0; i < vb->num_pfns; i += VIRTIO_BALLOON_PAGES_PER_PAGE) { in release_pages_balloon()
177 struct page *page = balloon_pfn_to_page(vb->pfns[i]); in release_pages_balloon()
178 if (!virtio_has_feature(vb->vdev, in release_pages_balloon()
185 static unsigned leak_balloon(struct virtio_balloon *vb, size_t num) in leak_balloon() argument
189 struct balloon_dev_info *vb_dev_info = &vb->vb_dev_info; in leak_balloon()
192 num = min(num, ARRAY_SIZE(vb->pfns)); in leak_balloon()
194 mutex_lock(&vb->balloon_lock); in leak_balloon()
195 for (vb->num_pfns = 0; vb->num_pfns < num; in leak_balloon()
196 vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) { in leak_balloon()
200 set_page_pfns(vb->pfns + vb->num_pfns, page); in leak_balloon()
201 vb->num_pages -= VIRTIO_BALLOON_PAGES_PER_PAGE; in leak_balloon()
204 num_freed_pages = vb->num_pfns; in leak_balloon()
210 if (vb->num_pfns != 0) in leak_balloon()
211 tell_host(vb, vb->deflate_vq); in leak_balloon()
212 release_pages_balloon(vb); in leak_balloon()
213 mutex_unlock(&vb->balloon_lock); in leak_balloon()
217 static inline void update_stat(struct virtio_balloon *vb, int idx, in update_stat() argument
221 vb->stats[idx].tag = cpu_to_virtio16(vb->vdev, tag); in update_stat()
222 vb->stats[idx].val = cpu_to_virtio64(vb->vdev, val); in update_stat()
227 static void update_balloon_stats(struct virtio_balloon *vb) in update_balloon_stats() argument
236 update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_IN, in update_balloon_stats()
238 update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_OUT, in update_balloon_stats()
240 update_stat(vb, idx++, VIRTIO_BALLOON_S_MAJFLT, events[PGMAJFAULT]); in update_balloon_stats()
241 update_stat(vb, idx++, VIRTIO_BALLOON_S_MINFLT, events[PGFAULT]); in update_balloon_stats()
242 update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMFREE, in update_balloon_stats()
244 update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMTOT, in update_balloon_stats()
258 struct virtio_balloon *vb = vq->vdev->priv; in stats_request() local
260 vb->need_stats_update = 1; in stats_request()
261 wake_up(&vb->config_change); in stats_request()
264 static void stats_handle_request(struct virtio_balloon *vb) in stats_handle_request() argument
270 vb->need_stats_update = 0; in stats_handle_request()
271 update_balloon_stats(vb); in stats_handle_request()
273 vq = vb->stats_vq; in stats_handle_request()
276 sg_init_one(&sg, vb->stats, sizeof(vb->stats)); in stats_handle_request()
277 virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL); in stats_handle_request()
283 struct virtio_balloon *vb = vdev->priv; in virtballoon_changed() local
285 wake_up(&vb->config_change); in virtballoon_changed()
288 static inline s64 towards_target(struct virtio_balloon *vb) in towards_target() argument
293 virtio_cread(vb->vdev, struct virtio_balloon_config, num_pages, in towards_target()
297 if (!virtio_has_feature(vb->vdev, VIRTIO_F_VERSION_1)) in towards_target()
301 return target - vb->num_pages; in towards_target()
304 static void update_balloon_size(struct virtio_balloon *vb) in update_balloon_size() argument
306 u32 actual = vb->num_pages; in update_balloon_size()
309 if (!virtio_has_feature(vb->vdev, VIRTIO_F_VERSION_1)) in update_balloon_size()
312 virtio_cwrite(vb->vdev, struct virtio_balloon_config, actual, in update_balloon_size()
332 struct virtio_balloon *vb; in virtballoon_oom_notify() local
336 vb = container_of(self, struct virtio_balloon, nb); in virtballoon_oom_notify()
337 if (!virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM)) in virtballoon_oom_notify()
341 num_freed_pages = leak_balloon(vb, oom_pages); in virtballoon_oom_notify()
342 update_balloon_size(vb); in virtballoon_oom_notify()
350 struct virtio_balloon *vb = _vballoon; in balloon() local
359 add_wait_queue(&vb->config_change, &wait); in balloon()
361 if ((diff = towards_target(vb)) != 0 || in balloon()
362 vb->need_stats_update || in balloon()
368 remove_wait_queue(&vb->config_change, &wait); in balloon()
370 if (vb->need_stats_update) in balloon()
371 stats_handle_request(vb); in balloon()
373 fill_balloon(vb, diff); in balloon()
375 leak_balloon(vb, -diff); in balloon()
376 update_balloon_size(vb); in balloon()
387 static int init_vqs(struct virtio_balloon *vb) in init_vqs() argument
398 nvqs = virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ) ? 3 : 2; in init_vqs()
399 err = vb->vdev->config->find_vqs(vb->vdev, nvqs, vqs, callbacks, names); in init_vqs()
403 vb->inflate_vq = vqs[0]; in init_vqs()
404 vb->deflate_vq = vqs[1]; in init_vqs()
405 if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) { in init_vqs()
407 vb->stats_vq = vqs[2]; in init_vqs()
413 sg_init_one(&sg, vb->stats, sizeof vb->stats); in init_vqs()
414 if (virtqueue_add_outbuf(vb->stats_vq, &sg, 1, vb, GFP_KERNEL) in init_vqs()
417 virtqueue_kick(vb->stats_vq); in init_vqs()
444 struct virtio_balloon *vb = container_of(vb_dev_info, in virtballoon_migratepage() local
456 if (!mutex_trylock(&vb->balloon_lock)) in virtballoon_migratepage()
467 vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE; in virtballoon_migratepage()
468 set_page_pfns(vb->pfns, newpage); in virtballoon_migratepage()
469 tell_host(vb, vb->inflate_vq); in virtballoon_migratepage()
473 vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE; in virtballoon_migratepage()
474 set_page_pfns(vb->pfns, page); in virtballoon_migratepage()
475 tell_host(vb, vb->deflate_vq); in virtballoon_migratepage()
477 mutex_unlock(&vb->balloon_lock); in virtballoon_migratepage()
487 struct virtio_balloon *vb; in virtballoon_probe() local
496 vdev->priv = vb = kmalloc(sizeof(*vb), GFP_KERNEL); in virtballoon_probe()
497 if (!vb) { in virtballoon_probe()
502 vb->num_pages = 0; in virtballoon_probe()
503 mutex_init(&vb->balloon_lock); in virtballoon_probe()
504 init_waitqueue_head(&vb->config_change); in virtballoon_probe()
505 init_waitqueue_head(&vb->acked); in virtballoon_probe()
506 vb->vdev = vdev; in virtballoon_probe()
507 vb->need_stats_update = 0; in virtballoon_probe()
509 balloon_devinfo_init(&vb->vb_dev_info); in virtballoon_probe()
511 vb->vb_dev_info.migratepage = virtballoon_migratepage; in virtballoon_probe()
514 err = init_vqs(vb); in virtballoon_probe()
518 vb->nb.notifier_call = virtballoon_oom_notify; in virtballoon_probe()
519 vb->nb.priority = VIRTBALLOON_OOM_NOTIFY_PRIORITY; in virtballoon_probe()
520 err = register_oom_notifier(&vb->nb); in virtballoon_probe()
526 vb->thread = kthread_run(balloon, vb, "vballoon"); in virtballoon_probe()
527 if (IS_ERR(vb->thread)) { in virtballoon_probe()
528 err = PTR_ERR(vb->thread); in virtballoon_probe()
535 unregister_oom_notifier(&vb->nb); in virtballoon_probe()
539 kfree(vb); in virtballoon_probe()
544 static void remove_common(struct virtio_balloon *vb) in remove_common() argument
547 while (vb->num_pages) in remove_common()
548 leak_balloon(vb, vb->num_pages); in remove_common()
549 update_balloon_size(vb); in remove_common()
552 vb->vdev->config->reset(vb->vdev); in remove_common()
554 vb->vdev->config->del_vqs(vb->vdev); in remove_common()
559 struct virtio_balloon *vb = vdev->priv; in virtballoon_remove() local
561 unregister_oom_notifier(&vb->nb); in virtballoon_remove()
562 kthread_stop(vb->thread); in virtballoon_remove()
563 remove_common(vb); in virtballoon_remove()
564 kfree(vb); in virtballoon_remove()
570 struct virtio_balloon *vb = vdev->priv; in virtballoon_freeze() local
577 remove_common(vb); in virtballoon_freeze()
583 struct virtio_balloon *vb = vdev->priv; in virtballoon_restore() local
592 fill_balloon(vb, towards_target(vb)); in virtballoon_restore()
593 update_balloon_size(vb); in virtballoon_restore()