From patchwork Wed Sep 16 08:19:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ani Sinha X-Patchwork-Id: 11779277 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AD8A092C for ; Wed, 16 Sep 2020 08:21:16 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 47A3E2083B for ; Wed, 16 Sep 2020 08:21:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=anisinha-ca.20150623.gappssmtp.com header.i=@anisinha-ca.20150623.gappssmtp.com header.b="oZQJfWIU" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 47A3E2083B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=anisinha.ca Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:60038 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kISgl-0001j9-Fw for patchwork-qemu-devel@patchwork.kernel.org; Wed, 16 Sep 2020 04:21:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57910) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kISfK-0008JW-QF for qemu-devel@nongnu.org; Wed, 16 Sep 2020 04:19:46 -0400 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]:44215) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kISfH-0004ou-0T for qemu-devel@nongnu.org; Wed, 16 Sep 2020 04:19:46 -0400 Received: by mail-pf1-x444.google.com with SMTP id o20so3500303pfp.11 for ; Wed, 16 Sep 2020 01:19:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=anisinha-ca.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fmI2+Fvn8BTYCvAJkrSXHt99NR4058vq4+ksv+2gprE=; b=oZQJfWIUhtaJ07g0fx5hch24spWL6+ckn9q203qUQU8d9b2DJioVWmEiyyTFRcVqcB RWtIDtgDqAVfvhtfdS7a7yzq9iTUAgGioz4NXOXv+PSEShEV6HGjYmxEKcI85dLtlE9L vb4utsZeAJrBqY1p6F3t5ptKjUEXyNW4Zd3BDOopDGrzb++ADjIUfijkJ3SwLx49cYZN T8jkwFlsZQgv1Ql//tCW0HkKRmKddCe0ePE2uS+p3yu3+NohfirLpZfWl6Rhxz7iH8WO v033PNfJ446pay18hXQvxdaNLvZXxD5CJshNclP6qZCyIc6OdypVy81k/NhSn0F6LcpL Nv5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fmI2+Fvn8BTYCvAJkrSXHt99NR4058vq4+ksv+2gprE=; b=oLeZWe36u2YE+iLDzJNMudh/oAJbXgjlKY7Uxrl424ihRqnHEp1jRW3wFGhP49GQzu O16JAWgx1gc97Lbvb2QbdRza53GWm90qcdxGi9FL/WNIcWE4x/qF92Xha4esf1cpzNPM ftNkBvHFKgKfl63V81yT41hXxbMNxJT2KKuAto47PPLoi0BWqPZM4MXQDnUDz9RNGEM9 oz5QNiVWinQTVi0mh93UqrGGiuXsNg1qS0lpfsF20d/9om2JfdDPAvfyFXBRZw3WI62J qLo96WRkOwKW/zNXmD39geyxrQEQLJmOVhc779ZXnvNzaSkZrJcomHUyey+r827hWl3Z 7QSQ== X-Gm-Message-State: AOAM531PHn0/q6RqKk/QeKJRiOVrD0KAtCbqwFLeIHHXh7e82XqrY+wT F8b1GAHlms6w4z7VdannuG1p7eJjZPtv9OWl X-Google-Smtp-Source: ABdhPJxsNtgGTmpfSYjqbCnDRnRw/Jav36x9LdMqWtRPe6mvot2f8gTZePR8aF+VrO4Owh/k02t+4w== X-Received: by 2002:aa7:9556:0:b029:13e:d13d:a0fe with SMTP id w22-20020aa795560000b029013ed13da0femr21834106pfq.26.1600244381437; Wed, 16 Sep 2020 01:19:41 -0700 (PDT) Received: from localhost.localdomain ([203.163.234.244]) by smtp.googlemail.com with ESMTPSA id nl10sm1658254pjb.11.2020.09.16.01.19.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2020 01:19:40 -0700 (PDT) From: Ani Sinha To: qemu-devel@nongnu.org Subject: [PATCH v5 04/11] Fix a gap where acpi_pcihp_find_hotplug_bus() returns a non-hotpluggable bus Date: Wed, 16 Sep 2020 13:49:03 +0530 Message-Id: <20200916081910.977-5-ani@anisinha.ca> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200916081910.977-1-ani@anisinha.ca> References: <20200916081910.977-1-ani@anisinha.ca> Received-SPF: none client-ip=2607:f8b0:4864:20::444; envelope-from=ani@anisinha.ca; helo=mail-pf1-x444.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: Eduardo Habkost , "Michael S. Tsirkin" , jusual@redhat.com, =?utf-8?q?Philipp?= =?utf-8?q?e_Mathieu-Daud=C3=A9?= , Aleksandar Markovic , Paolo Bonzini , Ani Sinha , Igor Mammedov , Aurelien Jarno , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" When ACPI hotplug for the root bus is disabled, the bsel property for that bus is not set. Please see the following commit: 3d7e78aa7777f ("Introduce a new flag for i440fx to disable PCI hotplug on the root bus"). As a result, when acpi_pcihp_find_hotplug_bus() is called with bsel set to 0, it may return the root bus. This can cause devices attached to the root bus to get hot-unplugged if the user issues the following set of commmands: outl 0xae10 0 outl 0xae08 your_slot Thanks to Julia for pointing this out here: https://www.mail-archive.com/qemu-devel@nongnu.org/msg734548.html In this patch, we fix the issue in this function by checking if the bus which is returned by the function is actually hotpluggable. If not, we simply return NULL. This avoids the scenario where we were returning a non-hotpluggable bus. Signed-off-by: Ani Sinha Reviewed-by: Igor Mammedov --- hw/acpi/pcihp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c index 39b1f74442..32ae8b2c0a 100644 --- a/hw/acpi/pcihp.c +++ b/hw/acpi/pcihp.c @@ -147,6 +147,21 @@ static PCIBus *acpi_pcihp_find_hotplug_bus(AcpiPciHpState *s, int bsel) if (!bsel && !find.bus) { find.bus = s->root; } + + /* + * Check if find.bus is actually hotpluggable. If bsel is set to + * NULL for example on the root bus in order to make it + * non-hotpluggable, find.bus will match the root bus when bsel + * is 0. See acpi_pcihp_test_hotplug_bus() above. Since the + * bus is not hotpluggable however, we should not select the bus. + * Instead, we should set find.bus to NULL in that case. In the check + * below, we generalize this case for all buses, not just the root bus. + * The callers of this function check for a null return value and + * handle them appropriately. + */ + if (find.bus && !qbus_is_hotpluggable(BUS(find.bus))) { + find.bus = NULL; + } return find.bus; }