From nobody Sun May 5 13:12:33 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1594032785; cv=none; d=zohomail.com; s=zohoarc; b=NVJxrEgtkFwKfvYo/Uu8mF1ZN0eG4sdC07jsNYeEKDHqGT+Oqw32i6iI2bFMKihdxE4n4MY5zlF+n/3Zr6JTazvMtyFheuy014JifthpYrEIyvn2hfUii2g5Milu2cfYtFRUOj81Y6MjViPseZMzjpKRbqPI/jWSgedrhjEEIDs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594032785; h=Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=mfg3UXx+kQ8L82ftMFnvaicyP4lVZZK0W3m5aNci2oc=; b=UxaCjtBpVabnpyhLPNzvWs7H7JC6AyqoN7Ml4qAiPCjm+oNQQn2wj0P5jxoe01khW20c2H28gpTIhrdV5ILikUUYcT7BZXdrBfJHzZlMAApvKHwm5TrRc0w7mwCVw7xtuoZfA9+lOHhLULm3I4VpxrdQ09AQY0ijzNyNEXR2umw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1594032785453203.22968014666628; Mon, 6 Jul 2020 03:53:05 -0700 (PDT) Received: from localhost ([::1]:35366 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jsOkB-0003k0-2X for importer@patchew.org; Mon, 06 Jul 2020 06:53:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35560) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jsOjZ-0003KW-Ax for qemu-devel@nongnu.org; Mon, 06 Jul 2020 06:52:25 -0400 Received: from mail-lj1-x244.google.com ([2a00:1450:4864:20::244]:43147) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jsOjX-0003PU-80 for qemu-devel@nongnu.org; Mon, 06 Jul 2020 06:52:25 -0400 Received: by mail-lj1-x244.google.com with SMTP id f5so28852345ljj.10 for ; Mon, 06 Jul 2020 03:52:22 -0700 (PDT) Received: from navi.cosmonova.net.ua ([95.67.24.131]) by smtp.gmail.com with ESMTPSA id h22sm7791940ljg.1.2020.07.06.03.52.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jul 2020 03:52:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=mfg3UXx+kQ8L82ftMFnvaicyP4lVZZK0W3m5aNci2oc=; b=HSNr36AQOJ9HhnMUrN67miV23jPkiQDIs34Hhcwe1CEadx/pnvFvzJYnbFo6PBjjnP lMedTMh6Q+S/NCno3laB6fCjqk9TE7/DmUj4S7sNjkBnrd5lnSX2lXaR3OE6RqFcYfO2 /DY05UCu4zmbVBT5J6OvnYKBxUuvUdYVE5EjD6PPEpyLE353uQllOQySJ5TznBASFLwW MOElRm9uod+wb5mavZyOsfLJux5WdrEbTjrMJ488X/57mzCaNsHOWRdYH4Js+rLt9shr 0rrlieh4APYu4ha/UAQCSHSNlAGb+rdAolNCeEA4M5oZAMmv7oiymzBJPcIk2UpzXiYn OZKA== 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:mime-version :content-transfer-encoding; bh=mfg3UXx+kQ8L82ftMFnvaicyP4lVZZK0W3m5aNci2oc=; b=PlFa49VFSHUxlQEfwpWdTSkyZ3WUiIeWM4JwUfGD3r4p28PuC0ZLkQPOBOIbmL9xC8 veYNDMzr/mKmj8TECbEmrzuAujDPCbHOOIL9pSKCQQkVcGPKqv3NepyinMPtM6TJhoGl NBbmgfB3ubsSVm+7rD+FVS/aXgRYm1EdKiumyzUbsfuZlHHPQoCyssYMr+XYl0E/mp7/ MryHwMcilD8JHLddhu5ktrM3xGNhX4MtzdZ4aQr/U7eRTft7SsDaNnbqlir+GtlVkS/J NqYwW+ysy993yxTDZGObb9bt3UEmRDPiyiOl6YCEp9lham7l/MqNKPnFUJfQxRS9vCEI T+Cg== X-Gm-Message-State: AOAM530r3lDpTM+PXJTK/YfuPoI1ZY+Up4O6E1h7hbnuXqIcEzpawhTy 4kV37AVTBXVxHLMlCZEUBtqjiU6xKXOJkg== X-Google-Smtp-Source: ABdhPJzCTXmBowDXATh3NsXUVzpmIHDTEg1kvh6OgNEz/p64z0ZLu8V0vOJcypgU7hTQjO83h73J4A== X-Received: by 2002:a2e:80da:: with SMTP id r26mr13930572ljg.179.1594032740559; Mon, 06 Jul 2020 03:52:20 -0700 (PDT) From: andrew@daynix.com To: qemu-devel@nongnu.org Subject: [PATCH] virtio-pci: Changed vdev to proxy for VirtIO PCI BAR callbacks. Date: Mon, 6 Jul 2020 14:21:23 +0300 Message-Id: <20200706112123.971087-1-andrew@daynix.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: none client-ip=2a00:1450:4864:20::244; envelope-from=andrew@daynix.com; helo=mail-lj1-x244.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=_AUTOLEARN 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: mst@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @daynix-com.20150623.gappssmtp.com) Content-Type: text/plain; charset="utf-8" From: Andrew Melnychenko There is an issue when callback may be called with invalid vdev. It happens on unplug when vdev already deleted and VirtIOPciProxy is not. So now, callbacks accept proxy device, and vdev retrieved from it. Technically memio callbacks should be removed during the flatview update, but memoryregions remain til PCI device(and it's address space) completely = deleted. Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=3D1716352 Signed-off-by: Andrew Melnychenko --- hw/virtio/virtio-pci.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 7bc8c1c056..904010f1cc 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1321,11 +1321,12 @@ static uint64_t virtio_pci_notify_read(void *opaque= , hwaddr addr, static void virtio_pci_notify_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { - VirtIODevice *vdev =3D opaque; - VirtIOPCIProxy *proxy =3D VIRTIO_PCI(DEVICE(vdev)->parent_bus->parent); + VirtIOPCIProxy *proxy =3D opaque; + VirtIODevice *vdev =3D virtio_bus_get_device(&proxy->bus); + unsigned queue =3D addr / virtio_pci_queue_mem_mult(proxy); =20 - if (queue < VIRTIO_QUEUE_MAX) { + if (vdev !=3D NULL && queue < VIRTIO_QUEUE_MAX) { virtio_queue_notify(vdev, queue); } } @@ -1333,10 +1334,12 @@ static void virtio_pci_notify_write(void *opaque, h= waddr addr, static void virtio_pci_notify_write_pio(void *opaque, hwaddr addr, uint64_t val, unsigned size) { - VirtIODevice *vdev =3D opaque; + VirtIOPCIProxy *proxy =3D opaque; + VirtIODevice *vdev =3D virtio_bus_get_device(&proxy->bus); + unsigned queue =3D val; =20 - if (queue < VIRTIO_QUEUE_MAX) { + if (vdev !=3D NULL && queue < VIRTIO_QUEUE_MAX) { virtio_queue_notify(vdev, queue); } } @@ -1360,9 +1363,14 @@ static void virtio_pci_isr_write(void *opaque, hwadd= r addr, static uint64_t virtio_pci_device_read(void *opaque, hwaddr addr, unsigned size) { - VirtIODevice *vdev =3D opaque; + VirtIOPCIProxy *proxy =3D opaque; + VirtIODevice *vdev =3D virtio_bus_get_device(&proxy->bus); uint64_t val =3D 0; =20 + if (vdev =3D=3D NULL) { + return val; + } + switch (size) { case 1: val =3D virtio_config_modern_readb(vdev, addr); @@ -1380,7 +1388,13 @@ static uint64_t virtio_pci_device_read(void *opaque,= hwaddr addr, static void virtio_pci_device_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { - VirtIODevice *vdev =3D opaque; + VirtIOPCIProxy *proxy =3D opaque; + VirtIODevice *vdev =3D virtio_bus_get_device(&proxy->bus); + + if (vdev =3D=3D NULL) { + return; + } + switch (size) { case 1: virtio_config_modern_writeb(vdev, addr, val); @@ -1457,19 +1471,19 @@ static void virtio_pci_modern_regions_init(VirtIOPC= IProxy *proxy) =20 memory_region_init_io(&proxy->device.mr, OBJECT(proxy), &device_ops, - virtio_bus_get_device(&proxy->bus), + proxy, "virtio-pci-device", proxy->device.size); =20 memory_region_init_io(&proxy->notify.mr, OBJECT(proxy), ¬ify_ops, - virtio_bus_get_device(&proxy->bus), + proxy, "virtio-pci-notify", proxy->notify.size); =20 memory_region_init_io(&proxy->notify_pio.mr, OBJECT(proxy), ¬ify_pio_ops, - virtio_bus_get_device(&proxy->bus), + proxy, "virtio-pci-notify-pio", proxy->notify_pio.size); } --=20 2.27.0