From patchwork Wed Jul 11 10:32:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vasilis Liaskovitis X-Patchwork-Id: 170432 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 17F392C0209 for ; Wed, 11 Jul 2012 21:33:10 +1000 (EST) Received: from localhost ([::1]:42063 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SouEh-0005L6-69 for incoming@patchwork.ozlabs.org; Wed, 11 Jul 2012 06:33:35 -0400 Received: from eggs.gnu.org ([208.118.235.92]:44372) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SouDg-0003iI-6U for qemu-devel@nongnu.org; Wed, 11 Jul 2012 06:32:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SouDY-0005ti-W1 for qemu-devel@nongnu.org; Wed, 11 Jul 2012 06:32:31 -0400 Received: from mail-bk0-f45.google.com ([209.85.214.45]:57574) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SouDY-0005oR-Pp for qemu-devel@nongnu.org; Wed, 11 Jul 2012 06:32:24 -0400 Received: by mail-bk0-f45.google.com with SMTP id ji1so712860bkc.4 for ; Wed, 11 Jul 2012 03:32:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=v7Ul0GCKFBvB+cppTRQtfNfCSEeKY5GWJ7hqZLlTr2U=; b=nK1ySq7fu5NnTUmA1M5rwlGzJxcYABU/wXYK3K1ua4O2UfWVnlFXri3cFmWLuq5A62 i8WJI+ovx27X6eYH6yjHe4vz7DZ8QkONgVRjM17acKCN9iz0VYDSGcIp9g/jrXF7uu4+ CtpkvQYPIKl7PTn3C7yHP0SzJ9NwglqrgxutQAh04F2s79kSJrKGpVIg5qniyOCqcXLT YPhTmszzNw90fpH7b5oXa2HI8vZm4lm9WzFIuZrc2XC3cWrGc9z7g2SpFWWYCH8Ta15D SIKiPjXVhjM/gRDLgm0lHWTFz659Lswh9/pg3kKLt0uj53zrYQqNTVZSPiDabnGLWFi9 CKzw== Received: by 10.205.126.15 with SMTP id gu15mr22909928bkc.134.1342002743627; Wed, 11 Jul 2012 03:32:23 -0700 (PDT) Received: from dhcp-192-168-178-175.ri.profitbricks.localdomain ([62.217.45.26]) by mx.google.com with ESMTPS id e20sm794740bkv.10.2012.07.11.03.32.23 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 11 Jul 2012 03:32:23 -0700 (PDT) From: Vasilis Liaskovitis To: qemu-devel@nongnu.org, kvm@vger.kernel.org, seabios@seabios.org Date: Wed, 11 Jul 2012 12:32:03 +0200 Message-Id: <1342002726-18258-19-git-send-email-vasilis.liaskovitis@profitbricks.com> X-Mailer: git-send-email 1.7.9 In-Reply-To: <1342002726-18258-1-git-send-email-vasilis.liaskovitis@profitbricks.com> References: <1342002726-18258-1-git-send-email-vasilis.liaskovitis@profitbricks.com> X-Gm-Message-State: ALoCoQknGo6OeIoqpAGOgkG1nDzCPUV7FvI9GJeJkfFQ3s/RYR+i8mvtCtJbwW1RhtFnxN/I9IKM X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.214.45 Cc: gleb@redhat.com, Vasilis Liaskovitis , kevin@koconnor.net, avi@redhat.com, anthony@codemonkey.ws, imammedo@redhat.com Subject: [Qemu-devel] [RFC PATCH v2 18/21] acpi_piix4: Update dimm bitmap state on hot-remove fail X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This allows failed hot operations to be retried at anytime. This only works for guests that use _OST notification. Other guests cannot retry failed hot operations on same devices until after reboot. Signed-off-by: Vasilis Liaskovitis --- hw/acpi_piix4.c | 20 +++++++++++++++++++- hw/dimm.c | 16 +++++++++++++++- hw/dimm.h | 2 +- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c index ebc5de7..db631cc 100644 --- a/hw/acpi_piix4.c +++ b/hw/acpi_piix4.c @@ -599,6 +599,7 @@ static uint32_t pcirmv_read(void *opaque, uint32_t addr) static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, PCIHotplugState state); static int piix4_dimm_hotplug(DeviceState *qdev, SysBusDevice *dev, int add); +static int piix4_dimm_revert(DeviceState *qdev, SysBusDevice *dev, int add); static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s) { @@ -627,7 +628,7 @@ static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s) } pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev); - dimm_register_hotplug(piix4_dimm_hotplug, &s->dev.qdev); + dimm_register_hotplug(piix4_dimm_hotplug, piix4_dimm_revert, &s->dev.qdev); } static void enable_device(PIIX4PMState *s, int slot) @@ -696,6 +697,23 @@ void piix4_dimm_state_sync(PIIX4PMState *s) } } +static int piix4_dimm_revert(DeviceState *qdev, SysBusDevice *dev, int add) +{ + PCIDevice *pci_dev = DO_UPCAST(PCIDevice, qdev, qdev); + PIIX4PMState *s = DO_UPCAST(PIIX4PMState, dev, pci_dev); + struct gpe_regs *g = &s->gperegs; + DimmState *slot = DIMM(dev); + int idx = slot->idx; + + if (add) { + g->mems_sts[idx/8] &= ~(1 << (idx%8)); + } + else { + g->mems_sts[idx/8] |= (1 << (idx%8)); + } + return 0; +} + static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, PCIHotplugState state) { diff --git a/hw/dimm.c b/hw/dimm.c index ba104cc..2115567 100644 --- a/hw/dimm.c +++ b/hw/dimm.c @@ -25,6 +25,7 @@ static DeviceState *dimm_hotplug_qdev; static dimm_hotplug_fn dimm_hotplug; +static dimm_hotplug_fn dimm_revert; static QTAILQ_HEAD(Dimmlist, DimmState) dimmlist; static QTAILQ_HEAD(dimm_hp_result_head, dimm_hp_result) dimm_hp_result_queue; @@ -77,10 +78,12 @@ DimmState *dimm_create(char *id, uint64_t size, uint64_t node, uint32_t return mdev; } -void dimm_register_hotplug(dimm_hotplug_fn hotplug, DeviceState *qdev) +void dimm_register_hotplug(dimm_hotplug_fn hotplug, dimm_hotplug_fn revert, + DeviceState *qdev) { dimm_hotplug_qdev = qdev; dimm_hotplug = hotplug; + dimm_revert = revert; dimm_scan_populated(); } @@ -211,10 +214,20 @@ void dimm_notify(uint32_t idx, uint32_t event) s->pending = false; break; case DIMM_REMOVE_FAIL: + QTAILQ_INSERT_TAIL(&dimm_hp_result_queue, result, next); + s->pending = false; + if (dimm_revert) + dimm_revert(dimm_hotplug_qdev, (SysBusDevice*)s, 0); + break; case DIMM_ADD_SUCCESS: + QTAILQ_INSERT_TAIL(&dimm_hp_result_queue, result, next); + s->pending = false; + break; case DIMM_ADD_FAIL: QTAILQ_INSERT_TAIL(&dimm_hp_result_queue, result, next); s->pending = false; + if (dimm_revert) + dimm_revert(dimm_hotplug_qdev, (SysBusDevice*)s, 1); break; default: g_free(result); @@ -288,6 +301,7 @@ static void dimm_class_init(ObjectClass *klass, void *data) dc->props = dimm_properties; sc->init = dimm_init; dimm_hotplug = NULL; + dimm_revert = NULL; QTAILQ_INIT(&dimmlist); QTAILQ_INIT(&dimm_hp_result_queue); } diff --git a/hw/dimm.h b/hw/dimm.h index 0fa6137..b563e3f 100644 --- a/hw/dimm.h +++ b/hw/dimm.h @@ -54,7 +54,7 @@ void dimm_depopulate(DimmState *s); int dimm_do(Monitor *mon, const QDict *qdict, bool add); DimmState *dimm_find_from_idx(uint32_t idx); DimmState *dimm_find_from_name(char *id); -void dimm_register_hotplug(dimm_hotplug_fn hotplug, DeviceState *qdev); +void dimm_register_hotplug(dimm_hotplug_fn hotplug, dimm_hotplug_fn revert, DeviceState *qdev); void dimm_calc_offsets(dimm_calcoffset_fn calcfn); void dimm_activate(DimmState *slot); void dimm_deactivate(DimmState *slot);