Received: by 2002:a05:6358:701b:b0:131:369:b2a3 with SMTP id 27csp2610486rwo; Sun, 23 Jul 2023 20:22:51 -0700 (PDT) X-Google-Smtp-Source: APBJJlG2tYMU6Vp7oZMl2crYMHoUXEixsCj16RD7JZ9QQcOjr03vLXUY4dG/bHBlhIgeW8YztRcT X-Received: by 2002:a05:6358:9997:b0:134:c850:e8c5 with SMTP id j23-20020a056358999700b00134c850e8c5mr3699480rwb.19.1690168970756; Sun, 23 Jul 2023 20:22:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690168970; cv=none; d=google.com; s=arc-20160816; b=Id4n61D4lpPYiwyEITbhqkccFAxHiO8FitCerMGsr6x4KdBDMXIVda3rhL8VUsryoN nuM+38Y7GL1xxjFpWCH1y7BSChfRx+hn4BdGek5mk5DqhgxzHEgIvCUSZRkqAFda135O lNlqpvOZ2tfqz3mec2IcOlYclTiGzCVFuFPzNw5GsvaGwOaihjFV+ZyaBwLhliQoSWqe 1k/V5AjTZnarBKMgkRa4k3HcbJQA3BoBIrzKj4ep9CpNE7b3AA8uSK31OmiwPEYm4dWc laOBY/bmwTBOZ7duG5oJZ+CIPfiJJ7r/nXwp7fEDo3j2YBuoNAaOemxVDSnAoyicV/5B q9Nw== 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 :mime-version:user-agent:date:message-id:from:references:cc:to :subject; bh=911m+HG65qXJMnnPQ1mPNP/iK33uN6iplWaljEAFF9I=; fh=X3WN2bzT77s3BRLYHb/YeXImqm8DcUC+AvNHA1o82jM=; b=wWbBe5zOaMEV27hUom44cDkaG4Le1EmvNFD+E6W42YDARPUNRjGjGX+QFmwKs6bXTv Q7sPdD5iJ/2orsm1ngkQZNqkVNMZPD5LM3QdI+OCQoYE/F5oR2w8+V7U7pzxZuItEYeo LSsMDw8jFCjf82VTGRaYs7+Fg6cp+unbjXLF0SRZ6bJyU3sUy/BV20aHhGuAE8TusHTD BwymAHMc7IYJFT0GrPNdbEkFfCvDyV01sTuvBDctsW9pEKp8DJzeTY4U1HcKfzW0sWU3 D1RrNy86PuTQA47LnuP5snnrlb/LA1IQ13hLc3MEXyrnIZP6lnAc4vL+775LP8niLmRq Lwvg== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d15-20020a056a00244f00b00682ad3438besi8338671pfj.214.2023.07.23.20.22.38; Sun, 23 Jul 2023 20:22:50 -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; 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=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229920AbjGXCmO (ORCPT + 99 others); Sun, 23 Jul 2023 22:42:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52216 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229809AbjGXCmN (ORCPT ); Sun, 23 Jul 2023 22:42:13 -0400 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44670E6 for ; Sun, 23 Jul 2023 19:42:08 -0700 (PDT) Received: from kwepemm600005.china.huawei.com (unknown [172.30.72.53]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4R8PVV56rCzNmW4; Mon, 24 Jul 2023 10:38:42 +0800 (CST) Received: from [10.67.103.158] (10.67.103.158) by kwepemm600005.china.huawei.com (7.193.23.191) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Mon, 24 Jul 2023 10:42:04 +0800 Subject: Re: [PATCH v11 1/4] vfio/migration: Add debugfs to live migration driver To: =?UTF-8?Q?C=c3=a9dric_Le_Goater?= , , , , CC: , , References: <20230630092457.54902-1-liulongfang@huawei.com> <20230630092457.54902-2-liulongfang@huawei.com> <04b41307-b1a9-62d0-4996-a8c655b46892@redhat.com> From: liulongfang Message-ID: <77467797-f609-6197-c359-d3192832e2e7@huawei.com> Date: Mon, 24 Jul 2023 10:42:03 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <04b41307-b1a9-62d0-4996-a8c655b46892@redhat.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.103.158] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To kwepemm600005.china.huawei.com (7.193.23.191) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-5.3 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS,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 On 2023/7/19 1:45, Cédric Le Goater Wrote: > On 6/30/23 11:24, liulongfang wrote: >> From: Longfang Liu >> >> There are multiple devices, software and operational steps involved >> in the process of live migration. An error occurred on any node may >> cause the live migration operation to fail. >> This complex process makes it very difficult to locate and analyze >> the cause when the function fails. >> >> In order to quickly locate the cause of the problem when the >> live migration fails, I added a set of debugfs to the vfio >> live migration driver. >> >>      +-------------------------------------------+ >>      |                                           | >>      |                                           | >>      |                  QEMU                     | >>      |                                           | >>      |                                           | >>      +---+----------------------------+----------+ >>          |      ^                     |      ^ >>          |      |                     |      | >>          |      |                     |      | >>          v      |                     v      | >>       +---------+--+               +---------+--+ >>       |src vfio_dev|               |dst vfio_dev| >>       +--+---------+               +--+---------+ >>          |      ^                     |      ^ >>          |      |                     |      | >>          v      |                     |      | >>     +-----------+----+           +-----------+----+ >>     |src dev debugfs |           |dst dev debugfs | >>     +----------------+           +----------------+ >> >> The entire debugfs directory will be based on the definition of >> the CONFIG_DEBUG_FS macro. If this macro is not enabled, the >> interfaces in vfio.h will be empty definitions, and the creation >> and initialization of the debugfs directory will not be executed. >> >>     vfio >>      | >>      +--- >>      |    +---migration >>      |        +--state >>      |        +--hisi_acc >>      |            +--attr >>      |            +--data >>      |            +--save >>      |            +--io_test >>      | >>      +--- >>           +---migration >>               +--state >>               +--hisi_acc >>                   +--attr >>                   +--data >>                   +--save >>                   +--io_test >> >> debugfs will create a public root directory "vfio" file. >> then create a dev_name() file for each live migration device. >> First, create a unified state acquisition file of "migration" >> in this device directory. >> Then, create a public live migration state lookup file "state" >> Finally, create a directory file based on the device type, >> and then create the device's own debugging files under >> this directory file. >> >> Here, HiSilicon accelerator creates three debug files: >> attr: used to export the attribute parameters of the >> current live migration device. >> data: used to export the live migration data of the current >> live migration device. >> save: used to read the current live migration device's data >> and save it to the driver. >> io_test: used to test the IO read and write for the driver. >> >> The live migration function of the current device can be tested by >> operating the debug files, and the functional status of the equipment >> and software at each stage can be tested step by step without >> performing the complete live migration function. And after the live >> migration is performed, the migration device data of the live migration >> can be obtained through the debug files. >> >> Signed-off-by: Longfang Liu >> --- >>   drivers/vfio/Makefile       |  1 + >>   drivers/vfio/vfio.h         | 14 +++++++ >>   drivers/vfio/vfio_debugfs.c | 78 +++++++++++++++++++++++++++++++++++++ >>   drivers/vfio/vfio_main.c    |  9 ++++- >>   include/linux/vfio.h        |  7 ++++ >>   5 files changed, 108 insertions(+), 1 deletion(-) >>   create mode 100644 drivers/vfio/vfio_debugfs.c >> >> diff --git a/drivers/vfio/Makefile b/drivers/vfio/Makefile >> index 66f418aef5a9..6829c58210dc 100644 >> --- a/drivers/vfio/Makefile >> +++ b/drivers/vfio/Makefile >> @@ -7,6 +7,7 @@ vfio-y += vfio_main.o \ >>   vfio-$(CONFIG_IOMMUFD) += iommufd.o >>   vfio-$(CONFIG_VFIO_CONTAINER) += container.o >>   vfio-$(CONFIG_VFIO_VIRQFD) += virqfd.o >> +vfio-$(CONFIG_DEBUG_FS) += vfio_debugfs.o >>     obj-$(CONFIG_VFIO_IOMMU_TYPE1) += vfio_iommu_type1.o >>   obj-$(CONFIG_VFIO_IOMMU_SPAPR_TCE) += vfio_iommu_spapr_tce.o >> diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h >> index 7b19c621e0e6..729c52ef579a 100644 >> --- a/drivers/vfio/vfio.h >> +++ b/drivers/vfio/vfio.h >> @@ -264,4 +264,18 @@ static inline void vfio_device_put_kvm(struct vfio_device *device) >>   } >>   #endif >>   +#ifdef CONFIG_DEBUG_FS >> +void vfio_debugfs_create_root(void); >> +void vfio_debugfs_remove_root(void); >> + >> +void vfio_device_debugfs_init(struct vfio_device *vdev); >> +void vfio_device_debugfs_exit(struct vfio_device *vdev); >> +#else >> +static inline void vfio_debugfs_create_root(void) { } >> +static inline void vfio_debugfs_remove_root(void) { } >> + >> +static inline void vfio_device_debugfs_init(struct vfio_device *vdev) { } >> +static inline void vfio_device_debugfs_exit(struct vfio_device *vdev) { } >> +#endif /* CONFIG_DEBUG_FS */ >> + >>   #endif >> diff --git a/drivers/vfio/vfio_debugfs.c b/drivers/vfio/vfio_debugfs.c >> new file mode 100644 >> index 000000000000..7bff30f76bd9 >> --- /dev/null >> +++ b/drivers/vfio/vfio_debugfs.c >> @@ -0,0 +1,78 @@ >> +// SPDX-License-Identifier: GPL-2.0-only >> +/* >> + * Copyright (c) 2023, HiSilicon Ltd. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include "vfio.h" >> + >> +static struct dentry *vfio_debugfs_root; > > This could be external to all VFIO. See comment below. >   >> + >> +static int vfio_device_state_read(struct seq_file *seq, void *data) >> +{ >> +    struct device *vf_dev = seq->private; >> +    struct vfio_device *vdev = container_of(vf_dev, struct vfio_device, device); >> +    enum vfio_device_mig_state state; >> +    int ret; >> + >> +    ret = vdev->mig_ops->migration_get_state(vdev, &state); >> +    if (ret) >> +        return -EINVAL; >> + >> +    switch (state) { >> +    case VFIO_DEVICE_STATE_RUNNING: >> +        seq_printf(seq, "%s\n", "RUNNING"); >> +        break; >> +    case VFIO_DEVICE_STATE_STOP_COPY: >> +        seq_printf(seq, "%s\n", "STOP_COPY"); >> +        break; >> +    case VFIO_DEVICE_STATE_STOP: >> +        seq_printf(seq, "%s\n", "STOP"); >> +        break; >> +    case VFIO_DEVICE_STATE_RESUMING: >> +        seq_printf(seq, "%s\n", "RESUMING"); >> +        break; >> +    case VFIO_DEVICE_STATE_RUNNING_P2P: >> +        seq_printf(seq, "%s\n", "RESUMING_P2P"); >> +        break; >> +    case VFIO_DEVICE_STATE_ERROR: >> +        seq_printf(seq, "%s\n", "ERROR"); >> +        break; >> +    default: >> +        seq_printf(seq, "%s\n", "Invalid"); >> +    } >> + >> +    return 0; >> +} >> + >> +void vfio_device_debugfs_init(struct vfio_device *vdev) >> +{ >> +    struct dentry *vfio_dev_migration = NULL; >> +    struct device *dev = &vdev->device; >> + >> +    vdev->debug_root = debugfs_create_dir(dev_name(vdev->dev), vfio_debugfs_root); >> +    vfio_dev_migration = debugfs_create_dir("migration", vdev->debug_root); >> + >> +    debugfs_create_devm_seqfile(dev, "state", vfio_dev_migration, >> +                  vfio_device_state_read); >> +} >> + >> +void vfio_device_debugfs_exit(struct vfio_device *vdev) >> +{ >> +    debugfs_remove_recursive(vdev->debug_root); >> +} > > I would simply use : > >     if (IS_ENABLED(CONFIG_DEBUG_FS)) >         debugfs_remove_recursive(vdev->debug_root); > > where vfio_device_debugfs_exit() is called. > These functions have been processed by CONFIG_DEBUG_FS in vfio.h. The effect is almost the same. >> + >> +void vfio_debugfs_create_root(void) >> +{ >> +    vfio_debugfs_root = debugfs_create_dir("vfio", NULL); >> +} >> + >> +void vfio_debugfs_remove_root(void) >> +{ >> +    debugfs_remove_recursive(vfio_debugfs_root); >> +    vfio_debugfs_root = NULL; > ditto. > ditto. >> +} >> + >> diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c >> index f0ca33b2e1df..18d050ec9a12 100644 >> --- a/drivers/vfio/vfio_main.c >> +++ b/drivers/vfio/vfio_main.c >> @@ -282,7 +282,8 @@ static int __vfio_register_dev(struct vfio_device *device, >>         /* Refcounting can't start until the driver calls register */ >>       refcount_set(&device->refcount, 1); >> - >> +    if (device->mig_ops) >> +        vfio_device_debugfs_init(device); > > I think we should prepare ground for more debugfs files than just migration > related things. Migration is clearly a very good candidate, but there could > be more. I have a couple out of tree patches to collect statistics on VMA > usage and resets for instance which could be included. > > > Thanks, > > C. OK, this suggestion of yours is very good. I can put this judgment processing into vfio_device_debugfs_init(). If your patch needs to add debugfs, you can add it in vfio_device_debugfs_init(). Thanks, Longfang. > >>       vfio_device_group_register(device); >>         return 0; >> @@ -339,6 +340,8 @@ void vfio_unregister_group_dev(struct vfio_device *device) >>           } >>       } >>   +    if (device->mig_ops) >> +        vfio_device_debugfs_exit(device); >>       vfio_device_group_unregister(device); >>         /* Balances device_add in register path */ >> @@ -1415,7 +1418,10 @@ static int __init vfio_init(void) >>           goto err_dev_class; >>       } >>   + >> +    vfio_debugfs_create_root(); >>       pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); >> + >>       return 0; >>     err_dev_class: >> @@ -1433,6 +1439,7 @@ static void __exit vfio_cleanup(void) >>       vfio_virqfd_exit(); >>       vfio_group_cleanup(); >>       xa_destroy(&vfio_device_set_xa); >> +    vfio_debugfs_remove_root(); >>   } >>     module_init(vfio_init); >> diff --git a/include/linux/vfio.h b/include/linux/vfio.h >> index 2c137ea94a3e..a114b430be31 100644 >> --- a/include/linux/vfio.h >> +++ b/include/linux/vfio.h >> @@ -62,6 +62,13 @@ struct vfio_device { >>       struct iommufd_device *iommufd_device; >>       bool iommufd_attached; >>   #endif >> +#ifdef CONFIG_DEBUG_FS >> +    /* >> +     * debug_root is a static property of the vfio_device >> +     * which must be set prior to registering the vfio_device. >> +     */ >> +    struct dentry *debug_root; >> +#endif >>   }; >>     /** > > . >