[PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver

Longfang Liu posted 4 patches 1 year, 3 months ago
There is a newer version of this series
[PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by Longfang Liu 1 year, 3 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_migf |       | 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 most recent status data
of the device through the "dev_data" file. It can read recent
complete status data of the device. If the current device is being
migrated, it will wait for it to complete.
The data for the last completed migration function will be stored
in debug_migf. Users can read it via "migf_data".

Signed-off-by: Longfang Liu <liulongfang@huawei.com>
Reviewed-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
---
 .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c    | 191 ++++++++++++++++++
 .../vfio/pci/hisilicon/hisi_acc_vfio_pci.h    |  18 ++
 2 files changed, 209 insertions(+)

diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
index a8c53952d82e..da8784f2801e 100644
--- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
+++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
@@ -627,15 +627,31 @@ 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;
+
+	dst_migf->total_length = src_migf->total_length;
+	memcpy(&dst_migf->vf_data, &src_migf->vf_data,
+	       sizeof(struct acc_vf_data));
+}
+
 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;
@@ -1294,6 +1310,129 @@ 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;
+	int ret;
+
+	lockdep_assert_held(&hisi_acc_vdev->open_mutex);
+	/*
+	 * 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) {
+		seq_puts(seq, "device not opened!\n");
+		return -EINVAL;
+	}
+
+	ret = qm_wait_dev_not_ready(vf_qm);
+	if (ret) {
+		seq_puts(seq, "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->open_mutex);
+	ret = hisi_acc_vf_debug_check(seq, vdev);
+	if (ret) {
+		mutex_unlock(&hisi_acc_vdev->open_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->open_mutex);
+		seq_puts(seq, "mailbox cmd channel not ready!\n");
+		return -EINVAL;
+	}
+	mutex_unlock(&hisi_acc_vdev->open_mutex);
+	seq_puts(seq, "mailbox cmd channel ready!\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 acc_vf_data *vf_data;
+	int ret;
+
+	mutex_lock(&hisi_acc_vdev->open_mutex);
+	ret = hisi_acc_vf_debug_check(seq, vdev);
+	if (ret) {
+		mutex_unlock(&hisi_acc_vdev->open_mutex);
+		return ret;
+	}
+
+	mutex_lock(&hisi_acc_vdev->state_mutex);
+	vf_data = kzalloc(sizeof(*vf_data), GFP_KERNEL);
+	if (!vf_data) {
+		ret = -ENOMEM;
+		goto mutex_release;
+	}
+
+	vf_data->vf_qm_state = hisi_acc_vdev->vf_qm_state;
+	ret = vf_qm_read_data(&hisi_acc_vdev->vf_qm, vf_data);
+	if (ret)
+		goto migf_err;
+
+	seq_hex_dump(seq, "Dev Data:", DUMP_PREFIX_OFFSET, 16, 1,
+		     (const void *)vf_data, vf_data_sz, false);
+
+	seq_puts(seq,
+		 "guest driver load: %u\n"
+		 "data size: %lu\n",
+		 hisi_acc_vdev->vf_qm_state,
+		 sizeof(struct acc_vf_data));
+
+migf_err:
+	kfree(vf_data);
+mutex_release:
+	mutex_unlock(&hisi_acc_vdev->state_mutex);
+	mutex_unlock(&hisi_acc_vdev->open_mutex);
+
+	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 < QM_MATCH_SIZE) {
+		seq_puts(seq, "device not migrated!\n");
+		return -EAGAIN;
+	}
+
+	seq_hex_dump(seq, "Mig Data:", DUMP_PREFIX_OFFSET, 16, 1,
+		     (const void *)&debug_migf->vf_data, vf_data_sz, false);
+	seq_puts(seq, "migrate data length: %lu\n", debug_migf->total_length);
+
+	return 0;
+}
+
 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);
@@ -1305,12 +1444,16 @@ static int hisi_acc_vfio_pci_open_device(struct vfio_device *core_vdev)
 		return ret;
 
 	if (core_vdev->mig_ops) {
+		mutex_lock(&hisi_acc_vdev->open_mutex);
 		ret = hisi_acc_vf_qm_init(hisi_acc_vdev);
 		if (ret) {
+			mutex_unlock(&hisi_acc_vdev->open_mutex);
 			vfio_pci_core_disable(vdev);
 			return ret;
 		}
 		hisi_acc_vdev->mig_state = VFIO_DEVICE_STATE_RUNNING;
+		hisi_acc_vdev->dev_opened = true;
+		mutex_unlock(&hisi_acc_vdev->open_mutex);
 	}
 
 	vfio_pci_core_finish_enable(vdev);
@@ -1322,7 +1465,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;
 
+	mutex_lock(&hisi_acc_vdev->open_mutex);
+	hisi_acc_vdev->dev_opened = false;
 	iounmap(vf_qm->io_base);
+	mutex_unlock(&hisi_acc_vdev->open_mutex);
 	vfio_pci_core_close_device(core_vdev);
 }
 
@@ -1342,6 +1488,7 @@ static int hisi_acc_vfio_pci_migrn_init_dev(struct vfio_device *core_vdev)
 	hisi_acc_vdev->pf_qm = pf_qm;
 	hisi_acc_vdev->vf_dev = pdev;
 	mutex_init(&hisi_acc_vdev->state_mutex);
+	mutex_init(&hisi_acc_vdev->open_mutex);
 
 	core_vdev->migration_flags = VFIO_MIGRATION_STOP_COPY | VFIO_MIGRATION_PRE_COPY;
 	core_vdev->mig_ops = &hisi_acc_vfio_pci_migrn_state_ops;
@@ -1387,6 +1534,47 @@ static const struct vfio_device_ops hisi_acc_vfio_pci_ops = {
 	.detach_ioas = vfio_iommufd_physical_detach_ioas,
 };
 
+static void 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;
+
+	if (vdev->ops != &hisi_acc_vfio_pci_migrn_ops)
+		return;
+
+	vfio_dev_migration = debugfs_lookup("migration", vdev->debug_root);
+	if (!vfio_dev_migration) {
+		dev_err(dev, "failed to lookup migration debugfs file!\n");
+		return;
+	}
+
+	migf = kzalloc(sizeof(*migf), GFP_KERNEL);
+	if (!migf)
+		return;
+	hisi_acc_vdev->debug_migf = migf;
+
+	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);
+}
+
+static void hisi_acc_vf_debugfs_exit(struct hisi_acc_vf_core_device *hisi_acc_vdev)
+{
+	kfree(hisi_acc_vdev->debug_migf);
+	hisi_acc_vdev->debug_migf = NULL;
+}
+
 static int hisi_acc_vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
 	struct hisi_acc_vf_core_device *hisi_acc_vdev;
@@ -1413,6 +1601,8 @@ 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;
+
+	hisi_acc_vfio_debug_init(hisi_acc_vdev);
 	return 0;
 
 out_put_vdev:
@@ -1425,6 +1615,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 5bab46602fad..b297b4b44526 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
@@ -99,6 +100,12 @@ struct hisi_acc_vf_migration_file {
 struct hisi_acc_vf_core_device {
 	struct vfio_pci_core_device core_device;
 	u8 match_done;
+	/*
+	 * io_base is only valid when dev_opened is true,
+	 * which is protected by open_mutex.
+	 */
+	bool dev_opened;
+	struct mutex open_mutex;
 
 	/* For migration state */
 	struct mutex state_mutex;
@@ -107,9 +114,20 @@ struct hisi_acc_vf_core_device {
 	struct pci_dev *vf_dev;
 	struct hisi_qm *pf_qm;
 	struct hisi_qm vf_qm;
+	/*
+	 * vf_qm_state represents the QM_VF_STATE register value.
+	 * It is set by Guest driver for the ACC VF dev indicating
+	 * the driver has loaded and configured the dev correctly.
+	 */
 	u32 vf_qm_state;
 	int vf_id;
 	struct hisi_acc_vf_migration_file *resuming_migf;
 	struct hisi_acc_vf_migration_file *saving_migf;
+
+	/*
+	 * It holds migration data corresponding to the last migration
+	 * and is used by the debugfs interface to report it.
+	 */
+	struct hisi_acc_vf_migration_file *debug_migf;
 };
 #endif /* HISI_ACC_VFIO_PCI_H */
-- 
2.24.0
Re: [PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by kernel test robot 1 year, 3 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 awilliam-vfio/for-linus linus/master v6.12-rc6 next-20241106]
[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/20241106-182913
base:   https://github.com/awilliam/linux-vfio.git next
patch link:    https://lore.kernel.org/r/20241106100343.21593-4-liulongfang%40huawei.com
patch subject: [PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20241107/202411070400.I8XzogJF-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241107/202411070400.I8XzogJF-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/202411070400.I8XzogJF-lkp@intel.com/

All errors (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:1650:
   In file included from include/linux/dmapool.h:14:
   In file included from include/linux/scatterlist.h:8:
   In file included from include/linux/mm.h:2213:
   include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     504 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     505 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     511 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     512 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     518 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     524 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     525 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1400:4: error: too many arguments to function call, expected 2, have 4
    1397 |         seq_puts(seq,
         |         ~~~~~~~~
    1398 |                  "guest driver load: %u\n"
    1399 |                  "data size: %lu\n",
    1400 |                  hisi_acc_vdev->vf_qm_state,
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
    1401 |                  sizeof(struct acc_vf_data));
         |                  ~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/seq_file.h:122:29: note: 'seq_puts' declared here
     122 | static __always_inline void seq_puts(struct seq_file *m, const char *s)
         |                             ^        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1429:46: error: too many arguments to function call, expected 2, have 3
    1429 |         seq_puts(seq, "migrate data length: %lu\n", debug_migf->total_length);
         |         ~~~~~~~~                                    ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/seq_file.h:122:29: note: 'seq_puts' declared here
     122 | static __always_inline void seq_puts(struct seq_file *m, const char *s)
         |                             ^        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   4 warnings and 2 errors generated.


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

  1364	
  1365	static int hisi_acc_vf_dev_read(struct seq_file *seq, void *data)
  1366	{
  1367		struct device *vf_dev = seq->private;
  1368		struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
  1369		struct vfio_device *vdev = &core_device->vdev;
  1370		struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
  1371		size_t vf_data_sz = offsetofend(struct acc_vf_data, padding);
  1372		struct acc_vf_data *vf_data;
  1373		int ret;
  1374	
  1375		mutex_lock(&hisi_acc_vdev->open_mutex);
  1376		ret = hisi_acc_vf_debug_check(seq, vdev);
  1377		if (ret) {
  1378			mutex_unlock(&hisi_acc_vdev->open_mutex);
  1379			return ret;
  1380		}
  1381	
  1382		mutex_lock(&hisi_acc_vdev->state_mutex);
  1383		vf_data = kzalloc(sizeof(*vf_data), GFP_KERNEL);
  1384		if (!vf_data) {
  1385			ret = -ENOMEM;
  1386			goto mutex_release;
  1387		}
  1388	
  1389		vf_data->vf_qm_state = hisi_acc_vdev->vf_qm_state;
  1390		ret = vf_qm_read_data(&hisi_acc_vdev->vf_qm, vf_data);
  1391		if (ret)
  1392			goto migf_err;
  1393	
  1394		seq_hex_dump(seq, "Dev Data:", DUMP_PREFIX_OFFSET, 16, 1,
  1395			     (const void *)vf_data, vf_data_sz, false);
  1396	
  1397		seq_puts(seq,
  1398			 "guest driver load: %u\n"
  1399			 "data size: %lu\n",
> 1400			 hisi_acc_vdev->vf_qm_state,
  1401			 sizeof(struct acc_vf_data));
  1402	
  1403	migf_err:
  1404		kfree(vf_data);
  1405	mutex_release:
  1406		mutex_unlock(&hisi_acc_vdev->state_mutex);
  1407		mutex_unlock(&hisi_acc_vdev->open_mutex);
  1408	
  1409		return ret;
  1410	}
  1411	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by kernel test robot 1 year, 3 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 awilliam-vfio/for-linus linus/master v6.12-rc6 next-20241106]
[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/20241106-182913
base:   https://github.com/awilliam/linux-vfio.git next
patch link:    https://lore.kernel.org/r/20241106100343.21593-4-liulongfang%40huawei.com
patch subject: [PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
config: loongarch-allmodconfig (https://download.01.org/0day-ci/archive/20241107/202411070027.p1xVCxxs-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241107/202411070027.p1xVCxxs-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/202411070027.p1xVCxxs-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c: In function 'hisi_acc_vf_dev_read':
>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1397:9: error: too many arguments to function 'seq_puts'
    1397 |         seq_puts(seq,
         |         ^~~~~~~~
   In file included from include/linux/debugfs.h:16,
                    from include/linux/hisi_acc_qm.h:7,
                    from drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:9:
   include/linux/seq_file.h:122:29: note: declared here
     122 | static __always_inline void seq_puts(struct seq_file *m, const char *s)
         |                             ^~~~~~~~
   drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c: In function 'hisi_acc_vf_migf_read':
   drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1429:9: error: too many arguments to function 'seq_puts'
    1429 |         seq_puts(seq, "migrate data length: %lu\n", debug_migf->total_length);
         |         ^~~~~~~~
   include/linux/seq_file.h:122:29: note: declared here
     122 | static __always_inline void seq_puts(struct seq_file *m, const char *s)
         |                             ^~~~~~~~


vim +/seq_puts +1397 drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c

  1364	
  1365	static int hisi_acc_vf_dev_read(struct seq_file *seq, void *data)
  1366	{
  1367		struct device *vf_dev = seq->private;
  1368		struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
  1369		struct vfio_device *vdev = &core_device->vdev;
  1370		struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
  1371		size_t vf_data_sz = offsetofend(struct acc_vf_data, padding);
  1372		struct acc_vf_data *vf_data;
  1373		int ret;
  1374	
  1375		mutex_lock(&hisi_acc_vdev->open_mutex);
  1376		ret = hisi_acc_vf_debug_check(seq, vdev);
  1377		if (ret) {
  1378			mutex_unlock(&hisi_acc_vdev->open_mutex);
  1379			return ret;
  1380		}
  1381	
  1382		mutex_lock(&hisi_acc_vdev->state_mutex);
  1383		vf_data = kzalloc(sizeof(*vf_data), GFP_KERNEL);
  1384		if (!vf_data) {
  1385			ret = -ENOMEM;
  1386			goto mutex_release;
  1387		}
  1388	
  1389		vf_data->vf_qm_state = hisi_acc_vdev->vf_qm_state;
  1390		ret = vf_qm_read_data(&hisi_acc_vdev->vf_qm, vf_data);
  1391		if (ret)
  1392			goto migf_err;
  1393	
  1394		seq_hex_dump(seq, "Dev Data:", DUMP_PREFIX_OFFSET, 16, 1,
  1395			     (const void *)vf_data, vf_data_sz, false);
  1396	
> 1397		seq_puts(seq,
  1398			 "guest driver load: %u\n"
  1399			 "data size: %lu\n",
  1400			 hisi_acc_vdev->vf_qm_state,
  1401			 sizeof(struct acc_vf_data));
  1402	
  1403	migf_err:
  1404		kfree(vf_data);
  1405	mutex_release:
  1406		mutex_unlock(&hisi_acc_vdev->state_mutex);
  1407		mutex_unlock(&hisi_acc_vdev->open_mutex);
  1408	
  1409		return ret;
  1410	}
  1411	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
Posted by liulongfang 1 year, 3 months ago
On 2024/11/7 0:50, 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 awilliam-vfio/for-linus linus/master v6.12-rc6 next-20241106]
> [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/20241106-182913
> base:   https://github.com/awilliam/linux-vfio.git next
> patch link:    https://lore.kernel.org/r/20241106100343.21593-4-liulongfang%40huawei.com
> patch subject: [PATCH v13 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver
> config: loongarch-allmodconfig (https://download.01.org/0day-ci/archive/20241107/202411070027.p1xVCxxs-lkp@intel.com/config)
> compiler: loongarch64-linux-gcc (GCC) 14.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241107/202411070027.p1xVCxxs-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/202411070027.p1xVCxxs-lkp@intel.com/
> 
> All errors (new ones prefixed by >>):
> 
>    drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c: In function 'hisi_acc_vf_dev_read':
>>> drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1397:9: error: too many arguments to function 'seq_puts'
>     1397 |         seq_puts(seq,
>          |         ^~~~~~~~
>    In file included from include/linux/debugfs.h:16,
>                     from include/linux/hisi_acc_qm.h:7,
>                     from drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:9:
>    include/linux/seq_file.h:122:29: note: declared here
>      122 | static __always_inline void seq_puts(struct seq_file *m, const char *s)
>          |                             ^~~~~~~~
>    drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c: In function 'hisi_acc_vf_migf_read':
>    drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c:1429:9: error: too many arguments to function 'seq_puts'
>     1429 |         seq_puts(seq, "migrate data length: %lu\n", debug_migf->total_length);
>          |         ^~~~~~~~
>    include/linux/seq_file.h:122:29: note: declared here
>      122 | static __always_inline void seq_puts(struct seq_file *m, const char *s)
>          |                             ^~~~~~~~
> 
> 
> vim +/seq_puts +1397 drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> 
>   1364	
>   1365	static int hisi_acc_vf_dev_read(struct seq_file *seq, void *data)
>   1366	{
>   1367		struct device *vf_dev = seq->private;
>   1368		struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
>   1369		struct vfio_device *vdev = &core_device->vdev;
>   1370		struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
>   1371		size_t vf_data_sz = offsetofend(struct acc_vf_data, padding);
>   1372		struct acc_vf_data *vf_data;
>   1373		int ret;
>   1374	
>   1375		mutex_lock(&hisi_acc_vdev->open_mutex);
>   1376		ret = hisi_acc_vf_debug_check(seq, vdev);
>   1377		if (ret) {
>   1378			mutex_unlock(&hisi_acc_vdev->open_mutex);
>   1379			return ret;
>   1380		}
>   1381	
>   1382		mutex_lock(&hisi_acc_vdev->state_mutex);
>   1383		vf_data = kzalloc(sizeof(*vf_data), GFP_KERNEL);
>   1384		if (!vf_data) {
>   1385			ret = -ENOMEM;
>   1386			goto mutex_release;
>   1387		}
>   1388	
>   1389		vf_data->vf_qm_state = hisi_acc_vdev->vf_qm_state;
>   1390		ret = vf_qm_read_data(&hisi_acc_vdev->vf_qm, vf_data);
>   1391		if (ret)
>   1392			goto migf_err;
>   1393	
>   1394		seq_hex_dump(seq, "Dev Data:", DUMP_PREFIX_OFFSET, 16, 1,
>   1395			     (const void *)vf_data, vf_data_sz, false);
>   1396	
>> 1397		seq_puts(seq,
>   1398			 "guest driver load: %u\n"
>   1399			 "data size: %lu\n",
>   1400			 hisi_acc_vdev->vf_qm_state,
>   1401			 sizeof(struct acc_vf_data));
>   1402	
>   1403	migf_err:
>   1404		kfree(vf_data);
>   1405	mutex_release:
>   1406		mutex_unlock(&hisi_acc_vdev->state_mutex);
>   1407		mutex_unlock(&hisi_acc_vdev->open_mutex);
>   1408	
>   1409		return ret;
>   1410	}
>   1411	
> 
OK, I will fix it using seq_printf() in the next version

Thanks,
Longfang.