Received: by 2002:a05:6358:45e:b0:b5:b6eb:e1f9 with SMTP id 30csp1203075rwe; Sat, 27 Aug 2022 03:06:18 -0700 (PDT) X-Google-Smtp-Source: AA6agR5sT8qOjj6RBYf0hNE+YPJEor49F2vfEdvhABMfyBv3dFxJ0d9WIwriOfWV/rXx3Qf3FMgl X-Received: by 2002:a05:6402:2816:b0:434:ed38:16f3 with SMTP id h22-20020a056402281600b00434ed3816f3mr9634731ede.116.1661594777999; Sat, 27 Aug 2022 03:06:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661594777; cv=none; d=google.com; s=arc-20160816; b=EuF17JsrNF7b1XW4sUxTt2fLRG5b5e7bgVN61ryl9UGjZNG/YFcRTSORcRzp9XTOCv 5FVc7crnujqQh8Qtj0ws1RI3rQ5kaVu5aKhN/FH8dQaz7ltvS9Rsw4tWYmB8IESVg0Gx CaNf1HpdMPWuRXkUuBWl7+w+6++dkhQOQyI/ztwUuFx3ZtD1SR8OQVE26SFNhIXz7g+Q UaId4eHFSoHBNhfePUNL2qf0qEPUv1TfPg+O9/iDTO2ZH7ptizC6O0MbC2dgy1oe58z+ QOinTdmxkGEdwtiC0PxQFNesRAQxstINsbC/vHhe+IHf1AmOO2/ENGbQGMDjYnju9hqC VQOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=DoI4Bp9Jgwh0vwLMpgvjBho3Y9epQEkOaWtMTaNYE2U=; b=Q/LDF4kG5wAmqm3+5BssRUX8xztQ1dD5drKs0k92QvtjY94ER+64kC+ao/yVoRWibU jWBVJqGI5KguhqzSHu8VJuRsfOjwx2t8GzDZKWilfIlRYIIwEXh+UGCKsCv92FILdHnE 8maCyWBcHj93Q4qGKdBMj//ZVDn2sRIfRK24kyaZPMiMO6V/gg2lESr4PQIpHXRuVxrJ K/Ts9kVkH8IS6ekoalKGulJoI/hyqNel0aPx1d0UESxYf/+1O1PhIhd6Is6cL5rxM9l9 iiidvCXAecUOCNVk8eh9sRIziwFy/Rqi8HtgaW4cgoOic5vc6AM5nEScjuqIlaY+cDn/ Rkkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MX7nssXw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id mp16-20020a1709071b1000b00730d5ec03basi2715518ejc.391.2022.08.27.03.05.51; Sat, 27 Aug 2022 03:06:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MX7nssXw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345336AbiH0Jvu (ORCPT + 99 others); Sat, 27 Aug 2022 05:51:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45920 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345124AbiH0JvS (ORCPT ); Sat, 27 Aug 2022 05:51:18 -0400 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57F8FB07E8; Sat, 27 Aug 2022 02:51:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1661593875; x=1693129875; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mqBSHZdc3I5LuPaSmmg6YFNTQtRdx9sXUMJ/SXpc5Yg=; b=MX7nssXwnHl7Z3cDFIiNSidrx7GAGZHoKfK+VM3VclkIAW8H8p1ujB3O ey3YqDtckCc1DqZhvUzF7ZVxjfmgVm1pm45pxaQPv6vIvv/rDk3hgkRzJ XwmshRzoqlzMS3f+ooNkbRkLY2oAig84j9MIoaelWlzxAnseu9Sh2lJDf F1juqGQPPwRvO7FhW8pQ6Ho4SUDD2CsLmf6zJpP6QD20ja9EiJnBRQ8HH a6haq21jwytN/dSbBqZ4tKXL01R/f3LjLE+kPtm1tyO0k50P2GwPd4qrv z+wEkWeg5hmZzH1GbCm67qLAABVKT8bjHe12b5o35WQzcZ6MOYe+RJxQx w==; X-IronPort-AV: E=McAfee;i="6500,9779,10451"; a="294659629" X-IronPort-AV: E=Sophos;i="5.93,267,1654585200"; d="scan'208";a="294659629" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Aug 2022 02:51:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,267,1654585200"; d="scan'208";a="640353976" Received: from sqa-gate.sh.intel.com (HELO michael.clx.dev.tsp.org) ([10.239.48.212]) by orsmga008.jf.intel.com with ESMTP; 27 Aug 2022 02:51:05 -0700 From: Kevin Tian To: Zhenyu Wang , Zhi Wang , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Daniel Vetter , Eric Farman , Matthew Rosato , Halil Pasic , Vineeth Vijayan , Peter Oberparleiter , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Tony Krowiak , Jason Herne , Harald Freudenberger , Diana Craciun , Alex Williamson , Cornelia Huck , Longfang Liu , Shameer Kolothum , Jason Gunthorpe , Yishai Hadas , Kevin Tian , Eric Auger , Kirti Wankhede , Leon Romanovsky , Abhishek Sahu , intel-gvt-dev@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org, kvm@vger.kernel.org Cc: Yi Liu Subject: [PATCH 10/15] vfio/fsl-mc: Use the new device life cycle helpers Date: Sun, 28 Aug 2022 01:10:32 +0800 Message-Id: <20220827171037.30297-11-kevin.tian@intel.com> X-Mailer: git-send-email 2.21.3 In-Reply-To: <20220827171037.30297-1-kevin.tian@intel.com> References: <20220827171037.30297-1-kevin.tian@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-5.2 required=5.0 tests=BAYES_00,DATE_IN_FUTURE_06_12, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_HI,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yi Liu Export symbol of vfio_release_device_set() so fsl-mc @init can handle the error path cleanly instead of assuming certain vfio core API can help release device_set afterwards. Signed-off-by: Yi Liu Signed-off-by: Kevin Tian --- drivers/vfio/fsl-mc/vfio_fsl_mc.c | 87 +++++++++++++++++++------------ drivers/vfio/vfio_main.c | 3 +- include/linux/vfio.h | 1 + 3 files changed, 56 insertions(+), 35 deletions(-) diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc.c b/drivers/vfio/fsl-mc/vfio_fsl_mc.c index 3feff729f3ce..eec3cb914f57 100644 --- a/drivers/vfio/fsl-mc/vfio_fsl_mc.c +++ b/drivers/vfio/fsl-mc/vfio_fsl_mc.c @@ -418,16 +418,7 @@ static int vfio_fsl_mc_mmap(struct vfio_device *core_vdev, return vfio_fsl_mc_mmap_mmio(vdev->regions[index], vma); } -static const struct vfio_device_ops vfio_fsl_mc_ops = { - .name = "vfio-fsl-mc", - .open_device = vfio_fsl_mc_open_device, - .close_device = vfio_fsl_mc_close_device, - .ioctl = vfio_fsl_mc_ioctl, - .read = vfio_fsl_mc_read, - .write = vfio_fsl_mc_write, - .mmap = vfio_fsl_mc_mmap, -}; - +static const struct vfio_device_ops vfio_fsl_mc_ops; static int vfio_fsl_mc_bus_notifier(struct notifier_block *nb, unsigned long action, void *data) { @@ -518,35 +509,49 @@ static void vfio_fsl_uninit_device(struct vfio_fsl_mc_device *vdev) bus_unregister_notifier(&fsl_mc_bus_type, &vdev->nb); } -static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev) +static int vfio_fsl_mc_init_dev(struct vfio_device *core_vdev) { - struct vfio_fsl_mc_device *vdev; - struct device *dev = &mc_dev->dev; + struct vfio_fsl_mc_device *vdev = + container_of(core_vdev, struct vfio_fsl_mc_device, vdev); + struct fsl_mc_device *mc_dev = to_fsl_mc_device(core_vdev->dev); int ret; - vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); - if (!vdev) - return -ENOMEM; - - vfio_init_group_dev(&vdev->vdev, dev, &vfio_fsl_mc_ops); vdev->mc_dev = mc_dev; mutex_init(&vdev->igate); if (is_fsl_mc_bus_dprc(mc_dev)) - ret = vfio_assign_device_set(&vdev->vdev, &mc_dev->dev); + ret = vfio_assign_device_set(core_vdev, &mc_dev->dev); else - ret = vfio_assign_device_set(&vdev->vdev, mc_dev->dev.parent); + ret = vfio_assign_device_set(core_vdev, mc_dev->dev.parent); + if (ret) - goto out_uninit; + return ret; ret = vfio_fsl_mc_init_device(vdev); if (ret) - goto out_uninit; + goto err_assign; + return 0; + +err_assign: + vfio_release_device_set(core_vdev); + return ret; +} + +static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev) +{ + struct vfio_fsl_mc_device *vdev; + struct device *dev = &mc_dev->dev; + int ret; + + vdev = vfio_alloc_device(vfio_fsl_mc_device, vdev, dev, + &vfio_fsl_mc_ops); + if (IS_ERR(vdev)) + return PTR_ERR(vdev); ret = vfio_register_group_dev(&vdev->vdev); if (ret) { dev_err(dev, "VFIO_FSL_MC: Failed to add to vfio group\n"); - goto out_device; + goto out_put_vdev; } ret = vfio_fsl_mc_scan_container(mc_dev); @@ -557,30 +562,44 @@ static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev) out_group_dev: vfio_unregister_group_dev(&vdev->vdev); -out_device: - vfio_fsl_uninit_device(vdev); -out_uninit: - vfio_uninit_group_dev(&vdev->vdev); - kfree(vdev); +out_put_vdev: + vfio_put_device(&vdev->vdev); return ret; } +void vfio_fsl_mc_release_dev(struct vfio_device *core_vdev) +{ + struct vfio_fsl_mc_device *vdev = + container_of(core_vdev, struct vfio_fsl_mc_device, vdev); + + vfio_fsl_uninit_device(vdev); + mutex_destroy(&vdev->igate); + vfio_free_device(core_vdev); +} + static int vfio_fsl_mc_remove(struct fsl_mc_device *mc_dev) { struct device *dev = &mc_dev->dev; struct vfio_fsl_mc_device *vdev = dev_get_drvdata(dev); vfio_unregister_group_dev(&vdev->vdev); - mutex_destroy(&vdev->igate); - dprc_remove_devices(mc_dev, NULL, 0); - vfio_fsl_uninit_device(vdev); - - vfio_uninit_group_dev(&vdev->vdev); - kfree(vdev); + vfio_put_device(&vdev->vdev); return 0; } +static const struct vfio_device_ops vfio_fsl_mc_ops = { + .name = "vfio-fsl-mc", + .init = vfio_fsl_mc_init_dev, + .release = vfio_fsl_mc_release_dev, + .open_device = vfio_fsl_mc_open_device, + .close_device = vfio_fsl_mc_close_device, + .ioctl = vfio_fsl_mc_ioctl, + .read = vfio_fsl_mc_read, + .write = vfio_fsl_mc_write, + .mmap = vfio_fsl_mc_mmap, +}; + static struct fsl_mc_driver vfio_fsl_mc_driver = { .probe = vfio_fsl_mc_probe, .remove = vfio_fsl_mc_remove, diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index af8aad116f2b..9485da17f2e6 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -141,7 +141,7 @@ int vfio_assign_device_set(struct vfio_device *device, void *set_id) } EXPORT_SYMBOL_GPL(vfio_assign_device_set); -static void vfio_release_device_set(struct vfio_device *device) +void vfio_release_device_set(struct vfio_device *device) { struct vfio_device_set *dev_set = device->dev_set; @@ -161,6 +161,7 @@ static void vfio_release_device_set(struct vfio_device *device) } xa_unlock(&vfio_device_set_xa); } +EXPORT_SYMBOL_GPL(vfio_release_device_set); #ifdef CONFIG_VFIO_NOIOMMU static void *vfio_noiommu_open(unsigned long arg) diff --git a/include/linux/vfio.h b/include/linux/vfio.h index e1e9e8352903..b0928a81b45a 100644 --- a/include/linux/vfio.h +++ b/include/linux/vfio.h @@ -168,6 +168,7 @@ int vfio_register_emulated_iommu_dev(struct vfio_device *device); void vfio_unregister_group_dev(struct vfio_device *device); int vfio_assign_device_set(struct vfio_device *device, void *set_id); +void vfio_release_device_set(struct vfio_device *device); int vfio_mig_get_next_state(struct vfio_device *device, enum vfio_device_mig_state cur_fsm, -- 2.21.3