[PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver

Longfang Liu posted 5 patches 1 year, 9 months ago
There is a newer version of this series
[PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by Longfang Liu 1 year, 9 months ago
On the debugfs framework of VFIO, if the CONFIG_VFIO_DEBUGFS macro is
enabled, the debug function is registered for the live migration driver
of the HiSilicon accelerator device.

After registering the HiSilicon accelerator device on the debugfs
framework of live migration of vfio, a directory file "hisi_acc"
of debugfs is created, and then three debug function files are
created in this directory:

   vfio
    |
    +---<dev_name1>
    |    +---migration
    |        +--state
    |        +--hisi_acc
    |            +--dev_data
    |            +--migf_data
    |            +--cmd_state
    |
    +---<dev_name2>
         +---migration
             +--state
             +--hisi_acc
                 +--dev_data
                 +--migf_data
                 +--cmd_state

dev_data file: read device data that needs to be migrated from the
current device in real time
migf_data file: read the migration data of the last live migration
from the current driver.
cmd_state: used to get the cmd channel state for the device.

+----------------+        +--------------+       +---------------+
| migration dev  |        |   src  dev   |       |   dst  dev    |
+-------+--------+        +------+-------+       +-------+-------+
        |                        |                       |
        |                 +------v-------+       +-------v-------+
        |                 |  saving_mif  |       | resuming_migf |
  read  |                 |     file     |       |     file      |
        |                 +------+-------+       +-------+-------+
        |                        |          copy         |
        |                        +------------+----------+
        |                                     |
+-------v---------+                   +-------v--------+
|   data buffer   |                   |   debug_migf   |
+-------+---------+                   +-------+--------+
        |                                     |
   cat  |                                 cat |
+-------v--------+                    +-------v--------+
|   dev_data     |                    |   migf_data    |
+----------------+                    +----------------+

When accessing debugfs, user can obtain the real-time status data
of the device through the "dev_data" file. It will directly read
the device status data and will not affect the live migration
function. Its data is stored in the allocated memory buffer,
and the memory is released after data returning to user mode.

To obtain the data of the last complete migration, user need to
obtain it through the "migf_data" file. Since the live migration
data only exists during the migration process, it is destroyed
after the migration is completed.
In order to save this data, a debug_migf file is created in the
driver. At the end of the live migration process, copy the data
to debug_migf.

Signed-off-by: Longfang Liu <liulongfang@huawei.com>
---
 .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c    | 225 ++++++++++++++++++
 .../vfio/pci/hisilicon/hisi_acc_vfio_pci.h    |   7 +
 2 files changed, 232 insertions(+)

diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
index bf358ba94b5d..5d67fb6fa135 100644
--- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
+++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
@@ -627,15 +627,33 @@ static void hisi_acc_vf_disable_fd(struct hisi_acc_vf_migration_file *migf)
 	mutex_unlock(&migf->lock);
 }
 
+static void hisi_acc_debug_migf_copy(struct hisi_acc_vf_core_device *hisi_acc_vdev,
+	struct hisi_acc_vf_migration_file *src_migf)
+{
+	struct hisi_acc_vf_migration_file *dst_migf = hisi_acc_vdev->debug_migf;
+
+	if (!dst_migf)
+		return;
+
+	mutex_lock(&hisi_acc_vdev->enable_mutex);
+	dst_migf->disabled = src_migf->disabled;
+	dst_migf->total_length = src_migf->total_length;
+	memcpy(&dst_migf->vf_data, &src_migf->vf_data,
+		sizeof(struct acc_vf_data));
+	mutex_unlock(&hisi_acc_vdev->enable_mutex);
+}
+
 static void hisi_acc_vf_disable_fds(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 {
 	if (hisi_acc_vdev->resuming_migf) {
+		hisi_acc_debug_migf_copy(hisi_acc_vdev, hisi_acc_vdev->resuming_migf);
 		hisi_acc_vf_disable_fd(hisi_acc_vdev->resuming_migf);
 		fput(hisi_acc_vdev->resuming_migf->filp);
 		hisi_acc_vdev->resuming_migf = NULL;
 	}
 
 	if (hisi_acc_vdev->saving_migf) {
+		hisi_acc_debug_migf_copy(hisi_acc_vdev, hisi_acc_vdev->saving_migf);
 		hisi_acc_vf_disable_fd(hisi_acc_vdev->saving_migf);
 		fput(hisi_acc_vdev->saving_migf->filp);
 		hisi_acc_vdev->saving_migf = NULL;
@@ -1144,6 +1162,7 @@ static int hisi_acc_vf_qm_init(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 	if (!vf_qm->io_base)
 		return -EIO;
 
+	mutex_init(&hisi_acc_vdev->enable_mutex);
 	vf_qm->fun_type = QM_HW_VF;
 	vf_qm->pdev = vf_dev;
 	mutex_init(&vf_qm->mailbox_lock);
@@ -1294,6 +1313,203 @@ static long hisi_acc_vfio_pci_ioctl(struct vfio_device *core_vdev, unsigned int
 	return vfio_pci_core_ioctl(core_vdev, cmd, arg);
 }
 
+static int hisi_acc_vf_debug_check(struct seq_file *seq, struct vfio_device *vdev)
+{
+	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
+	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
+	struct device *dev = vdev->dev;
+	int ret;
+
+	if (!vdev->mig_ops) {
+		dev_err(dev, "device does not support live migration!\n");
+		return -EINVAL;
+	}
+
+	/**
+	 * When the device is not opened, the io_base is not mapped.
+	 * The driver cannot perform device read and write operations.
+	 */
+	if (!hisi_acc_vdev->dev_opened) {
+		dev_err(dev, "device not opened!\n");
+		return -EINVAL;
+	}
+
+	ret = qm_wait_dev_not_ready(vf_qm);
+	if (ret) {
+		dev_err(dev, "VF device not ready!\n");
+		return -EBUSY;
+	}
+
+	return 0;
+}
+
+static int hisi_acc_vf_debug_cmd(struct seq_file *seq, void *data)
+{
+	struct device *vf_dev = seq->private;
+	struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
+	struct vfio_device *vdev = &core_device->vdev;
+	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
+	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
+	u64 value;
+	int ret;
+
+	mutex_lock(&hisi_acc_vdev->enable_mutex);
+	ret = hisi_acc_vf_debug_check(seq, vdev);
+	if (ret) {
+		mutex_unlock(&hisi_acc_vdev->enable_mutex);
+		return ret;
+	}
+
+	value = readl(vf_qm->io_base + QM_MB_CMD_SEND_BASE);
+	if (value == QM_MB_CMD_NOT_READY) {
+		mutex_unlock(&hisi_acc_vdev->enable_mutex);
+		dev_err(vf_dev, "mailbox cmd channel not ready!\n");
+		return -EINVAL;
+	}
+	mutex_unlock(&hisi_acc_vdev->enable_mutex);
+	dev_err("mailbox cmd channel state is OK!\n");
+
+	return 0;
+}
+
+static int hisi_acc_vf_dev_read(struct seq_file *seq, void *data)
+{
+	struct device *vf_dev = seq->private;
+	struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
+	struct vfio_device *vdev = &core_device->vdev;
+	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
+	size_t vf_data_sz = offsetofend(struct acc_vf_data, padding);
+	struct hisi_acc_vf_migration_file *migf = NULL;
+	int ret;
+
+	migf = kzalloc(sizeof(struct hisi_acc_vf_migration_file), GFP_KERNEL);
+	if (!migf)
+		return -ENOMEM;
+
+	mutex_lock(&hisi_acc_vdev->enable_mutex);
+	ret = hisi_acc_vf_debug_check(seq, vdev);
+	if (ret) {
+		mutex_unlock(&hisi_acc_vdev->enable_mutex);
+		goto migf_err;
+	}
+
+	migf->vf_data.vf_qm_state = hisi_acc_vdev->vf_qm_state;
+	ret = vf_qm_read_data(&hisi_acc_vdev->vf_qm, &migf->vf_data);
+	if (ret) {
+		mutex_unlock(&hisi_acc_vdev->enable_mutex);
+		dev_err(vf_dev, "failed to read device data!\n");
+		goto migf_err;
+	}
+	mutex_unlock(&hisi_acc_vdev->enable_mutex);
+
+	if (hisi_acc_vdev->resuming_migf)
+		migf->disabled = hisi_acc_vdev->resuming_migf->disabled;
+	else if (hisi_acc_vdev->saving_migf)
+		migf->disabled = hisi_acc_vdev->saving_migf->disabled;
+	else
+		migf->disabled = true;
+	migf->total_length = sizeof(struct acc_vf_data);
+
+	seq_hex_dump(seq, "Dev Data:", DUMP_PREFIX_OFFSET, 16, 1,
+			(unsigned char *)&migf->vf_data,
+			vf_data_sz, false);
+
+	seq_printf(seq,
+		 "acc device:\n"
+		 "device  ready: %u\n"
+		 "device  opened: %d\n"
+		 "data    valid: %d\n"
+		 "data     size: %lu\n",
+		 hisi_acc_vdev->vf_qm_state,
+		 hisi_acc_vdev->dev_opened,
+		 migf->disabled,
+		 migf->total_length);
+
+migf_err:
+	kfree(migf);
+
+	return ret;
+}
+
+static int hisi_acc_vf_migf_read(struct seq_file *seq, void *data)
+{
+	struct device *vf_dev = seq->private;
+	struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
+	struct vfio_device *vdev = &core_device->vdev;
+	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
+	size_t vf_data_sz = offsetofend(struct acc_vf_data, padding);
+	struct hisi_acc_vf_migration_file *debug_migf = hisi_acc_vdev->debug_migf;
+
+	/* Check whether the live migration operation has been performed */
+	if (debug_migf->total_length < vf_data_sz) {
+		dev_err(vf_dev, "device not migrated!\n");
+		return -EAGAIN;
+	}
+
+	seq_hex_dump(seq, "Mig Data:", DUMP_PREFIX_OFFSET, 16, 1,
+			(unsigned char *)&debug_migf->vf_data,
+			vf_data_sz, false);
+
+	seq_printf(seq,
+		 "acc device:\n"
+		 "device  ready: %u\n"
+		 "device  opened: %d\n"
+		 "data    valid: %d\n"
+		 "data     size: %lu\n",
+		 hisi_acc_vdev->vf_qm_state,
+		 hisi_acc_vdev->dev_opened,
+		 debug_migf->disabled,
+		 debug_migf->total_length);
+
+	return 0;
+}
+
+static int hisi_acc_vfio_debug_init(struct hisi_acc_vf_core_device *hisi_acc_vdev)
+{
+	struct vfio_device *vdev = &hisi_acc_vdev->core_device.vdev;
+	struct dentry *vfio_dev_migration = NULL;
+	struct dentry *vfio_hisi_acc = NULL;
+	struct device *dev = vdev->dev;
+	void *migf = NULL;
+
+	if (!debugfs_initialized() ||
+	    !IS_ENABLED(CONFIG_VFIO_DEBUGFS))
+		return 0;
+
+	migf = kzalloc(sizeof(struct hisi_acc_vf_migration_file), GFP_KERNEL);
+	if (!migf)
+		return -ENOMEM;
+	hisi_acc_vdev->debug_migf = migf;
+
+	vfio_dev_migration = debugfs_lookup("migration", vdev->debug_root);
+	if (!vfio_dev_migration) {
+		kfree(migf);
+		hisi_acc_vdev->debug_migf = NULL;
+		dev_err(dev, "failed to lookup migration debugfs file!\n");
+		return -ENODEV;
+	}
+
+	vfio_hisi_acc = debugfs_create_dir("hisi_acc", vfio_dev_migration);
+	debugfs_create_devm_seqfile(dev, "dev_data", vfio_hisi_acc,
+				  hisi_acc_vf_dev_read);
+	debugfs_create_devm_seqfile(dev, "migf_data", vfio_hisi_acc,
+				  hisi_acc_vf_migf_read);
+	debugfs_create_devm_seqfile(dev, "cmd_state", vfio_hisi_acc,
+				  hisi_acc_vf_debug_cmd);
+
+	return 0;
+}
+
+static void hisi_acc_vf_debugfs_exit(struct hisi_acc_vf_core_device *hisi_acc_vdev)
+{
+	if (!debugfs_initialized() ||
+	    !IS_ENABLED(CONFIG_VFIO_DEBUGFS))
+		return;
+
+	if (hisi_acc_vdev->debug_migf)
+		kfree(hisi_acc_vdev->debug_migf);
+}
+
 static int hisi_acc_vfio_pci_open_device(struct vfio_device *core_vdev)
 {
 	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(core_vdev);
@@ -1311,9 +1527,11 @@ static int hisi_acc_vfio_pci_open_device(struct vfio_device *core_vdev)
 			return ret;
 		}
 		hisi_acc_vdev->mig_state = VFIO_DEVICE_STATE_RUNNING;
+		hisi_acc_vdev->dev_opened = true;
 	}
 
 	vfio_pci_core_finish_enable(vdev);
+
 	return 0;
 }
 
@@ -1322,7 +1540,10 @@ static void hisi_acc_vfio_pci_close_device(struct vfio_device *core_vdev)
 	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(core_vdev);
 	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
 
+	hisi_acc_vdev->dev_opened = false;
+	mutex_lock(&hisi_acc_vdev->enable_mutex);
 	iounmap(vf_qm->io_base);
+	mutex_unlock(&hisi_acc_vdev->enable_mutex);
 	vfio_pci_core_close_device(core_vdev);
 }
 
@@ -1413,6 +1634,9 @@ static int hisi_acc_vfio_pci_probe(struct pci_dev *pdev, const struct pci_device
 	ret = vfio_pci_core_register_device(&hisi_acc_vdev->core_device);
 	if (ret)
 		goto out_put_vdev;
+
+	if (ops == &hisi_acc_vfio_pci_migrn_ops)
+		hisi_acc_vfio_debug_init(hisi_acc_vdev);
 	return 0;
 
 out_put_vdev:
@@ -1425,6 +1649,7 @@ static void hisi_acc_vfio_pci_remove(struct pci_dev *pdev)
 	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_drvdata(pdev);
 
 	vfio_pci_core_unregister_device(&hisi_acc_vdev->core_device);
+	hisi_acc_vf_debugfs_exit(hisi_acc_vdev);
 	vfio_put_device(&hisi_acc_vdev->core_device.vdev);
 }
 
diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h
index f887ab98581c..93ee8bef32a1 100644
--- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h
+++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h
@@ -32,6 +32,7 @@
 #define QM_SQC_VFT_BASE_MASK_V2		GENMASK(15, 0)
 #define QM_SQC_VFT_NUM_SHIFT_V2		45
 #define QM_SQC_VFT_NUM_MASK_V2		GENMASK(9, 0)
+#define QM_MB_CMD_NOT_READY	0xffffffff
 
 /* RW regs */
 #define QM_REGS_MAX_LEN		7
@@ -114,5 +115,11 @@ struct hisi_acc_vf_core_device {
 	int vf_id;
 	struct hisi_acc_vf_migration_file *resuming_migf;
 	struct hisi_acc_vf_migration_file *saving_migf;
+
+	/* To make sure the device is enabled */
+	struct mutex enable_mutex;
+	bool dev_opened;
+	/* To save migration data */
+	struct hisi_acc_vf_migration_file *debug_migf;
 };
 #endif /* HISI_ACC_VFIO_PCI_H */
-- 
2.24.0
Re: [PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by kernel test robot 1 year, 9 months ago
Hi Longfang,

kernel test robot noticed the following build errors:

[auto build test ERROR on awilliam-vfio/next]
[also build test ERROR on linus/master v6.9-rc5 next-20240424]
[cannot apply to awilliam-vfio/for-linus]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Longfang-Liu/hisi_acc_vfio_pci-extract-public-functions-for-container_of/20240424-170806
base:   https://github.com/awilliam/linux-vfio.git next
patch link:    https://lore.kernel.org/r/20240424085721.12760-5-liulongfang%40huawei.com
patch subject: [PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
config: loongarch-allyesconfig (https://download.01.org/0day-ci/archive/20240425/202404251733.qOuGkmpU-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240425/202404251733.qOuGkmpU-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202404251733.qOuGkmpU-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c: In function 'hisi_acc_vf_debug_cmd':
>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:53: error: macro "dev_err" requires 3 arguments, but only 1 given
    1370 |         dev_err("mailbox cmd channel state is OK!\n");
         |                                                     ^
   In file included from include/linux/device.h:15,
                    from drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:6:
   include/linux/dev_printk.h:143: note: macro "dev_err" defined here
     143 | #define dev_err(dev, fmt, ...) \
         | 
>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:9: error: 'dev_err' undeclared (first use in this function); did you mean '_dev_err'?
    1370 |         dev_err("mailbox cmd channel state is OK!\n");
         |         ^~~~~~~
         |         _dev_err
   drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:9: note: each undeclared identifier is reported only once for each function it appears in


vim +/dev_err +1370 drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c

  1345	
  1346	static int hisi_acc_vf_debug_cmd(struct seq_file *seq, void *data)
  1347	{
  1348		struct device *vf_dev = seq->private;
  1349		struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
  1350		struct vfio_device *vdev = &core_device->vdev;
  1351		struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
  1352		struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
  1353		u64 value;
  1354		int ret;
  1355	
  1356		mutex_lock(&hisi_acc_vdev->enable_mutex);
  1357		ret = hisi_acc_vf_debug_check(seq, vdev);
  1358		if (ret) {
  1359			mutex_unlock(&hisi_acc_vdev->enable_mutex);
  1360			return ret;
  1361		}
  1362	
  1363		value = readl(vf_qm->io_base + QM_MB_CMD_SEND_BASE);
  1364		if (value == QM_MB_CMD_NOT_READY) {
  1365			mutex_unlock(&hisi_acc_vdev->enable_mutex);
  1366			dev_err(vf_dev, "mailbox cmd channel not ready!\n");
  1367			return -EINVAL;
  1368		}
  1369		mutex_unlock(&hisi_acc_vdev->enable_mutex);
> 1370		dev_err("mailbox cmd channel state is OK!\n");
  1371	
  1372		return 0;
  1373	}
  1374	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by liulongfang 1 year, 9 months ago
On 2024/4/25 17:20, kernel test robot wrote:
> Hi Longfang,
> 
> kernel test robot noticed the following build errors:
> 
> [auto build test ERROR on awilliam-vfio/next]
> [also build test ERROR on linus/master v6.9-rc5 next-20240424]
> [cannot apply to awilliam-vfio/for-linus]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Longfang-Liu/hisi_acc_vfio_pci-extract-public-functions-for-container_of/20240424-170806
> base:   https://github.com/awilliam/linux-vfio.git next
> patch link:    https://lore.kernel.org/r/20240424085721.12760-5-liulongfang%40huawei.com
> patch subject: [PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
> config: loongarch-allyesconfig (https://download.01.org/0day-ci/archive/20240425/202404251733.qOuGkmpU-lkp@intel.com/config)
> compiler: loongarch64-linux-gcc (GCC) 13.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240425/202404251733.qOuGkmpU-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202404251733.qOuGkmpU-lkp@intel.com/
> 
> All errors (new ones prefixed by >>):
> 
>    drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c: In function 'hisi_acc_vf_debug_cmd':
>>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:53: error: macro "dev_err" requires 3 arguments, but only 1 given
>     1370 |         dev_err("mailbox cmd channel state is OK!\n");
>          |                                                     ^
>    In file included from include/linux/device.h:15,
>                     from drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:6:
>    include/linux/dev_printk.h:143: note: macro "dev_err" defined here
>      143 | #define dev_err(dev, fmt, ...) \
>          | 
>>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:9: error: 'dev_err' undeclared (first use in this function); did you mean '_dev_err'?
>     1370 |         dev_err("mailbox cmd channel state is OK!\n");
>          |         ^~~~~~~
>          |         _dev_err
>    drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:9: note: each undeclared identifier is reported only once for each function it appears in
> 
> 
> vim +/dev_err +1370 drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> 
>   1345	
>   1346	static int hisi_acc_vf_debug_cmd(struct seq_file *seq, void *data)
>   1347	{
>   1348		struct device *vf_dev = seq->private;
>   1349		struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
>   1350		struct vfio_device *vdev = &core_device->vdev;
>   1351		struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
>   1352		struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
>   1353		u64 value;
>   1354		int ret;
>   1355	
>   1356		mutex_lock(&hisi_acc_vdev->enable_mutex);
>   1357		ret = hisi_acc_vf_debug_check(seq, vdev);
>   1358		if (ret) {
>   1359			mutex_unlock(&hisi_acc_vdev->enable_mutex);
>   1360			return ret;
>   1361		}
>   1362	
>   1363		value = readl(vf_qm->io_base + QM_MB_CMD_SEND_BASE);
>   1364		if (value == QM_MB_CMD_NOT_READY) {
>   1365			mutex_unlock(&hisi_acc_vdev->enable_mutex);
>   1366			dev_err(vf_dev, "mailbox cmd channel not ready!\n");
>   1367			return -EINVAL;
>   1368		}
>   1369		mutex_unlock(&hisi_acc_vdev->enable_mutex);
>> 1370		dev_err("mailbox cmd channel state is OK!\n");
>   1371	
>   1372		return 0;
>   1373	}
>   1374	
>

OK,
I'll modify it soon.

Thanks.
Longfang.
Re: [PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by kernel test robot 1 year, 9 months ago
Hi Longfang,

kernel test robot noticed the following build errors:

[auto build test ERROR on awilliam-vfio/next]
[also build test ERROR on linus/master v6.9-rc5 next-20240424]
[cannot apply to awilliam-vfio/for-linus]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Longfang-Liu/hisi_acc_vfio_pci-extract-public-functions-for-container_of/20240424-170806
base:   https://github.com/awilliam/linux-vfio.git next
patch link:    https://lore.kernel.org/r/20240424085721.12760-5-liulongfang%40huawei.com
patch subject: [PATCH v5 4/5] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
config: riscv-allmodconfig (https://download.01.org/0day-ci/archive/20240425/202404250711.4mzD3Fe0-lkp@intel.com/config)
compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 5ef5eb66fb428aaf61fb51b709f065c069c11242)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240425/202404250711.4mzD3Fe0-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202404250711.4mzD3Fe0-lkp@intel.com/

All error/warnings (new ones prefixed by >>):

   In file included from drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:9:
   In file included from include/linux/hisi_acc_qm.h:10:
   In file included from include/linux/pci.h:38:
   In file included from include/linux/interrupt.h:21:
   In file included from arch/riscv/include/asm/sections.h:9:
   In file included from include/linux/mm.h:2208:
   include/linux/vmstat.h:508:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     508 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     509 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:515:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     515 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     516 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:522:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     522 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:527:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     527 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     528 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:536:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     536 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     537 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:46: error: too few arguments provided to function-like macro invocation
    1370 |         dev_err("mailbox cmd channel state is OK!\n");
         |                                                     ^
   include/linux/dev_printk.h:143:9: note: macro 'dev_err' defined here
     143 | #define dev_err(dev, fmt, ...) \
         |         ^
>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:2: error: use of undeclared identifier 'dev_err'; did you mean '_dev_err'?
    1370 |         dev_err("mailbox cmd channel state is OK!\n");
         |         ^~~~~~~
         |         _dev_err
   include/linux/dev_printk.h:50:6: note: '_dev_err' declared here
      50 | void _dev_err(const struct device *dev, const char *fmt, ...);
         |      ^
>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1370:2: warning: expression result unused [-Wunused-value]
    1370 |         dev_err("mailbox cmd channel state is OK!\n");
         |         ^~~~~~~
   6 warnings and 2 errors generated.


vim +1370 drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c

  1345	
  1346	static int hisi_acc_vf_debug_cmd(struct seq_file *seq, void *data)
  1347	{
  1348		struct device *vf_dev = seq->private;
  1349		struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
  1350		struct vfio_device *vdev = &core_device->vdev;
  1351		struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
  1352		struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
  1353		u64 value;
  1354		int ret;
  1355	
  1356		mutex_lock(&hisi_acc_vdev->enable_mutex);
  1357		ret = hisi_acc_vf_debug_check(seq, vdev);
  1358		if (ret) {
  1359			mutex_unlock(&hisi_acc_vdev->enable_mutex);
  1360			return ret;
  1361		}
  1362	
  1363		value = readl(vf_qm->io_base + QM_MB_CMD_SEND_BASE);
  1364		if (value == QM_MB_CMD_NOT_READY) {
  1365			mutex_unlock(&hisi_acc_vdev->enable_mutex);
  1366			dev_err(vf_dev, "mailbox cmd channel not ready!\n");
  1367			return -EINVAL;
  1368		}
  1369		mutex_unlock(&hisi_acc_vdev->enable_mutex);
> 1370		dev_err("mailbox cmd channel state is OK!\n");
  1371	
  1372		return 0;
  1373	}
  1374	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki