]> Git Repo - qemu.git/blob - balloon.c
tests/tcg: target/mips: Include isa/ase and group name in test output
[qemu.git] / balloon.c
1 /*
2  * Generic Balloon handlers and management
3  *
4  * Copyright (c) 2003-2008 Fabrice Bellard
5  * Copyright (C) 2011 Red Hat, Inc.
6  * Copyright (C) 2011 Amit Shah <[email protected]>
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  */
26
27 #include "qemu/osdep.h"
28 #include "qemu/atomic.h"
29 #include "exec/cpu-common.h"
30 #include "sysemu/kvm.h"
31 #include "sysemu/balloon.h"
32 #include "trace-root.h"
33 #include "qapi/error.h"
34 #include "qapi/qapi-commands-misc.h"
35 #include "qapi/qmp/qerror.h"
36
37 static QEMUBalloonEvent *balloon_event_fn;
38 static QEMUBalloonStatus *balloon_stat_fn;
39 static void *balloon_opaque;
40 static int balloon_inhibit_count;
41
42 bool qemu_balloon_is_inhibited(void)
43 {
44     return atomic_read(&balloon_inhibit_count) > 0;
45 }
46
47 void qemu_balloon_inhibit(bool state)
48 {
49     if (state) {
50         atomic_inc(&balloon_inhibit_count);
51     } else {
52         atomic_dec(&balloon_inhibit_count);
53     }
54
55     assert(atomic_read(&balloon_inhibit_count) >= 0);
56 }
57
58 static bool have_balloon(Error **errp)
59 {
60     if (kvm_enabled() && !kvm_has_sync_mmu()) {
61         error_set(errp, ERROR_CLASS_KVM_MISSING_CAP,
62                   "Using KVM without synchronous MMU, balloon unavailable");
63         return false;
64     }
65     if (!balloon_event_fn) {
66         error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
67                   "No balloon device has been activated");
68         return false;
69     }
70     return true;
71 }
72
73 int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
74                              QEMUBalloonStatus *stat_func, void *opaque)
75 {
76     if (balloon_event_fn || balloon_stat_fn || balloon_opaque) {
77         /* We're already registered one balloon handler.  How many can
78          * a guest really have?
79          */
80         return -1;
81     }
82     balloon_event_fn = event_func;
83     balloon_stat_fn = stat_func;
84     balloon_opaque = opaque;
85     return 0;
86 }
87
88 void qemu_remove_balloon_handler(void *opaque)
89 {
90     if (balloon_opaque != opaque) {
91         return;
92     }
93     balloon_event_fn = NULL;
94     balloon_stat_fn = NULL;
95     balloon_opaque = NULL;
96 }
97
98 BalloonInfo *qmp_query_balloon(Error **errp)
99 {
100     BalloonInfo *info;
101
102     if (!have_balloon(errp)) {
103         return NULL;
104     }
105
106     info = g_malloc0(sizeof(*info));
107     balloon_stat_fn(balloon_opaque, info);
108     return info;
109 }
110
111 void qmp_balloon(int64_t target, Error **errp)
112 {
113     if (!have_balloon(errp)) {
114         return;
115     }
116
117     if (target <= 0) {
118         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "target", "a size");
119         return;
120     }
121
122     trace_balloon_event(balloon_opaque, target);
123     balloon_event_fn(balloon_opaque, target);
124 }
This page took 0.029958 seconds and 4 git commands to generate.