From patchwork Wed Jun 21 08:02:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenzhong Duan X-Patchwork-Id: 1797692 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=P8afrtrt; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4QmGXr0xbxz20Zv for ; Wed, 21 Jun 2023 18:15:55 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qBszc-0004fx-DR; Wed, 21 Jun 2023 04:15:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qBszX-0004ew-Jj for qemu-devel@nongnu.org; Wed, 21 Jun 2023 04:15:04 -0400 Received: from mga18.intel.com ([134.134.136.126]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qBszV-0002s8-91 for qemu-devel@nongnu.org; Wed, 21 Jun 2023 04:15:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1687335301; x=1718871301; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mNuXNxjtVp9RLH7yf+INXJlD+blwYMF2DVMvyiVISEQ=; b=P8afrtrteYSg7ei/MgN7oj+7Am7hQ4P8sWNf41aCirfuj0r6+d5wiJba /PCqMadoz9FJPlu1c0hbWXWCiyrruB+GIDIc9xSjBjs5Dt6C+DmAmqWMY cUE1vNWmw1haRR+tQoBFPwdt8fQH8VE15vsCMxS4UCeeY10GWzO1RSWQS 7JlQX3X9qGgjWS5rgQQWrjQjpWuqlDPlZtpHv/+4KoPmn8t6oyEqyAe5p EWBb0DAEcGsxAdqQff7/E2jiM8YarkACMEWIiTXfkYhneqrleK6mZe8+T 5A9LSv4nogWG0WM/uaAPW5xZU+kPuNCp2tZlludw9aDG4/PYZvojbxAl6 A==; X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="344843456" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="344843456" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2023 01:14:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="804282290" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="804282290" Received: from duan-server-s2600bt.bj.intel.com ([10.240.192.147]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2023 01:14:57 -0700 From: Zhenzhong Duan To: qemu-devel@nongnu.org Cc: alex.williamson@redhat.com, clg@redhat.com, joao.m.martins@oracle.com, avihaih@nvidia.com, chao.p.peng@intel.com Subject: [PATCH v3 1/3] vfio/pci: Fix resource leak in vfio_realize Date: Wed, 21 Jun 2023 16:02:02 +0800 Message-Id: <20230621080204.420723-2-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230621080204.420723-1-zhenzhong.duan@intel.com> References: <20230621080204.420723-1-zhenzhong.duan@intel.com> MIME-Version: 1.0 Received-SPF: pass client-ip=134.134.136.126; envelope-from=zhenzhong.duan@intel.com; helo=mga18.intel.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 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 When adding migration blocker failed in vfio_migration_realize(), hotplug will fail and we see below: (qemu) device_add vfio-pci,host=81:11.1,id=vfio1,bus=root1,x-enable-migration=true 0000:81:11.1: VFIO migration is not supported in kernel Error: disallowing migration blocker (--only-migratable) for: VFIO device doesn't support migration If we hotplug again we should see same log as above, but we see: (qemu) device_add vfio-pci,host=81:11.0,id=vfio0,bus=root0,x-enable-migration=true Error: vfio 0000:81:11.0: device is already attached That's because some references to VFIO device isn't released, we should check return value of vfio_migration_realize() and release the references, then VFIO device will be truely released when hotplug failed. Signed-off-by: Zhenzhong Duan --- hw/vfio/pci.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 73874a94de12..c71b0955d81c 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3210,6 +3210,7 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) ret = vfio_migration_realize(vbasedev, errp); if (ret) { error_report("%s: Migration disabled", vbasedev->name); + goto out_deregister; } } From patchwork Wed Jun 21 08:02:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenzhong Duan X-Patchwork-Id: 1797690 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=g5LzpH57; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4QmGXr0MDXz20WT for ; Wed, 21 Jun 2023 18:15:55 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qBszh-0004iG-GH; Wed, 21 Jun 2023 04:15:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qBszY-0004f3-Te for qemu-devel@nongnu.org; Wed, 21 Jun 2023 04:15:05 -0400 Received: from mga18.intel.com ([134.134.136.126]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qBszX-0002sc-7Z for qemu-devel@nongnu.org; Wed, 21 Jun 2023 04:15:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1687335303; x=1718871303; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0hPMkNVrRILLd9lF9N0wtK7GJK0SD1zU2iVss5LP7Jg=; b=g5LzpH575ng4y6rXO4MUn7Vg8IMjN9QtHaKZdGFXd5t44Ycq5S/t6IRS csG4QAy1AB7LapvWxqiBsuD3MaJGGyX3P0nqK6LPg0T62GAvCe3P3xPG3 kMMejBHNpVETHPZgOG2eY/1EW8DPSk3Yo2DCdsFPB9RIH7QRembN9EESh qtnDfLdcuEbE/pBfzlu8xvFjdPTrGFojn2vE5Ev++C5y9L4d7ilnvMaXQ JuLUt7P2eAGK3HIktxtu5qCpRyh5PZOgXL00TNYhwbZPDxLYoCO6JP+8s 0zvd2mwyBrGaIvIWx9Wi6D4CvGx+nVhSW/Tx9GoEy+2to0DXICi5l2Mkz A==; X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="344843465" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="344843465" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2023 01:15:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="804282299" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="804282299" Received: from duan-server-s2600bt.bj.intel.com ([10.240.192.147]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2023 01:14:59 -0700 From: Zhenzhong Duan To: qemu-devel@nongnu.org Cc: alex.williamson@redhat.com, clg@redhat.com, joao.m.martins@oracle.com, avihaih@nvidia.com, chao.p.peng@intel.com Subject: [PATCH v3 2/3] vfio/pci: Fix a segfault in vfio_realize Date: Wed, 21 Jun 2023 16:02:03 +0800 Message-Id: <20230621080204.420723-3-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230621080204.420723-1-zhenzhong.duan@intel.com> References: <20230621080204.420723-1-zhenzhong.duan@intel.com> MIME-Version: 1.0 Received-SPF: pass client-ip=134.134.136.126; envelope-from=zhenzhong.duan@intel.com; helo=mga18.intel.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 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 In case irqchip_change_notifier isn't added, removing it triggers segfault. Signed-off-by: Zhenzhong Duan --- hw/vfio/pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index c71b0955d81c..82c4cf4f7609 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3222,7 +3222,9 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) out_deregister: pci_device_set_intx_routing_notifier(&vdev->pdev, NULL); - kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier); + if (vdev->irqchip_change_notifier.notify) { + kvm_irqchip_remove_change_notifier(&vdev->irqchip_change_notifier); + } out_teardown: vfio_teardown_msi(vdev); vfio_bars_exit(vdev); From patchwork Wed Jun 21 08:02:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenzhong Duan X-Patchwork-Id: 1797693 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=lqDmp7hA; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4QmGY01r1zz20WT for ; Wed, 21 Jun 2023 18:16:04 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qBszh-0004iH-C6; Wed, 21 Jun 2023 04:15:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qBszb-0004fY-5D for qemu-devel@nongnu.org; Wed, 21 Jun 2023 04:15:07 -0400 Received: from mga18.intel.com ([134.134.136.126]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qBszZ-00033Z-3U for qemu-devel@nongnu.org; Wed, 21 Jun 2023 04:15:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1687335305; x=1718871305; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pRQzNHwxbB9VYmvs+w5/VgwfC0yvxiQn5uImTyU+Ycs=; b=lqDmp7hA3oR429tHst9CZtN67NOqVAUM3z14Jgn88w6Fzc4HICl2LsrW BDx64Z9dNrw2cJxc3DIdURM0bg1aplecLKKViHEB0wvez4D/Qsk/EKV5k Dt9zmoWtzbArGHkIlKkKWa5jUrnFn2hmNRweMpwYWAPByDbifPCVNvUi7 8kmZs5wYmMZSLB5YzW/PsNNlUBTLJXK0U6vPQnf2WzXHBU4FYFNk7Mbu+ SF51cU8vRZoGU+vZZt8AgcYt4qe+D8EgLQcL4UtPqXYn21oVZ1Wd4lyoH X5CBLswbE7NNf2msxxt4jbJRVK6y3xMOKPFfCvOFg8ongoUH0HpoMVIc7 g==; X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="344843476" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="344843476" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2023 01:15:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="804282325" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="804282325" Received: from duan-server-s2600bt.bj.intel.com ([10.240.192.147]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2023 01:15:01 -0700 From: Zhenzhong Duan To: qemu-devel@nongnu.org Cc: alex.williamson@redhat.com, clg@redhat.com, joao.m.martins@oracle.com, avihaih@nvidia.com, chao.p.peng@intel.com Subject: [PATCH v3 3/3] vfio/migration: vfio/migration: Refactor and fix print of "Migration disabled" Date: Wed, 21 Jun 2023 16:02:04 +0800 Message-Id: <20230621080204.420723-4-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230621080204.420723-1-zhenzhong.duan@intel.com> References: <20230621080204.420723-1-zhenzhong.duan@intel.com> MIME-Version: 1.0 Received-SPF: pass client-ip=134.134.136.126; envelope-from=zhenzhong.duan@intel.com; helo=mga18.intel.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 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 patch refactors vfio_migration_realize() and its dependend code as follows: 1. It's redundant in vfio_migration_realize() to registers multiple blockers, e.g: vIOMMU blocker can be refactored as per device blocker. 2. Change vfio_block_giommu_migration() to be only a per device checker. 3. Remove global vIOMMU blocker related stuff, e.g: giommu_migration_blocker, vfio_unblock_giommu_migration(), vfio_viommu_preset() and vfio_migration_finalize() 4. Change vfio_migration_realize() and dependent vfio_block_*_migration() to return bool type. 5. Change to print "Migration disabled" only after adding blocker succeed. 6. Add device name to errp so "info migrate" could be more informative. migrate_add_blocker() returns 0 when successfully adding the migration blocker. However, the caller of vfio_migration_realize() considers that migration was blocked when the latter returned an error. What matters for migration is that the blocker is added in core migration, so this cleans up usability such that user sees "Migrate disabled" when any of the vfio migration blockers are active. Signed-off-by: Zhenzhong Duan --- hw/vfio/common.c | 54 +++++------------------------------ hw/vfio/migration.c | 37 +++++++++++------------- hw/vfio/pci.c | 4 +-- include/hw/vfio/vfio-common.h | 7 ++--- 4 files changed, 29 insertions(+), 73 deletions(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index fa8fd949b1cf..cc5f4e805341 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -362,8 +362,6 @@ bool vfio_mig_active(void) } static Error *multiple_devices_migration_blocker; -static Error *giommu_migration_blocker; - static unsigned int vfio_migratable_device_num(void) { VFIOGroup *group; @@ -381,13 +379,13 @@ static unsigned int vfio_migratable_device_num(void) return device_num; } -int vfio_block_multiple_devices_migration(Error **errp) +bool vfio_block_multiple_devices_migration(Error **errp) { int ret; if (multiple_devices_migration_blocker || vfio_migratable_device_num() <= 1) { - return 0; + return true; } error_setg(&multiple_devices_migration_blocker, @@ -397,9 +395,11 @@ int vfio_block_multiple_devices_migration(Error **errp) if (ret < 0) { error_free(multiple_devices_migration_blocker); multiple_devices_migration_blocker = NULL; + } else { + error_report("Migration disabled, not support multiple VFIO devices"); } - return ret; + return !ret; } void vfio_unblock_multiple_devices_migration(void) @@ -414,49 +414,9 @@ void vfio_unblock_multiple_devices_migration(void) multiple_devices_migration_blocker = NULL; } -static bool vfio_viommu_preset(void) -{ - VFIOAddressSpace *space; - - QLIST_FOREACH(space, &vfio_address_spaces, list) { - if (space->as != &address_space_memory) { - return true; - } - } - - return false; -} - -int vfio_block_giommu_migration(Error **errp) -{ - int ret; - - if (giommu_migration_blocker || - !vfio_viommu_preset()) { - return 0; - } - - error_setg(&giommu_migration_blocker, - "Migration is currently not supported with vIOMMU enabled"); - ret = migrate_add_blocker(giommu_migration_blocker, errp); - if (ret < 0) { - error_free(giommu_migration_blocker); - giommu_migration_blocker = NULL; - } - - return ret; -} - -void vfio_migration_finalize(void) +bool vfio_block_giommu_migration(VFIODevice *vbasedev) { - if (!giommu_migration_blocker || - vfio_viommu_preset()) { - return; - } - - migrate_del_blocker(giommu_migration_blocker); - error_free(giommu_migration_blocker); - giommu_migration_blocker = NULL; + return vbasedev->group->container->space->as != &address_space_memory; } static void vfio_set_migration_error(int err) diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c index 6b58dddb8859..7621074f156d 100644 --- a/hw/vfio/migration.c +++ b/hw/vfio/migration.c @@ -632,42 +632,39 @@ int64_t vfio_mig_bytes_transferred(void) return bytes_transferred; } -int vfio_migration_realize(VFIODevice *vbasedev, Error **errp) +/* Return true when either migration initialized or blocker registered */ +bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp) { - int ret = -ENOTSUP; + int ret; - if (!vbasedev->enable_migration) { + if (!vbasedev->enable_migration || vfio_migration_init(vbasedev)) { + error_setg(&vbasedev->migration_blocker, + "VFIO device %s doesn't support migration", vbasedev->name); goto add_blocker; } - ret = vfio_migration_init(vbasedev); - if (ret) { - goto add_blocker; - } - - ret = vfio_block_multiple_devices_migration(errp); - if (ret) { - return ret; + if (!vfio_block_multiple_devices_migration(errp)) { + return false; } - ret = vfio_block_giommu_migration(errp); - if (ret) { - return ret; + if (vfio_block_giommu_migration(vbasedev)) { + error_setg(&vbasedev->migration_blocker, + "Migration is currently not supported on %s " + "with vIOMMU enabled", vbasedev->name); + goto add_blocker; } - trace_vfio_migration_probe(vbasedev->name); - return 0; + return true; add_blocker: - error_setg(&vbasedev->migration_blocker, - "VFIO device doesn't support migration"); - ret = migrate_add_blocker(vbasedev->migration_blocker, errp); if (ret < 0) { error_free(vbasedev->migration_blocker); vbasedev->migration_blocker = NULL; + } else { + error_report("%s: Migration disabled", vbasedev->name); } - return ret; + return !ret; } void vfio_migration_exit(VFIODevice *vbasedev) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 82c4cf4f7609..061ca96cbce2 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3209,7 +3209,8 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) if (!pdev->failover_pair_id) { ret = vfio_migration_realize(vbasedev, errp); if (ret) { - error_report("%s: Migration disabled", vbasedev->name); + trace_vfio_migration_probe(vbasedev->name); + } else { goto out_deregister; } } @@ -3250,7 +3251,6 @@ static void vfio_instance_finalize(Object *obj) */ vfio_put_device(vdev); vfio_put_group(group); - vfio_migration_finalize(); } static void vfio_exitfn(PCIDevice *pdev) diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index eed244f25f34..a2e2171b1f93 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -220,9 +220,9 @@ typedef QLIST_HEAD(VFIOGroupList, VFIOGroup) VFIOGroupList; extern VFIOGroupList vfio_group_list; bool vfio_mig_active(void); -int vfio_block_multiple_devices_migration(Error **errp); +bool vfio_block_multiple_devices_migration(Error **errp); void vfio_unblock_multiple_devices_migration(void); -int vfio_block_giommu_migration(Error **errp); +bool vfio_block_giommu_migration(VFIODevice *vbasedev); int64_t vfio_mig_bytes_transferred(void); #ifdef CONFIG_LINUX @@ -246,8 +246,7 @@ int vfio_spapr_create_window(VFIOContainer *container, int vfio_spapr_remove_window(VFIOContainer *container, hwaddr offset_within_address_space); -int vfio_migration_realize(VFIODevice *vbasedev, Error **errp); +bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp); void vfio_migration_exit(VFIODevice *vbasedev); -void vfio_migration_finalize(void); #endif /* HW_VFIO_VFIO_COMMON_H */