Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/811498/?format=api
{ "id": 811498, "url": "http://patchwork.ozlabs.org/api/patches/811498/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170908103558.31632-4-david@gibson.dropbear.id.au/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170908103558.31632-4-david@gibson.dropbear.id.au>", "list_archive_url": null, "date": "2017-09-08T10:35:21", "name": "[PULL,03/40] hw/ppc: CAS reset on early device hotplug", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "8fe0d84e10625032e5e82bc45a36aa576f420bd6", "submitter": { "id": 47, "url": "http://patchwork.ozlabs.org/api/people/47/?format=api", "name": "David Gibson", "email": "david@gibson.dropbear.id.au" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170908103558.31632-4-david@gibson.dropbear.id.au/mbox/", "series": [ { "id": 2179, "url": "http://patchwork.ozlabs.org/api/series/2179/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=2179", "date": "2017-09-08T10:35:20", "name": "[PULL,01/40] hw/ppc/spapr_drc.c: change spapr_drc_needed to use drc->dev", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/2179/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/811498/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/811498/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=gibson.dropbear.id.au\n\theader.i=@gibson.dropbear.id.au header.b=\"nL2LRn1m\"; \n\tdkim-atps=neutral" ], "Received": [ "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xpYjt1tpgz9s7h\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 8 Sep 2017 20:40:02 +1000 (AEST)", "from localhost ([::1]:44462 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dqGhc-0005AN-AH\n\tfor incoming@patchwork.ozlabs.org; Fri, 08 Sep 2017 06:40:00 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:58543)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <dgibson@ozlabs.org>) id 1dqGdz-000244-Lv\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 06:36:20 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <dgibson@ozlabs.org>) id 1dqGdu-00037Y-K1\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 06:36:15 -0400", "from ozlabs.org ([2401:3900:2:1::2]:33655)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <dgibson@ozlabs.org>)\n\tid 1dqGdu-00032E-8S; Fri, 08 Sep 2017 06:36:10 -0400", "by ozlabs.org (Postfix, from userid 1007)\n\tid 3xpYdH2lhrz9s7h; Fri, 8 Sep 2017 20:36:03 +1000 (AEST)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n\td=gibson.dropbear.id.au; s=201602; t=1504866963;\n\tbh=ajGqqHvfmXI8PZmEutJmnAWtAGg39AcACOWOPGWeDXY=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=nL2LRn1mVn7CdaJCyQkBY5zS2lk7yXE5aTVcG0t1DHBpHAQrO54kLlM+EhT6E2Ev7\n\tmsDAj0XCMn42bFWtUwEXEnyVPPOgSEgojbVFE79JfpCjkJlXfx3pRPNgK4Mu7mQY+3\n\tLsVZczUsgDGR5FZYEBuymmmI8Sgam6vvJoVPpJDc=", "From": "David Gibson <david@gibson.dropbear.id.au>", "To": "peter.maydell@linaro.org", "Date": "Fri, 8 Sep 2017 20:35:21 +1000", "Message-Id": "<20170908103558.31632-4-david@gibson.dropbear.id.au>", "X-Mailer": "git-send-email 2.13.5", "In-Reply-To": "<20170908103558.31632-1-david@gibson.dropbear.id.au>", "References": "<20170908103558.31632-1-david@gibson.dropbear.id.au>", "X-detected-operating-system": "by eggs.gnu.org: Genre and OS details not\n\trecognized.", "X-Received-From": "2401:3900:2:1::2", "Subject": "[Qemu-devel] [PULL 03/40] hw/ppc: CAS reset on early device hotplug", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.21", "Precedence": "list", "List-Id": "<qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Cc": "qemu-devel@nongnu.org, aik@ozlabs.ru, agraf@suse.de,\n\tmdroth@linux.vnet.ibm.com, qemu-ppc@nongnu.org, imammedo@redhat.com, \n\tDaniel Henrique Barboza <danielhb@linux.vnet.ibm.com>,\n\tsam.bobroff@au1.ibm.com, David Gibson <david@gibson.dropbear.id.au>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>" }, "content": "From: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>\n\nThis patch is a follow up on the discussions made in patch\n\"hw/ppc: disable hotplug before CAS is completed\" that can be\nfound at [1].\n\nAt this moment, we do not support CPU/memory hotplug in early\nboot stages, before CAS. When a hotplug occurs, the event is logged\nin an internal RTAS event log queue and an IRQ pulse is fired. In\nregular conditions, the guest handles the interrupt by executing\ncheck_exception, fetching the generated hotplug event and enabling\nthe device for use.\n\nIn early boot, this IRQ isn't caught (SLOF does not handle hotplug\nevents), leaving the event in the rtas event log queue. If the guest\nexecutes check_exception due to another hotplug event, the re-assertion\nof the IRQ ends up de-queuing the first hotplug event as well. In short,\na device hotplugged before CAS is considered coldplugged by SLOF.\nThis leads to device misbehavior and, in some cases, guest kernel\nOoops when trying to unplug the device.\n\nA proper fix would be to turn every device hotplugged before CAS\nas a colplugged device. This is not trivial to do with the current\ncode base though - the FDT is written in the guest memory at\nppc_spapr_reset and can't be retrieved without adding extra state\n(fdt_size for example) that will need to managed and migrated. Adding\nthe hotplugged DT in the middle of CAS negotiation via the updated DT\ntree works with CPU devs, but panics the guest kernel at boot. Additional\nanalysis would be necessary for LMBs and PCI devices. There are\nquestions to be made in QEMU/SLOF/kernel level about how we can make\nthis change in a sustainable way.\n\nWith Linux guests, a fix would be the kernel executing check_exception\nat boot time, de-queueing the events that happened in early boot and\nprocessing them. However, even if/when the newer kernels start\nfetching these events at boot time, we need to take care of older\nkernels that won't be doing that.\n\nThis patch works around the situation by issuing a CAS reset if a hotplugged\ndevice is detected during CAS:\n\n- the DRC conditions that warrant a CAS reset is the same as those that\ntriggers a DRC migration - the DRC must have a device attached and\nthe DRC state is not equal to its ready_state. With that in mind, this\npatch makes use of 'spapr_drc_needed' to determine if a CAS reset\nis needed.\n\n- In the middle of CAS negotiations, the function\n'spapr_hotplugged_dev_before_cas' goes through all the DRCs to see\nif there are any DRC that requires a reset, using spapr_drc_needed. If\nthat happens, returns '1' in 'spapr_h_cas_compose_response' which will set\nspapr->cas_reboot to true, causing the machine to reboot.\n\nNo changes are made for coldplug devices.\n\n[1] http://lists.nongnu.org/archive/html/qemu-devel/2017-08/msg02855.html\n\nSigned-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>\nSigned-off-by: David Gibson <david@gibson.dropbear.id.au>\n---\n hw/ppc/spapr.c | 26 +++++++++++++++++++++++++-\n hw/ppc/spapr_drc.c | 2 +-\n include/hw/ppc/spapr_drc.h | 1 +\n 3 files changed, 27 insertions(+), 2 deletions(-)", "diff": "diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c\nindex 0e5f29d348..954fd1a747 100644\n--- a/hw/ppc/spapr.c\n+++ b/hw/ppc/spapr.c\n@@ -790,6 +790,26 @@ out:\n return ret;\n }\n \n+static bool spapr_hotplugged_dev_before_cas(void)\n+{\n+ Object *drc_container, *obj;\n+ ObjectProperty *prop;\n+ ObjectPropertyIterator iter;\n+\n+ drc_container = container_get(object_get_root(), \"/dr-connector\");\n+ object_property_iter_init(&iter, drc_container);\n+ while ((prop = object_property_iter_next(&iter))) {\n+ if (!strstart(prop->type, \"link<\", NULL)) {\n+ continue;\n+ }\n+ obj = object_property_get_link(drc_container, prop->name, NULL);\n+ if (spapr_drc_needed(obj)) {\n+ return true;\n+ }\n+ }\n+ return false;\n+}\n+\n int spapr_h_cas_compose_response(sPAPRMachineState *spapr,\n target_ulong addr, target_ulong size,\n sPAPROptionVector *ov5_updates)\n@@ -797,9 +817,13 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr,\n void *fdt, *fdt_skel;\n sPAPRDeviceTreeUpdateHeader hdr = { .version_id = 1 };\n \n+ if (spapr_hotplugged_dev_before_cas()) {\n+ return 1;\n+ }\n+\n size -= sizeof(hdr);\n \n- /* Create sceleton */\n+ /* Create skeleton */\n fdt_skel = g_malloc0(size);\n _FDT((fdt_create(fdt_skel, size)));\n _FDT((fdt_begin_node(fdt_skel, \"\")));\ndiff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c\nindex 031ba7c387..85c999d9cb 100644\n--- a/hw/ppc/spapr_drc.c\n+++ b/hw/ppc/spapr_drc.c\n@@ -460,7 +460,7 @@ static void drc_reset(void *opaque)\n spapr_drc_reset(SPAPR_DR_CONNECTOR(opaque));\n }\n \n-static bool spapr_drc_needed(void *opaque)\n+bool spapr_drc_needed(void *opaque)\n {\n sPAPRDRConnector *drc = (sPAPRDRConnector *)opaque;\n sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);\ndiff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h\nindex a7958d0a8d..f8d9f5b231 100644\n--- a/include/hw/ppc/spapr_drc.h\n+++ b/include/hw/ppc/spapr_drc.h\n@@ -257,6 +257,7 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,\n void spapr_drc_attach(sPAPRDRConnector *drc, DeviceState *d, void *fdt,\n int fdt_start_offset, Error **errp);\n void spapr_drc_detach(sPAPRDRConnector *drc);\n+bool spapr_drc_needed(void *opaque);\n \n static inline bool spapr_drc_unplug_requested(sPAPRDRConnector *drc)\n {\n", "prefixes": [ "PULL", "03/40" ] }