Annotation of qemu/balloon.c, revision 1.1.1.5

1.1       root        1: /*
1.1.1.3   root        2:  * Generic Balloon handlers and management
1.1       root        3:  *
                      4:  * Copyright (c) 2003-2008 Fabrice Bellard
1.1.1.3   root        5:  * Copyright (C) 2011 Red Hat, Inc.
                      6:  * Copyright (C) 2011 Amit Shah <amit.shah@redhat.com>
1.1       root        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 "monitor.h"
                     28: #include "cpu-common.h"
                     29: #include "kvm.h"
                     30: #include "balloon.h"
1.1.1.2   root       31: #include "trace.h"
1.1.1.4   root       32: #include "qmp-commands.h"
1.1       root       33: 
1.1.1.3   root       34: static QEMUBalloonEvent *balloon_event_fn;
                     35: static QEMUBalloonStatus *balloon_stat_fn;
                     36: static void *balloon_opaque;
                     37: 
                     38: int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
                     39:                              QEMUBalloonStatus *stat_func, void *opaque)
                     40: {
                     41:     if (balloon_event_fn || balloon_stat_fn || balloon_opaque) {
                     42:         /* We're already registered one balloon handler.  How many can
                     43:          * a guest really have?
                     44:          */
                     45:         error_report("Another balloon device already registered");
                     46:         return -1;
                     47:     }
                     48:     balloon_event_fn = event_func;
                     49:     balloon_stat_fn = stat_func;
                     50:     balloon_opaque = opaque;
                     51:     return 0;
1.1       root       52: }
                     53: 
1.1.1.4   root       54: void qemu_remove_balloon_handler(void *opaque)
                     55: {
                     56:     if (balloon_opaque != opaque) {
                     57:         return;
                     58:     }
                     59:     balloon_event_fn = NULL;
                     60:     balloon_stat_fn = NULL;
                     61:     balloon_opaque = NULL;
                     62: }
                     63: 
1.1.1.3   root       64: static int qemu_balloon(ram_addr_t target)
1.1       root       65: {
1.1.1.3   root       66:     if (!balloon_event_fn) {
1.1       root       67:         return 0;
                     68:     }
1.1.1.3   root       69:     trace_balloon_event(balloon_opaque, target);
                     70:     balloon_event_fn(balloon_opaque, target);
                     71:     return 1;
1.1       root       72: }
                     73: 
1.1.1.4   root       74: static int qemu_balloon_status(BalloonInfo *info)
1.1       root       75: {
1.1.1.3   root       76:     if (!balloon_stat_fn) {
1.1       root       77:         return 0;
                     78:     }
1.1.1.4   root       79:     balloon_stat_fn(balloon_opaque, info);
1.1.1.3   root       80:     return 1;
1.1       root       81: }
                     82: 
1.1.1.4   root       83: BalloonInfo *qmp_query_balloon(Error **errp)
1.1       root       84: {
1.1.1.4   root       85:     BalloonInfo *info;
1.1       root       86: 
                     87:     if (kvm_enabled() && !kvm_has_sync_mmu()) {
1.1.1.4   root       88:         error_set(errp, QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
                     89:         return NULL;
1.1       root       90:     }
                     91: 
1.1.1.4   root       92:     info = g_malloc0(sizeof(*info));
                     93: 
                     94:     if (qemu_balloon_status(info) == 0) {
                     95:         error_set(errp, QERR_DEVICE_NOT_ACTIVE, "balloon");
                     96:         qapi_free_BalloonInfo(info);
                     97:         return NULL;
1.1       root       98:     }
                     99: 
1.1.1.4   root      100:     return info;
1.1       root      101: }
                    102: 
1.1.1.5 ! root      103: void qmp_balloon(int64_t value, Error **errp)
1.1       root      104: {
                    105:     if (kvm_enabled() && !kvm_has_sync_mmu()) {
1.1.1.5 ! root      106:         error_set(errp, QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
        !           107:         return;
1.1       root      108:     }
                    109: 
1.1.1.5 ! root      110:     if (value <= 0) {
        !           111:         error_set(errp, QERR_INVALID_PARAMETER_VALUE, "target", "a size");
        !           112:         return;
1.1.1.3   root      113:     }
1.1.1.5 ! root      114:     
        !           115:     if (qemu_balloon(value) == 0) {
        !           116:         error_set(errp, QERR_DEVICE_NOT_ACTIVE, "balloon");
1.1       root      117:     }
                    118: }

unix.superglobalmegacorp.com