From patchwork Wed Jun 9 05:37:42 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcos Oviedo X-Patchwork-Id: 55050 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id E8F47B7D59 for ; Wed, 9 Jun 2010 15:40:33 +1000 (EST) Received: from localhost ([127.0.0.1]:57464 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OME1e-0003ms-8D for incoming@patchwork.ozlabs.org; Wed, 09 Jun 2010 01:40:30 -0400 Received: from [140.186.70.92] (port=45539 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OMDz3-0002vl-4h for qemu-devel@nongnu.org; Wed, 09 Jun 2010 01:37:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OMDyy-0002Do-6y for qemu-devel@nongnu.org; Wed, 09 Jun 2010 01:37:49 -0400 Received: from mail-vw0-f45.google.com ([209.85.212.45]:46366) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OMDyy-0002Da-4M for qemu-devel@nongnu.org; Wed, 09 Jun 2010 01:37:44 -0400 Received: by vws18 with SMTP id 18so1781876vws.4 for ; Tue, 08 Jun 2010 22:37:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=ea8gHerdOPk0hqdJN2rbHPNLot0ecs6CQTQmw8bEJlA=; b=fb3aWzCwmLHFUsQds7qeCDOwxyEHRgcOM33lSC3PQLBPdJHBlSL2LDHyh/IQiOGaHy Yfz1W23mVpMxqbBHBhQ5bM9lfZY/BYQE2qZrXOItfDKRvqZEjfgWwXIol0ZeBgam/9fe DoRx8uZ+dF55CRW/1F2ectxEFVVj59uMaqvZA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=V1k+k92RHvkWL8QKkT+KvfIjbvuHo2d4EAZAsVmi2Zi8AfboerbDrCcDjxxaVZ0uw+ eFd6UJMuYf2SKraHPn9SU2f5//RwwY5r+z8Ls5ixNkoRe3vkeuBnF6JTlK7vU/S+pQ+1 O1RVEjITPcIcMjIkBFKFJYqsdgjMGZ1AjWvUo= MIME-Version: 1.0 Received: by 10.224.39.76 with SMTP id f12mr530623qae.304.1276061862586; Tue, 08 Jun 2010 22:37:42 -0700 (PDT) Received: by 10.229.248.201 with HTTP; Tue, 8 Jun 2010 22:37:42 -0700 (PDT) Date: Wed, 9 Jun 2010 02:37:42 -0300 Message-ID: From: Marcos Oviedo To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [Qemu-devel] [PATCH] monitor: Add force option support to pci_del command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This adds a way to force the removal/unplug of previously added pci devices when ACPI-based hotplug mechanism is not present. Signed-off-by: Marcos Oviedo --- hw/pci-hotplug.c | 16 +++++++++++++--- qemu-monitor.hx | 4 ++-- sysemu.h | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) /* serial ports */ diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index a8f3df1..1007e5b 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -260,11 +260,12 @@ void pci_device_hot_add(Monitor *mon, const QDict *qdict) } #endif -int pci_device_hot_remove(Monitor *mon, const char *pci_addr) +int pci_device_hot_remove(Monitor *mon, const char *pci_addr, const int forced) { PCIDevice *d; int dom, bus; unsigned slot; + int ret = -1; if (pci_read_devaddr(mon, pci_addr, &dom, &bus, &slot)) { return -1; @@ -275,10 +276,19 @@ int pci_device_hot_remove(Monitor *mon, const char *pci_addr) monitor_printf(mon, "slot %d empty\n", slot); return -1; } - return qdev_unplug(&d->qdev); + + if (forced) { + qdev_free(&d->qdev); + ret = 0; + } + else { + ret = qdev_unplug(&d->qdev); + } + + return ret; } void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict) { - pci_device_hot_remove(mon, qdict_get_str(qdict, "pci_addr")); + pci_device_hot_remove(mon, qdict_get_str(qdict, "pci_addr"), qdict_get_int(qdict, "force")); } diff --git a/qemu-monitor.hx b/qemu-monitor.hx index f6a94f2..ce8cddd 100644 --- a/qemu-monitor.hx +++ b/qemu-monitor.hx @@ -1140,8 +1140,8 @@ ETEXI #if defined(TARGET_I386) { .name = "pci_del", - .args_type = "pci_addr:s", - .params = "[[:]:]", + .args_type = "pci_addr:s,force:-f", + .params = "[[:]:] [-f]", .help = "hot remove PCI device", .mhandler.cmd = do_pci_device_hot_remove, }, diff --git a/sysemu.h b/sysemu.h index 879446a..22303b3 100644 --- a/sysemu.h +++ b/sysemu.h @@ -202,7 +202,7 @@ DriveInfo *add_init_drive(const char *opts); /* pci-hotplug */ void pci_device_hot_add(Monitor *mon, const QDict *qdict); void drive_hot_add(Monitor *mon, const QDict *qdict); -int pci_device_hot_remove(Monitor *mon, const char *pci_addr); +int pci_device_hot_remove(Monitor *mon, const char *pci_addr, const int forced); void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict);