Received: by 2002:a05:6358:489b:b0:bb:da1:e618 with SMTP id x27csp338835rwn; Thu, 8 Sep 2022 02:22:40 -0700 (PDT) X-Google-Smtp-Source: AA6agR4A5IlEqxn5Dq76LL+KPJUO6B3Rt1yZPZEh5vGo5Boaw3ABA7z+hcor4zcg+xuJ6xSruhdz X-Received: by 2002:a05:6402:1b06:b0:44e:a073:1dd8 with SMTP id by6-20020a0564021b0600b0044ea0731dd8mr6185033edb.391.1662628960608; Thu, 08 Sep 2022 02:22:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1662628960; cv=none; d=google.com; s=arc-20160816; b=pvT07lUxiEuh9KzQ7UDjtwNe+JimUXJdKGHZluoEptnA7DwfvOrYNGn+vkCo7VHfzr fqDKTVMpL90R1RH8jlJ6BWaZinfyOqRGbq/SYVQz3OpB0AjlBGAyOEakMZ+EmFFR6gwP uGAfGziFg58jaPYHymtsN0M+GKqkGp9uXQgy8OKlZnKUBrUsji8kMldM2INlLqdonBH5 /VNhugZuuxeEdhXE/EOEgkkdLWK+qJpHXUPDU7U27pmUUEonRxS64PeWt+sDRzbMb66a MG9boS0Ni2rAbziiqplaD4RPWVO40oM6ckdRVGo7x3FSPiGJce9Hsq481GQphkZflTd8 7sJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:reply-to:user-agent :mime-version:date:message-id:dkim-signature; bh=Hzj7WCdR5O1E0nRewcx9z2sjbafx78CCcnXa60ctFMM=; b=USsKDy54neaIkGrfBwg39mWX+eur7XWXz1NemKqgGXFHpbXq1xeK8vQy6ujPXuTC8a UCmAM4RdIncfA1Qtd+548gajVUQZ4d2gGXd6U2VKvqi7S1U5KsfyI78pKFkM72oEpmlM Cv0o9uTUXq+l77R1ipfFfAtPFWwytrcVu13zKAtfRouf3CO2aLOfWZ3PJ5MML2EtH86P tK7yZ7U1Go39FS3daIwh0ctPtCrKY//JnDU8Q6Qw8eSRUKlkbcENeq5n+uNfvNaXdlHn h4LNsU9Qyivejl1brRfWRuPder8qVEIIIvZWRcQ7HS5XlumbsJ+tO1Pzzc9+Z/arA+lY ts/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=XeDiXst0; 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=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r2-20020a170906550200b007307c356ccesi1233773ejp.720.2022.09.08.02.22.14; Thu, 08 Sep 2022 02:22:40 -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=@redhat.com header.s=mimecast20190719 header.b=XeDiXst0; 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231249AbiIHJH1 (ORCPT + 99 others); Thu, 8 Sep 2022 05:07:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41122 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231628AbiIHJHW (ORCPT ); Thu, 8 Sep 2022 05:07:22 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CAD84F756F for ; Thu, 8 Sep 2022 02:07:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1662628038; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Hzj7WCdR5O1E0nRewcx9z2sjbafx78CCcnXa60ctFMM=; b=XeDiXst0NEytslQMJVZ5+xjEB35l7byYUCS+33nHd2kmQcWUSY3PLZRD16Xe9Ps5OQjf5L 1OdZJMf1vSFzX5Y37fDxxiPkAGJMb0sy3B/yLsRTD0gSPtgAddDQtY0KiVz2id7PtwROrn aWU7eThTVqclPwxJ1O3Vfq85GczbPe8= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-83-BaPn1f4VO9mliqKjsDl06Q-1; Thu, 08 Sep 2022 05:07:10 -0400 X-MC-Unique: BaPn1f4VO9mliqKjsDl06Q-1 Received: by mail-qv1-f69.google.com with SMTP id f9-20020ad442c9000000b004ac7f4fde18so448812qvr.14 for ; Thu, 08 Sep 2022 02:07:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date; bh=Hzj7WCdR5O1E0nRewcx9z2sjbafx78CCcnXa60ctFMM=; b=kwe0EOSzOQe97GEnXjqkn5+ZO52emgt0ybGb2PPAF5KLDqqVlJDU1YKV3YQdnfF/6m 3mj90I5D5Fv94IMK/Q94FZxPMX8eOngIR3CIUK8/2kMNH5gQhh59/EyVGJd42KPwraYH h8dEkW2RPk6YL52qJTISgAMgYOwwN58DYCrbeyS/0srhCWeNbP5oiO932mJIsBYKhMvz YjtSjh6Hl183ZBMs6csj5oUCVeR8Gl031Kb+WlwPYiqVh13L/ryGk6s8iqgF8SF8L0Px gzwhyxpN58FWpuV+aU4z/0tjVBh8kHE7afjT9YKf9ildlCUIPN23dJcU8KpWCxvYtokQ AuSw== X-Gm-Message-State: ACgBeo0P8fK0f7HUpGzdUy6R66yjKf9i8PsUOUv8+mj8Yil+Ib37C9Pw bPGCRWzH7iVRxPqFwBcJXaM8uQLotV/vXoK6kZ0Pg9xDWAfKHcjBW6KXAsgSmLlqLJuJ32IwEAn 2A+J7p9MCEiZHw3CdxYSXK7AS X-Received: by 2002:a05:620a:46a2:b0:6bb:29c9:57e0 with SMTP id bq34-20020a05620a46a200b006bb29c957e0mr5778927qkb.621.1662628029937; Thu, 08 Sep 2022 02:07:09 -0700 (PDT) X-Received: by 2002:a05:620a:46a2:b0:6bb:29c9:57e0 with SMTP id bq34-20020a05620a46a200b006bb29c957e0mr5778893qkb.621.1662628029566; Thu, 08 Sep 2022 02:07:09 -0700 (PDT) Received: from ?IPV6:2a01:e0a:59e:9d80:527b:9dff:feef:3874? ([2a01:e0a:59e:9d80:527b:9dff:feef:3874]) by smtp.gmail.com with ESMTPSA id fy9-20020a05622a5a0900b0034359fc348fsm14671781qtb.73.2022.09.08.02.07.01 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 08 Sep 2022 02:07:08 -0700 (PDT) Message-ID: <50d82b01-86a3-e6a3-06f7-7f98e60131eb@redhat.com> Date: Thu, 8 Sep 2022 11:06:59 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Reply-To: eric.auger@redhat.com Subject: Re: [PATCH v2 15/15] vfio: Add struct device to vfio_device Content-Language: en-US To: Kevin Tian , 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 , 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 References: <20220901143747.32858-1-kevin.tian@intel.com> <20220901143747.32858-16-kevin.tian@intel.com> From: Eric Auger In-Reply-To: <20220901143747.32858-16-kevin.tian@intel.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-6.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A, RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable 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 Hi Kevin, On 9/1/22 16:37, Kevin Tian wrote: > From: Yi Liu > > and replace kref. With it a 'vfio-dev/vfioX' node is created under the > sysfs path of the parent, indicating the device is bound to a vfio > driver, e.g.: > > /sys/devices/pci0000\:6f/0000\:6f\:01.0/vfio-dev/vfio0 > > It is also a preparatory step toward adding cdev for supporting future > device-oriented uAPI. > > Add Documentation/ABI/testing/sysfs-devices-vfio-dev. > > Also take this chance to rename chardev 'vfio' to 'vfio-group' in > /proc/devices. > > Suggested-by: Jason Gunthorpe > Signed-off-by: Yi Liu > Signed-off-by: Kevin Tian > Reviewed-by: Jason Gunthorpe > --- > .../ABI/testing/sysfs-devices-vfio-dev | 8 +++ > drivers/vfio/vfio_main.c | 67 +++++++++++++++---- > include/linux/vfio.h | 6 +- > 3 files changed, 66 insertions(+), 15 deletions(-) > create mode 100644 Documentation/ABI/testing/sysfs-devices-vfio-dev > > diff --git a/Documentation/ABI/testing/sysfs-devices-vfio-dev b/Documentation/ABI/testing/sysfs-devices-vfio-dev > new file mode 100644 > index 000000000000..e21424fd9666 > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-devices-vfio-dev > @@ -0,0 +1,8 @@ > +What: /sys/...//vfio-dev/vfioX/ > +Date: September 2022 > +Contact: Yi Liu > +Description: > + This directory is created when the device is bound to a > + vfio driver. The layout under this directory matches what > + exists for a standard 'struct device'. 'X' is a unique > + index marking this device in vfio. > diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c > index bfa675d314ab..141f55c3faf5 100644 > --- a/drivers/vfio/vfio_main.c > +++ b/drivers/vfio/vfio_main.c > @@ -46,6 +46,8 @@ static struct vfio { > struct mutex group_lock; /* locks group_list */ > struct ida group_ida; > dev_t group_devt; > + struct class *device_class; > + struct ida device_ida; > } vfio; > > struct vfio_iommu_driver { > @@ -483,12 +485,13 @@ static struct vfio_device *vfio_group_get_device(struct vfio_group *group, > * VFIO driver API > */ > /* Release helper called by vfio_put_device() */ > -void vfio_device_release(struct kref *kref) > +static void vfio_device_release(struct device *dev) > { > struct vfio_device *device = > - container_of(kref, struct vfio_device, kref); > + container_of(dev, struct vfio_device, device); > > vfio_release_device_set(device); > + ida_free(&vfio.device_ida, device->index); > > /* > * kvfree() cannot be done here due to a life cycle mess in > @@ -498,7 +501,6 @@ void vfio_device_release(struct kref *kref) > */ > device->ops->release(device); > } > -EXPORT_SYMBOL_GPL(vfio_device_release); > > /* > * Alloc and initialize vfio_device so it can be registered to vfio > @@ -546,6 +548,13 @@ int vfio_init_device(struct vfio_device *device, struct device *dev, > { > int ret; > > + ret = ida_alloc_max(&vfio.device_ida, MINORMASK, GFP_KERNEL); > + if (ret < 0) { > + dev_dbg(dev, "Error to alloc index\n"); > + return ret; > + } > + > + device->index = ret; > init_completion(&device->comp); > device->dev = dev; > device->ops = ops; > @@ -556,11 +565,15 @@ int vfio_init_device(struct vfio_device *device, struct device *dev, > goto out_uninit; > } > > - kref_init(&device->kref); > + device_initialize(&device->device); > + device->device.release = vfio_device_release; > + device->device.class = vfio.device_class; > + device->device.parent = device->dev; > return 0; > > out_uninit: > vfio_release_device_set(device); > + ida_free(&vfio.device_ida, device->index); > return ret; > } > EXPORT_SYMBOL_GPL(vfio_init_device); > @@ -657,6 +670,7 @@ static int __vfio_register_dev(struct vfio_device *device, > struct vfio_group *group) > { > struct vfio_device *existing_device; > + int ret; > > if (IS_ERR(group)) > return PTR_ERR(group); > @@ -673,16 +687,21 @@ static int __vfio_register_dev(struct vfio_device *device, > dev_WARN(device->dev, "Device already exists on group %d\n", > iommu_group_id(group->iommu_group)); > vfio_device_put_registration(existing_device); > - if (group->type == VFIO_NO_IOMMU || > - group->type == VFIO_EMULATED_IOMMU) > - iommu_group_remove_device(device->dev); > - vfio_group_put(group); > - return -EBUSY; > + ret = -EBUSY; > + goto err_out; > } > > /* Our reference on group is moved to the device */ > device->group = group; > > + ret = dev_set_name(&device->device, "vfio%d", device->index); > + if (ret) > + goto err_out; > + > + ret = device_add(&device->device); > + if (ret) > + goto err_out; > + > /* Refcounting can't start until the driver calls register */ > refcount_set(&device->refcount, 1); > > @@ -692,6 +711,12 @@ static int __vfio_register_dev(struct vfio_device *device, > mutex_unlock(&group->device_lock); > > return 0; > +err_out: > + if (group->type == VFIO_NO_IOMMU || > + group->type == VFIO_EMULATED_IOMMU) > + iommu_group_remove_device(device->dev); > + vfio_group_put(group); > + return ret; > } > > int vfio_register_group_dev(struct vfio_device *device) > @@ -779,6 +804,9 @@ void vfio_unregister_group_dev(struct vfio_device *device) > group->dev_counter--; > mutex_unlock(&group->device_lock); > > + /* Balances device_add in register path */ > + device_del(&device->device); > + > if (group->type == VFIO_NO_IOMMU || group->type == VFIO_EMULATED_IOMMU) > iommu_group_remove_device(device->dev); > > @@ -2145,6 +2173,7 @@ static int __init vfio_init(void) > int ret; > > ida_init(&vfio.group_ida); > + ida_init(&vfio.device_ida); > mutex_init(&vfio.group_lock); > mutex_init(&vfio.iommu_drivers_lock); > INIT_LIST_HEAD(&vfio.group_list); > @@ -2160,12 +2189,20 @@ static int __init vfio_init(void) > vfio.class = class_create(THIS_MODULE, "vfio"); > if (IS_ERR(vfio.class)) { > ret = PTR_ERR(vfio.class); > - goto err_class; > + goto err_group_class; > } > > vfio.class->devnode = vfio_devnode; > > - ret = alloc_chrdev_region(&vfio.group_devt, 0, MINORMASK + 1, "vfio"); > + /* /sys/class/vfio-dev/vfioX */ > + vfio.device_class = class_create(THIS_MODULE, "vfio-dev"); > + if (IS_ERR(vfio.device_class)) { > + ret = PTR_ERR(vfio.device_class); > + goto err_dev_class; > + } > + > + ret = alloc_chrdev_region(&vfio.group_devt, 0, MINORMASK + 1, > + "vfio-group"); > if (ret) > goto err_alloc_chrdev; > > @@ -2181,9 +2218,12 @@ static int __init vfio_init(void) > err_driver_register: > unregister_chrdev_region(vfio.group_devt, MINORMASK + 1); > err_alloc_chrdev: > + class_destroy(vfio.device_class); > + vfio.device_class = NULL; > +err_dev_class: > class_destroy(vfio.class); > vfio.class = NULL; > -err_class: > +err_group_class: > misc_deregister(&vfio_dev); > return ret; > } > @@ -2195,8 +2235,11 @@ static void __exit vfio_cleanup(void) > #ifdef CONFIG_VFIO_NOIOMMU > vfio_unregister_iommu_driver(&vfio_noiommu_ops); > #endif > + ida_destroy(&vfio.device_ida); > ida_destroy(&vfio.group_ida); > unregister_chrdev_region(vfio.group_devt, MINORMASK + 1); > + class_destroy(vfio.device_class); > + vfio.device_class = NULL; > class_destroy(vfio.class); > vfio.class = NULL; > misc_deregister(&vfio_dev); > diff --git a/include/linux/vfio.h b/include/linux/vfio.h > index f03447c8774d..5c13f74da1bb 100644 > --- a/include/linux/vfio.h > +++ b/include/linux/vfio.h > @@ -45,7 +45,8 @@ struct vfio_device { > struct kvm *kvm; > > /* Members below here are private, not for driver use */ > - struct kref kref; /* object life cycle */ > + unsigned int index; > + struct device device; /* device.kref covers object life circle */ > refcount_t refcount; /* user count on registered device*/ > unsigned int open_count; > struct completion comp; I am not totally clear about remaining 'struct device *dev;' in vfio_device struct. I see it used in some places. Is it supposed to disappear at some point? > @@ -154,10 +155,9 @@ struct vfio_device *_vfio_alloc_device(size_t size, struct device *dev, > int vfio_init_device(struct vfio_device *device, struct device *dev, > const struct vfio_device_ops *ops); > void vfio_free_device(struct vfio_device *device); > -void vfio_device_release(struct kref *kref); > static inline void vfio_put_device(struct vfio_device *device) > { > - kref_put(&device->kref, vfio_device_release); > + put_device(&device->device); > } > > int vfio_register_group_dev(struct vfio_device *device); Thanks Eric