Received: by 2002:a05:7412:1703:b0:e2:908c:2ebd with SMTP id dm3csp3979311rdb; Wed, 30 Aug 2023 11:35:55 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHSM2y8EfNFriVWjQ53N9ngPtE9fv7Qt5ca/GCDjVFmPxb147jNzOlI4mINlE6KJM2GnvUX X-Received: by 2002:a17:90a:eacb:b0:26d:689f:4261 with SMTP id ev11-20020a17090aeacb00b0026d689f4261mr2753500pjb.44.1693420554724; Wed, 30 Aug 2023 11:35:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693420554; cv=none; d=google.com; s=arc-20160816; b=wxSsjzDu29qWUhTlThcorc9ufPLxtcRZ2GIvK+zV6u2SbDtBp98x97NOf2Z0zKjuI/ agp8sdV0303dJDNEB+mkDo+Z3qtzUWy32BnY/E+YLYyQld5JNgQBjQyKaoorALiqOiyH 5LC/0tMzG5ukOd6iua4qPq8TezS2ZRD3KFY0JWhqWn20+R1Ha0N22uDLnyVUHIz0D0jn mBSV1xM5zusj4eY8PJ1l2HOLQbVv6s/mhAJljcd5dOcgL2Z46ddSdQlD2cqneix8WTSR ukCT2B7rkjLGQrVWdafKR5MYGIonubOhy/qoFK35Qat/K3cQeCy4lqqyeIHIvJxpiiNn twtg== 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=7tIDa8fLOen0zzTYPsggRs0V3CAG9Y3E5BUBaRJ3h+0=; fh=CqKZksn6E6FA26dyu26NTEis6Rj8yeYY6M2LODfOWO0=; b=0fMKxNkEaZA2yAWId4mjCe9brYwcb++dP/Vrwy8lWD/kE5ESamH1xt1uYnvLbL+HWP VQQitd9WBMFevfgq07gjekcF+kZyhabWxGFjGxU2MmTNgm98x8QoTaLotmBZXIJfAM30 iT1iRtLCXmoADAnMtbpRuQPh4wDTB/sbcfP/sf6Ho4lHtsDnNKfekzzql+0uiLnsHoJP 9fQiE/AyA9Zh693juwquSGIra/y+cCbMZ9mi5eEw2SgUCxuFmw/B52Le5pi6UjSC1ccF MwGkaII/qWZTdhIqnq31h0c4lFCygUmY96pM24mfPtyJeqpfjsoBCrwP9ozKMVp827g3 Xr5A== 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 gl2-20020a17090b120200b002681dee79casi1329807pjb.108.2023.08.30.11.35.40; Wed, 30 Aug 2023 11:35:54 -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 S241685AbjH3CVD (ORCPT + 99 others); Tue, 29 Aug 2023 22:21:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241689AbjH3CUy (ORCPT ); Tue, 29 Aug 2023 22:20:54 -0400 Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 869B01B7; Tue, 29 Aug 2023 19:20:50 -0700 (PDT) Received: from kwepemm600005.china.huawei.com (unknown [172.30.72.53]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4Rb7Js6l4Jz1L9Pq; Wed, 30 Aug 2023 10:19:09 +0800 (CST) Received: from [10.67.121.110] (10.67.121.110) 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.31; Wed, 30 Aug 2023 10:20:47 +0800 Subject: Re: [PATCH v14 1/2] vfio/migration: Add debugfs to live migration driver To: Brett Creeley , , , , CC: , , , References: <20230826074325.48062-1-liulongfang@huawei.com> <20230826074325.48062-2-liulongfang@huawei.com> <2c712626-c9e1-9cf1-b38c-a1ffda8620ec@amd.com> From: liulongfang Message-ID: <7af196a7-2549-6693-71d7-609398b62f23@huawei.com> Date: Wed, 30 Aug 2023 10:20:46 +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: <2c712626-c9e1-9cf1-b38c-a1ffda8620ec@amd.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.121.110] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm600005.china.huawei.com (7.193.23.191) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-5.4 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS 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/8/29 8:48, Brett Creeley wrote: > On 8/26/2023 12:43 AM, liulongfang wrote: >> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. >> >> >> 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 >>      | >>      +--- >>           +---migration >>               +--state >> >> 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. >> >> Signed-off-by: Longfang Liu >> --- >>   drivers/vfio/Makefile       |  1 + >>   drivers/vfio/vfio.h         | 14 +++++++ >>   drivers/vfio/vfio_debugfs.c | 80 +++++++++++++++++++++++++++++++++++++ >>   drivers/vfio/vfio_main.c    |  5 ++- >>   include/linux/vfio.h        |  7 ++++ >>   5 files changed, 106 insertions(+), 1 deletion(-) >>   create mode 100644 drivers/vfio/vfio_debugfs.c >> >> diff --git a/drivers/vfio/Makefile b/drivers/vfio/Makefile >> index c82ea032d352..7934ac829989 100644 >> --- a/drivers/vfio/Makefile >> +++ b/drivers/vfio/Makefile >> @@ -8,6 +8,7 @@ vfio-$(CONFIG_VFIO_GROUP) += group.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 307e3f29b527..09b00757d0bb 100644 >> --- a/drivers/vfio/vfio.h >> +++ b/drivers/vfio/vfio.h >> @@ -448,4 +448,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..d903293ed9c7 >> --- /dev/null >> +++ b/drivers/vfio/vfio_debugfs.c >> @@ -0,0 +1,80 @@ >> +// 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; >> + >> +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"); > > Should this be "RUNNING_P2P" here in the seq_printf() statement? > OK, here I need to modify it. Thanks, Longfang. >> +               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); >> + >> +       if (vdev->mig_ops) { >> +               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); >> +} >> + >> +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; >> +} >> + >> diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c >> index cfad824d9aa2..8a7456f89842 100644 >> --- a/drivers/vfio/vfio_main.c >> +++ b/drivers/vfio/vfio_main.c >> @@ -309,7 +309,7 @@ static int __vfio_register_dev(struct vfio_device *device, >> >>          /* Refcounting can't start until the driver calls register */ >>          refcount_set(&device->refcount, 1); >> - >> +       vfio_device_debugfs_init(device); >>          vfio_device_group_register(device); >> >>          return 0; >> @@ -378,6 +378,7 @@ void vfio_unregister_group_dev(struct vfio_device *device) >>                  } >>          } >> >> +       vfio_device_debugfs_exit(device); >>          /* Balances vfio_device_set_group in register path */ >>          vfio_device_remove_group(device); >>   } >> @@ -1662,6 +1663,7 @@ static int __init vfio_init(void) >>          if (ret) >>                  goto err_alloc_dev_chrdev; >> >> +       vfio_debugfs_create_root(); >>          pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); >>          return 0; >> >> @@ -1684,6 +1686,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 454e9295970c..769d7af86225 100644 >> --- a/include/linux/vfio.h >> +++ b/include/linux/vfio.h >> @@ -69,6 +69,13 @@ struct vfio_device { >>          u8 iommufd_attached:1; >>   #endif >>          u8 cdev_opened:1; >> +#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 >>   }; >> >>   /** >> -- >> 2.24.0 >> > . >