From nobody Sun Feb 8 10:15:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561099845; cv=none; d=zoho.com; s=zohoarc; b=YYROguS5rENtP5SBPJxbAxhjlgXW74XtI31Udv1oR2uwFGcqpexFRVF4g1HsY5ZkKQmoTED73NlUSawVTM6S0MWD4tTC3+4/EDnbibL1BP+KipAZ0oUrq1/Gv0vP6y1lIg6LsENlVr23tBejTYKtwTUsSI4MdjMfCab+93zpyBo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561099845; h=Content-Type:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=fs4Y07E+1GAKPQC2EK12ZPOAC9gn6lG/ttRIZSdSg+s=; b=X19+t6muYwP9ZyQVivhQovWMkQGSNSaOq70cBkAAQIiRn1iqzmdDwWL9aZBzHzWkbKBvv72u5z11JsKJ/bNQgjK5X1FlPNxMfjXOiwjUtwe2UgqwSjZx5HhW5LwjhYeD1NY6Wa6c5vZkKf2PMwtgqrut0pwSDNXPg1VgskXscuQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561099845177531.0597780287919; Thu, 20 Jun 2019 23:50:45 -0700 (PDT) Received: from localhost ([::1]:55094 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1heDNh-0001oU-FS for importer@patchew.org; Fri, 21 Jun 2019 02:50:41 -0400 Received: from eggs.gnu.org ([209.51.188.92]:56628) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1heDKf-00087T-98 for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:47:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1heDJw-0005SY-Tn for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:46:49 -0400 Received: from mail-qt1-f195.google.com ([209.85.160.195]:46007) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1heDJw-0005Rm-QE for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:46:48 -0400 Received: by mail-qt1-f195.google.com with SMTP id j19so5835966qtr.12 for ; Thu, 20 Jun 2019 23:46:48 -0700 (PDT) Received: from redhat.com (pool-100-0-197-103.bstnma.fios.verizon.net. [100.0.197.103]) by smtp.gmail.com with ESMTPSA id z1sm908155qke.122.2019.06.20.23.46.47 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 20 Jun 2019 23:46:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=fs4Y07E+1GAKPQC2EK12ZPOAC9gn6lG/ttRIZSdSg+s=; b=HyPfICshR9MxLRMu9TjjAabytHF+1hm7iImJLKc+vbegRbHDVniwtWFyKPgFHzz6WC xZbqqvaMD+aVsuKfJUTGdrM1YRJ/2GopH3ZunL/XO569kmAtkYsKWjXIezVANVzu5cFT 6JyloZ4BQIkL/9MsDyQ8svEkzaUra1+VWh9ZCgtoNRZQgp2if5atRRGmz1loqOXjmGIF /iSDDnF8sDmvKHN32lwnvZsOFqC3ornPyEcmaKHQUzbFcHebWQAp505kLZnFgFItCpry mFTCStfrzzs/ibJlbm7OpUBibOGWm/nSRhrTSUSZ4c/GnNO3Q9TveSatexPQC+PI2j+5 Ix3A== X-Gm-Message-State: APjAAAW3qapj848Kgngi2yqxlK/u9dQMlS1m2DMVdR4WMmJ1l4BmJ/Se UiNYoN84oEW6YoN3rWjaYcNurrB3c88= X-Google-Smtp-Source: APXvYqydSjGQQjtuUiePWzzI2qsKqxLudFKBIbQ07Tt7MkkJ2SVbRuEqDiPUEzYkvR8+re5zPyB8Sw== X-Received: by 2002:ac8:2b14:: with SMTP id 20mr23638136qtu.295.1561099608038; Thu, 20 Jun 2019 23:46:48 -0700 (PDT) Date: Fri, 21 Jun 2019 02:46:46 -0400 From: "Michael S. Tsirkin" To: qemu-devel@nongnu.org Message-ID: <20190621064615.20099-2-mst@redhat.com> References: <20190621064615.20099-1-mst@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190621064615.20099-1-mst@redhat.com> X-Mailer: git-send-email 2.17.1.1206.gb667731e2e.dirty X-Mutt-Fcc: =sent X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.160.195 Subject: [Qemu-devel] [PATCH 1/3] pcie: don't skip multi-mask events X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If we are trying to set multiple bits at once, testing that just one of them is already set gives a false positive. As a result we won't interrupt guest if e.g. presence detection change and attention button press are both set. This happens with multi-function device removal. Signed-off-by: Michael S. Tsirkin Reviewed-by: Igor Mammedov Reviewed-by: Marcel Apfelbaum Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/pci/pcie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index 88c30ff74c..b22527000d 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -383,7 +383,7 @@ static void pcie_cap_slot_event(PCIDevice *dev, PCIExpr= essHotPlugEvent event) { /* Minor optimization: if nothing changed - no event is needed. */ if (pci_word_test_and_set_mask(dev->config + dev->exp.exp_cap + - PCI_EXP_SLTSTA, event)) { + PCI_EXP_SLTSTA, event) =3D=3D event) { return; } hotplug_event_notify(dev); --=20 MST From nobody Sun Feb 8 10:15:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561099847; cv=none; d=zoho.com; s=zohoarc; b=bPVXV8uhNknbjqg/XEEgTKcQGUrBoG/4GWwc6ZEZZXpBbF+AFEKsCRCSnC5EMmZvUAlnle20NZNopeMLSILqZv//WJYeFxVPnE/uBtSI2oMw5v9ZxnAKzoqZ5G8R4TIf07FQS5awmtu3EwetEu+hvriFyc3nhTGAVMa4EXx6+ZA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561099847; h=Content-Type:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=vBZ5OU12c4PDiqrs3EsUx7W7QPqh2FB4ggafxVecKE4=; b=R6t+BByRyoLybIKpipNUeenxxtgGwifjB/xEJ23kdDUnjFrm7NsZFy1vei7LZyXjIGv5uB1ZqmirxEN+4IpMAle/+6Z8EY3WoZnh50sClEKHY02xA4kC33vPcU2blfsaIVgqd8VThHH7157nDd9m2BN6tK0WH5vRNeK8NwU6rdM= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561099847490299.0414273936756; Thu, 20 Jun 2019 23:50:47 -0700 (PDT) Received: from localhost ([::1]:55092 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1heDNh-0001oM-DU for importer@patchew.org; Fri, 21 Jun 2019 02:50:41 -0400 Received: from eggs.gnu.org ([209.51.188.92]:56583) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1heDKe-00084e-8U for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:47:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1heDJy-0005U3-Sl for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:46:51 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:38915) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1heDJy-0005T5-PP for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:46:50 -0400 Received: by mail-qt1-f196.google.com with SMTP id i34so5858181qta.6 for ; Thu, 20 Jun 2019 23:46:50 -0700 (PDT) Received: from redhat.com (pool-100-0-197-103.bstnma.fios.verizon.net. [100.0.197.103]) by smtp.gmail.com with ESMTPSA id z50sm1595758qtz.36.2019.06.20.23.46.48 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 20 Jun 2019 23:46:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=vBZ5OU12c4PDiqrs3EsUx7W7QPqh2FB4ggafxVecKE4=; b=f9FFB2pFUEHaGhbSPyvsyUp/23fr4xElUspRyD0P9EcULGlXgQHzGbtuX+LhYP19rq C3+QwfND9oW1Y4raTxRuN8pM3Ns77wZXmW2jeVoN+H0xTTuFQe7poIwHL4lQ9lMmL1rE TXnqntP6Xzxfzp6SpFqEpbJo+vMQv7eGm6OmleUe00bpyGm32E2ETp0NlHVNy6Qbekw7 sKv0AmBRms3RiaC3DqlhS5OonwnifkVca+D8R9vw2yO+GDUoaMA4VZe9WuvYsw2rmYO9 8FpRhgrxnrIhQobLs7bs2lwKDiUOpftK/YrM+kBBf68ZFG9d/my6orq/yhe+RTfC4b6G yF4Q== X-Gm-Message-State: APjAAAXIopgLlvFlMjEd4naEVNzqG4PRUdg/Gj5dpy8XVXKbXTVKfT4A iEVUtKxGFeOif4Cv7YmEmM4aLHoHrTQ= X-Google-Smtp-Source: APXvYqwm/UfF/0MXl4pAvq0KXwJ9aIUfRCi1imN5H+ectUjrNq4aCn477i89XCKmHAbOj+KjZXoU4Q== X-Received: by 2002:a0c:81f0:: with SMTP id 45mr44168802qve.13.1561099609897; Thu, 20 Jun 2019 23:46:49 -0700 (PDT) Date: Fri, 21 Jun 2019 02:46:48 -0400 From: "Michael S. Tsirkin" To: qemu-devel@nongnu.org Message-ID: <20190621064615.20099-3-mst@redhat.com> References: <20190621064615.20099-1-mst@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190621064615.20099-1-mst@redhat.com> X-Mailer: git-send-email 2.17.1.1206.gb667731e2e.dirty X-Mutt-Fcc: =sent X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.160.196 Subject: [Qemu-devel] [PATCH 2/3] pcie: check that slt ctrl changed before deleting X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" During boot, linux would sometimes overwrites control of a powered off slot before powering it on. Unfortunately QEMU interprets that as a power off request and ejects the device. For example: /x86_64-softmmu/qemu-system-x86_64 -enable-kvm -S -machine q35 \ -device pcie-root-port,id=3Dpcie_root_port_0,slot=3D2,chassis=3D2,addr= =3D0x2,bus=3Dpcie.0 \ -monitor stdio disk.qcow2 (qemu)device_add virtio-balloon-pci,id=3Dballoon,bus=3Dpcie_root_port_0 (qemu)cont Balloon is deleted during guest boot. To fix, save control beforehand and check that power or led state actually change before ejecting. Note: this is more a hack than a solution, ideally we'd find a better way to detect ejects, or move away from ejects completely and instead monitor whether it's safe to delete device due to e.g. its power state. Signed-off-by: Michael S. Tsirkin Reviewed-by: Igor Mammedov Reviewed-by: Marcel Apfelbaum Tested-by: Igor Mammedov --- include/hw/pci/pcie.h | 3 ++- hw/pci-bridge/pcie_root_port.c | 5 ++++- hw/pci-bridge/xio3130_downstream.c | 5 ++++- hw/pci/pcie.c | 14 ++++++++++++-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h index e30334d74d..8d90c0e193 100644 --- a/include/hw/pci/pcie.h +++ b/include/hw/pci/pcie.h @@ -107,7 +107,8 @@ void pcie_cap_lnkctl_reset(PCIDevice *dev); =20 void pcie_cap_slot_init(PCIDevice *dev, uint16_t slot); void pcie_cap_slot_reset(PCIDevice *dev); -void pcie_cap_slot_write_config(PCIDevice *dev, +void pcie_cap_slot_get(PCIDevice *dev, uint16_t *slot_ctl, uint16_t *slt_s= ta); +void pcie_cap_slot_write_config(PCIDevice *dev, uint16_t slot_ctl, uint16_= t slt_sta, uint32_t addr, uint32_t val, int len); int pcie_cap_slot_post_load(void *opaque, int version_id); void pcie_cap_slot_push_attention_button(PCIDevice *dev); diff --git a/hw/pci-bridge/pcie_root_port.c b/hw/pci-bridge/pcie_root_port.c index 92f253c924..09019ca05d 100644 --- a/hw/pci-bridge/pcie_root_port.c +++ b/hw/pci-bridge/pcie_root_port.c @@ -31,10 +31,13 @@ static void rp_write_config(PCIDevice *d, uint32_t addr= ess, { uint32_t root_cmd =3D pci_get_long(d->config + d->exp.aer_cap + PCI_ERR_ROOT_COMMAND); + uint16_t slt_ctl, slt_sta; + + pcie_cap_slot_get(d, &slt_ctl, &slt_sta); =20 pci_bridge_write_config(d, address, val, len); rp_aer_vector_update(d); - pcie_cap_slot_write_config(d, address, val, len); + pcie_cap_slot_write_config(d, slt_ctl, slt_sta, address, val, len); pcie_aer_write_config(d, address, val, len); pcie_aer_root_write_config(d, address, val, len, root_cmd); } diff --git a/hw/pci-bridge/xio3130_downstream.c b/hw/pci-bridge/xio3130_dow= nstream.c index 264e37d6a6..899b0fd6c9 100644 --- a/hw/pci-bridge/xio3130_downstream.c +++ b/hw/pci-bridge/xio3130_downstream.c @@ -41,9 +41,12 @@ static void xio3130_downstream_write_config(PCIDevice *d, uint32_t address, uint32_t val, int len) { + uint16_t slt_ctl, slt_sta; + + pcie_cap_slot_get(d, &slt_sta, &slt_ctl); pci_bridge_write_config(d, address, val, len); pcie_cap_flr_write_config(d, address, val, len); - pcie_cap_slot_write_config(d, address, val, len); + pcie_cap_slot_write_config(d, slt_ctl, slt_sta, address, val, len); pcie_aer_write_config(d, address, val, len); } =20 diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index b22527000d..f8490a00de 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -594,7 +594,15 @@ void pcie_cap_slot_reset(PCIDevice *dev) hotplug_event_update_event_status(dev); } =20 -void pcie_cap_slot_write_config(PCIDevice *dev, +void pcie_cap_slot_get(PCIDevice *dev, uint16_t *slt_ctl, uint16_t *slt_st= a) +{ + uint32_t pos =3D dev->exp.exp_cap; + uint8_t *exp_cap =3D dev->config + pos; + *slt_ctl =3D pci_get_word(exp_cap + PCI_EXP_SLTCTL); + *slt_sta =3D pci_get_word(exp_cap + PCI_EXP_SLTSTA); +} + +void pcie_cap_slot_write_config(PCIDevice *dev, uint16_t slt_ctl, uint16_t= slt_sta, uint32_t addr, uint32_t val, int len) { uint32_t pos =3D dev->exp.exp_cap; @@ -623,7 +631,9 @@ void pcie_cap_slot_write_config(PCIDevice *dev, * controller is off, it is safe to detach the devices. */ if ((sltsta & PCI_EXP_SLTSTA_PDS) && (val & PCI_EXP_SLTCTL_PCC) && - ((val & PCI_EXP_SLTCTL_PIC_OFF) =3D=3D PCI_EXP_SLTCTL_PIC_OFF)) { + (val & PCI_EXP_SLTCTL_PIC_OFF) =3D=3D PCI_EXP_SLTCTL_PIC_OFF && + (!(slt_ctl & PCI_EXP_SLTCTL_PCC) || + (slt_ctl & PCI_EXP_SLTCTL_PIC_OFF) !=3D PCI_EXP_SLTCTL_PIC_OFF)) { PCIBus *sec_bus =3D pci_bridge_get_sec_bus(PCI_BRIDGE(dev)); pci_for_each_device(sec_bus, pci_bus_num(sec_bus), pcie_unplug_device, NULL); --=20 MST From nobody Sun Feb 8 10:15:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561099843; cv=none; d=zoho.com; s=zohoarc; b=GBLNrvfUVj2PY+zhPoNMtea9pESeirR/CtCXfQ8xQ+tsgvno+LyPlcPLG+0hYqgpvYijt0Dod3zMb9ioTTvNQ/lSz8aye9pyNj7tMkxDeO0DyjLzpQSRWlWrBO0U+Ov35uoDupSRxcJMwcDSI9/se+0P4ZBKCt1Hf1uLON0Wjag= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561099843; h=Content-Type:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=4a367De+MaFB/R4qvFTLUbUDKGFJvFceJZYzgUfwehk=; b=XR8b5v4NumQhYOQTTLf6x0R2tpaqalhI7KWiOIQ4K+MI67JBLRom0zWTz4Fr+Z+BW4g80Sq4VEJgbq8lSdy0qJeG5ZvQ6j0vtKM/2a0qVwtOnhyjs7NLt992ITpQdWiAKYqA8VYPb7bvbqw+7RrpSwy8GesTIlSDppnz5v3dUBo= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561099843901857.5220084548861; Thu, 20 Jun 2019 23:50:43 -0700 (PDT) Received: from localhost ([::1]:55090 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1heDNf-0001lN-PX for importer@patchew.org; Fri, 21 Jun 2019 02:50:39 -0400 Received: from eggs.gnu.org ([209.51.188.92]:56583) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1heDKd-00084e-21 for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:47:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1heDK0-0005VY-J0 for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:46:53 -0400 Received: from mail-qk1-f194.google.com ([209.85.222.194]:40091) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1heDK0-0005V9-G6 for qemu-devel@nongnu.org; Fri, 21 Jun 2019 02:46:52 -0400 Received: by mail-qk1-f194.google.com with SMTP id c70so3683745qkg.7 for ; Thu, 20 Jun 2019 23:46:52 -0700 (PDT) Received: from redhat.com (pool-100-0-197-103.bstnma.fios.verizon.net. [100.0.197.103]) by smtp.gmail.com with ESMTPSA id y29sm976202qkj.8.2019.06.20.23.46.50 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 20 Jun 2019 23:46:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=4a367De+MaFB/R4qvFTLUbUDKGFJvFceJZYzgUfwehk=; b=gIYMf6sXum9YN8aiz4upZPjC6+4k5pmTdXKeXwpH9TloffI/CwdRA2WNG9RuqUF1rb ez6bqbaKQMweVhSu4osedh8HOifD+2XtQ3dyEzANgVNhEF0ufjA/b4L+uFmrVnuWo50b xh+EuzJiUc0Ry+bUWUDe20pcrMY0PNxhoyJy4ydEUVA4mDyxYMxispEvs49elfgCcqwh 3ZLGkO5bHbSdXf9khYwELbahki83y4IZ5Bq6zJpn9jnEab5ZVrTc6XrDdFPwM+LXJBWD 5j4SNoRxKriwWg4PniFmw0wJyI9loytzfCZHOh9bC+ar9pN5mF6HCSCnYv0yg6Oyznop 2C8g== X-Gm-Message-State: APjAAAVfIlgH2mW9KdUZvYtzLgB02BR3VgFHfmxhOQyNuyk0/E5JB0q+ 3Sw6uUvC5CSJwKjDjt8snkdqfIY1i88= X-Google-Smtp-Source: APXvYqxj0DWmRWR76tDVP0rl9tAhgp5e8jBxCU6G09jlc02rDDz1HiWHumhu8auDMkcOF6vQKDWJHw== X-Received: by 2002:a37:b843:: with SMTP id i64mr15728891qkf.77.1561099611579; Thu, 20 Jun 2019 23:46:51 -0700 (PDT) Date: Fri, 21 Jun 2019 02:46:50 -0400 From: "Michael S. Tsirkin" To: qemu-devel@nongnu.org Message-ID: <20190621064615.20099-4-mst@redhat.com> References: <20190621064615.20099-1-mst@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190621064615.20099-1-mst@redhat.com> X-Mailer: git-send-email 2.17.1.1206.gb667731e2e.dirty X-Mutt-Fcc: =sent X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.222.194 Subject: [Qemu-devel] [PATCH 3/3] pcie: work around for racy guest init X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" During boot, linux guests tend to clear all bits in pcie slot status register which is used for hotplug. If they clear bits that weren't set this is racy and will lose events: not a big problem for manual hotplug on bare-metal, but a problem for us. For example, the following is broken ATM: /x86_64-softmmu/qemu-system-x86_64 -enable-kvm -S -machine q35 \ -device pcie-root-port,id=3Dpcie_root_port_0,slot=3D2,chassis=3D2,addr= =3D0x2,bus=3Dpcie.0 \ -device virtio-balloon-pci,id=3Dballoon,bus=3Dpcie_root_port_0 \ -monitor stdio disk.qcow2 (qemu)device_del balloon (qemu)cont Balloon isn't deleted as it should. As a work-around, detect this attempt to clear slot status and revert status to what it was before the write. Note: in theory this can be detected as a duplicate button press which cancels the previous press. Does not seem to happen in practice as guests seem to only have this bug during init. Note2: the right thing to do is probably to fix Linux to read status before clearing it, and act on the bits that are set. Signed-off-by: Michael S. Tsirkin Reviewed-by: Igor Mammedov Reviewed-by: Marcel Apfelbaum Tested-by: Igor Mammedov --- hw/pci/pcie.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index f8490a00de..c605d32dd4 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -610,6 +610,25 @@ void pcie_cap_slot_write_config(PCIDevice *dev, uint16= _t slt_ctl, uint16_t slt_s uint16_t sltsta =3D pci_get_word(exp_cap + PCI_EXP_SLTSTA); =20 if (ranges_overlap(addr, len, pos + PCI_EXP_SLTSTA, 2)) { + /* + * Guests tend to clears all bits during init. + * If they clear bits that weren't set this is racy and will lose = events: + * not a big problem for manual button presses, but a problem for = us. + * As a work-around, detect this and revert status to what it was + * before the write. + * + * Note: in theory this can be detected as a duplicate button press + * which cancels the previous press. Does not seem to happen in + * practice as guests seem to only have this bug during init. + */ +#define PCIE_SLOT_EVENTS (PCI_EXP_SLTSTA_ABP | PCI_EXP_SLTSTA_PFD | \ + PCI_EXP_SLTSTA_MRLSC | PCI_EXP_SLTSTA_PDC | \ + PCI_EXP_SLTSTA_CC) + + if (val & ~slt_sta & PCIE_SLOT_EVENTS) { + sltsta =3D (sltsta & ~PCIE_SLOT_EVENTS) | (slt_sta & PCIE_SLOT= _EVENTS); + pci_set_word(exp_cap + PCI_EXP_SLTSTA, sltsta); + } hotplug_event_clear(dev); } =20 --=20 MST From nobody Sun Feb 8 10:15:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1561973958; cv=none; d=zoho.com; s=zohoarc; b=X5leYkXVkovRI+a3YVnuZUuDTJ8nOv8eMsWDgfXDbHpK3caYcJg5PPpytg1BY6hFB34BvUIsB1Se25sMNLGCuAT/hACzUsavZUFCHZyYtGdl4YZvXQkahvGw/kuLQ10kahqzIK8UZB6T8nn9hLWBy9aIrYYFSLzaBooLKnH2sFg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561973958; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To:ARC-Authentication-Results; bh=19SIfXORG8YqIOH0n+CjUrcRgKw9ikRCvTr7pih/Br8=; b=S5M+HrTjrpVu4kysmXTZWdFsgelSzswa0/yWXQyEhY7lzjQ39B8U8WsiIV4bf+mN/n9/P10nK1cJnSLyLjn6TCYgLzaeuHj2WJiFHaZs4Jwo/SZM3yfnArsA4nTIdPc4hvzFGDERbjTRFscVGv6UCYkbbZyF1w8VuBJYQegj9OA= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1561973958581406.2319638636051; Mon, 1 Jul 2019 02:39:18 -0700 (PDT) Received: from localhost ([::1]:56494 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hhsmL-0008Qx-Kq for importer@patchew.org; Mon, 01 Jul 2019 05:39:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50352) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hhsiI-0003ah-B9 for qemu-devel@nongnu.org; Mon, 01 Jul 2019 05:35:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hhsiD-0003T8-Am for qemu-devel@nongnu.org; Mon, 01 Jul 2019 05:35:04 -0400 Received: from mail-qt1-f193.google.com ([209.85.160.193]:37003) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hhsiD-0003SD-5Q for qemu-devel@nongnu.org; Mon, 01 Jul 2019 05:35:01 -0400 Received: by mail-qt1-f193.google.com with SMTP id y57so13899313qtk.4 for ; Mon, 01 Jul 2019 02:35:00 -0700 (PDT) Received: from redhat.com ([37.26.146.159]) by smtp.gmail.com with ESMTPSA id j22sm4512839qtp.0.2019.07.01.02.34.57 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Mon, 01 Jul 2019 02:34:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:in-reply-to; bh=19SIfXORG8YqIOH0n+CjUrcRgKw9ikRCvTr7pih/Br8=; b=sFu+eY1d75cMl0CR8jdaZrQ1ngkKkpl1jxMbxvc6V//hik8jZMfCOcw8nG2z+MHCP6 YmM4dmzXdlx5gfCVYuWuxQpXgzHD9VkqobrBmEQtfbgB+glGRltASGmN9dAHch5fswv7 mxc8ZHmkJ29tZy9Kvhkt+cNytoJdgc3R47DKyaMcr1D9QKrq9IWFGB+vBJ3SRCpP4egk Yfy/aLbHYHEmRO4nJkFm0t/mBpgUCTx5RZWd2On9ixYcK7L5el+ZtmrrE4zEcMTfvQX6 dYVMdnZt9zCDijR27IG/VAqdCyXO7/Hyv362C2CA+gUiLSI1wRK4C75P9Vg/eX9oL6Lt RX/w== X-Gm-Message-State: APjAAAXB2uWmuVv6N7e2hLlBUGOp+IOUTHdqZ08e7suBM54Jw3tQ9qEp Hg7M6iATafwg/2nB0oBqfTPuy14vDkMkWw== X-Google-Smtp-Source: APXvYqzO5Gh9d6TZ5b5CxDDD/WOERZmv7mJr0B77y1BfvKTusRRWppLmJJIFYymdwBqVQpEEHIq/Fw== X-Received: by 2002:aed:3a24:: with SMTP id n33mr19094772qte.361.1561973700050; Mon, 01 Jul 2019 02:35:00 -0700 (PDT) Date: Mon, 1 Jul 2019 05:34:54 -0400 From: "Michael S. Tsirkin" To: qemu-devel@nongnu.org Message-ID: <20190701093232.28575-1-mst@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190621064615.20099-1-mst@redhat.com> X-Mailer: git-send-email 2.17.1.1206.gb667731e2e.dirty X-Mutt-Fcc: =sent X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.160.193 Subject: [Qemu-devel] [PATCH 4/3] pcie: minor cleanups for slot control/status X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Igor Mammedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename function arguments to make intent clearer. Better documentation for slot control logic. Suggested-by: Igor Mammedov Signed-off-by: Michael S. Tsirkin Reviewed-by: Christophe de Dinechin Reviewed-by: Igor Mammedov Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- include/hw/pci/pcie.h | 3 ++- hw/pci/pcie.c | 17 +++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h index 8d90c0e193..34f277735c 100644 --- a/include/hw/pci/pcie.h +++ b/include/hw/pci/pcie.h @@ -108,7 +108,8 @@ void pcie_cap_lnkctl_reset(PCIDevice *dev); void pcie_cap_slot_init(PCIDevice *dev, uint16_t slot); void pcie_cap_slot_reset(PCIDevice *dev); void pcie_cap_slot_get(PCIDevice *dev, uint16_t *slot_ctl, uint16_t *slt_s= ta); -void pcie_cap_slot_write_config(PCIDevice *dev, uint16_t slot_ctl, uint16_= t slt_sta, +void pcie_cap_slot_write_config(PCIDevice *dev, + uint16_t old_slot_ctl, uint16_t old_slt_st= a, uint32_t addr, uint32_t val, int len); int pcie_cap_slot_post_load(void *opaque, int version_id); void pcie_cap_slot_push_attention_button(PCIDevice *dev); diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index c605d32dd4..a6beb567bd 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -602,7 +602,8 @@ void pcie_cap_slot_get(PCIDevice *dev, uint16_t *slt_ct= l, uint16_t *slt_sta) *slt_sta =3D pci_get_word(exp_cap + PCI_EXP_SLTSTA); } =20 -void pcie_cap_slot_write_config(PCIDevice *dev, uint16_t slt_ctl, uint16_t= slt_sta, +void pcie_cap_slot_write_config(PCIDevice *dev, + uint16_t old_slt_ctl, uint16_t old_slt_sta, uint32_t addr, uint32_t val, int len) { uint32_t pos =3D dev->exp.exp_cap; @@ -625,8 +626,8 @@ void pcie_cap_slot_write_config(PCIDevice *dev, uint16_= t slt_ctl, uint16_t slt_s PCI_EXP_SLTSTA_MRLSC | PCI_EXP_SLTSTA_PDC | \ PCI_EXP_SLTSTA_CC) =20 - if (val & ~slt_sta & PCIE_SLOT_EVENTS) { - sltsta =3D (sltsta & ~PCIE_SLOT_EVENTS) | (slt_sta & PCIE_SLOT= _EVENTS); + if (val & ~old_slt_sta & PCIE_SLOT_EVENTS) { + sltsta =3D (sltsta & ~PCIE_SLOT_EVENTS) | (old_slt_sta & PCIE_= SLOT_EVENTS); pci_set_word(exp_cap + PCI_EXP_SLTSTA, sltsta); } hotplug_event_clear(dev); @@ -646,13 +647,17 @@ void pcie_cap_slot_write_config(PCIDevice *dev, uint1= 6_t slt_ctl, uint16_t slt_s } =20 /* - * If the slot is polulated, power indicator is off and power + * If the slot is populated, power indicator is off and power * controller is off, it is safe to detach the devices. + * + * Note: don't detach if condition was already true: + * this is a work around for guests that overwrite + * control of powered off slots before powering them on. */ if ((sltsta & PCI_EXP_SLTSTA_PDS) && (val & PCI_EXP_SLTCTL_PCC) && (val & PCI_EXP_SLTCTL_PIC_OFF) =3D=3D PCI_EXP_SLTCTL_PIC_OFF && - (!(slt_ctl & PCI_EXP_SLTCTL_PCC) || - (slt_ctl & PCI_EXP_SLTCTL_PIC_OFF) !=3D PCI_EXP_SLTCTL_PIC_OFF)) { + (!(old_slt_ctl & PCI_EXP_SLTCTL_PCC) || + (old_slt_ctl & PCI_EXP_SLTCTL_PIC_OFF) !=3D PCI_EXP_SLTCTL_PIC_OFF= )) { PCIBus *sec_bus =3D pci_bridge_get_sec_bus(PCI_BRIDGE(dev)); pci_for_each_device(sec_bus, pci_bus_num(sec_bus), pcie_unplug_device, NULL); --=20 MST