File:  [Qemu by Fabrice Bellard] / qemu / balloon.c
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 19:16:40 2018 UTC (3 years, 1 month ago) by root
Branches: qemu, MAIN
CVS tags: qemu1001, HEAD
qemu 1.0.1

    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 <amit.shah@redhat.com>
    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"
   31: #include "trace.h"
   32: #include "qmp-commands.h"
   33: 
   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;
   52: }
   53: 
   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: 
   64: static int qemu_balloon(ram_addr_t target)
   65: {
   66:     if (!balloon_event_fn) {
   67:         return 0;
   68:     }
   69:     trace_balloon_event(balloon_opaque, target);
   70:     balloon_event_fn(balloon_opaque, target);
   71:     return 1;
   72: }
   73: 
   74: static int qemu_balloon_status(BalloonInfo *info)
   75: {
   76:     if (!balloon_stat_fn) {
   77:         return 0;
   78:     }
   79:     balloon_stat_fn(balloon_opaque, info);
   80:     return 1;
   81: }
   82: 
   83: BalloonInfo *qmp_query_balloon(Error **errp)
   84: {
   85:     BalloonInfo *info;
   86: 
   87:     if (kvm_enabled() && !kvm_has_sync_mmu()) {
   88:         error_set(errp, QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
   89:         return NULL;
   90:     }
   91: 
   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;
   98:     }
   99: 
  100:     return info;
  101: }
  102: 
  103: /**
  104:  * do_balloon(): Request VM to change its memory allocation
  105:  */
  106: int do_balloon(Monitor *mon, const QDict *params,
  107: 	       MonitorCompletion cb, void *opaque)
  108: {
  109:     int64_t target;
  110:     int ret;
  111: 
  112:     if (kvm_enabled() && !kvm_has_sync_mmu()) {
  113:         qerror_report(QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
  114:         return -1;
  115:     }
  116: 
  117:     target = qdict_get_int(params, "value");
  118:     if (target <= 0) {
  119:         qerror_report(QERR_INVALID_PARAMETER_VALUE, "target", "a size");
  120:         return -1;
  121:     }
  122:     ret = qemu_balloon(target);
  123:     if (ret == 0) {
  124:         qerror_report(QERR_DEVICE_NOT_ACTIVE, "balloon");
  125:         return -1;
  126:     }
  127: 
  128:     cb(opaque, NULL);
  129:     return 0;
  130: }

unix.superglobalmegacorp.com