92 lines · 2.0 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-only/* * Copyright (c) 2023, HiSilicon Ltd. */ #include <linux/device.h>#include <linux/debugfs.h>#include <linux/seq_file.h>#include <linux/vfio.h>#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; 	BUILD_BUG_ON(VFIO_DEVICE_STATE_NR !=		     VFIO_DEVICE_STATE_PRE_COPY_P2P + 1); 	ret = vdev->mig_ops->migration_get_state(vdev, &state);	if (ret)		return -EINVAL; 	switch (state) {	case VFIO_DEVICE_STATE_ERROR:		seq_puts(seq, "ERROR\n");		break;	case VFIO_DEVICE_STATE_STOP:		seq_puts(seq, "STOP\n");		break;	case VFIO_DEVICE_STATE_RUNNING:		seq_puts(seq, "RUNNING\n");		break;	case VFIO_DEVICE_STATE_STOP_COPY:		seq_puts(seq, "STOP_COPY\n");		break;	case VFIO_DEVICE_STATE_RESUMING:		seq_puts(seq, "RESUMING\n");		break;	case VFIO_DEVICE_STATE_RUNNING_P2P:		seq_puts(seq, "RUNNING_P2P\n");		break;	case VFIO_DEVICE_STATE_PRE_COPY:		seq_puts(seq, "PRE_COPY\n");		break;	case VFIO_DEVICE_STATE_PRE_COPY_P2P:		seq_puts(seq, "PRE_COPY_P2P\n");		break;	default:		seq_puts(seq, "Invalid\n");	} 	return 0;} void vfio_device_debugfs_init(struct vfio_device *vdev){	struct device *dev = &vdev->device; 	vdev->debug_root = debugfs_create_dir(dev_name(vdev->dev),					      vfio_debugfs_root); 	if (vdev->mig_ops) {		struct dentry *vfio_dev_migration = NULL; 		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;}