summaryrefslogtreecommitdiffstats
path: root/kernel/ioctl.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-13 22:17:09 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-13 22:17:09 -0400
commit9a7263fce4e3156349a526631805fce66b87fb1b (patch)
tree6278c1972754e6cb60f953a1af05a472f4efecea /kernel/ioctl.c
parentbfd269ee74d166be4f386640f8b5daad31d5d6ed (diff)
downloadopen-iov-9a7263fce4e3156349a526631805fce66b87fb1b.tar.gz
open-iov-9a7263fce4e3156349a526631805fce66b87fb1b.zip
Phase 5: Fix MDEV creation blocker - mdev parent registration & ioctl-based vGPU type registration
- Implemented nv_vgpu_mdev_register_parent() using mdev_register_parent() API with nv_vgpu_mdev_types array for proper mdev parent registration - Added ioctl NV_VGPU_IOCTL_REGISTER_VGPU_TYPE for userspace vGPU type registration - Created separate header nv-vgpu-vfio-interface-nvidia.h for nvidia.ko with only extern declarations to avoid duplicate symbol exports - Used KBUILD_EXTRA_SYMBOLS to provide only needed symbols (nvidia_vgpu_vfio_*) - Updated create_mdev.sh to use correct mdev type names (pci-nvidia-vgpu-*) - Updated load_vgpu_stack.sh to load open-iov-vfio.ko before nvidia.ko Result: 4 mdev types now show available_instances=8, mdev creation successful
Diffstat (limited to 'kernel/ioctl.c')
-rw-r--r--kernel/ioctl.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/kernel/ioctl.c b/kernel/ioctl.c
index 571b209..387a249 100644
--- a/kernel/ioctl.c
+++ b/kernel/ioctl.c
@@ -10,6 +10,12 @@
#include "irq.h"
#include "migration.h"
+/* Forward declarations from main.c */
+extern int nv_vgpu_register_type_info(struct nv_vgpu_type_info *info);
+extern int nv_vgpu_create_mdev_types(void);
+extern void nv_vgpu_free_type_info(void);
+extern struct mdev_driver nv_vgpu_mdev_driver;
+
int nv_vgpu_ioctl_get_info(struct nv_vgpu_device *vgpu, void __user *arg)
{
struct nv_vgpu_ioctl_get_info info;
@@ -260,4 +266,42 @@ int nv_vgpu_ioctl_migrate_restore(struct nv_vgpu_device *vgpu, void __user *arg)
return -EFAULT;
return ret;
+}
+
+int nv_vgpu_ioctl_register_vgpu_type(void __user *arg)
+{
+ struct nv_vgpu_ioctl_register_vgpu_type params;
+ struct nv_vgpu_type_info info;
+ int ret;
+
+ if (copy_from_user(&params, arg, sizeof(params)))
+ return -EFAULT;
+
+ memset(&info, 0, sizeof(info));
+ strncpy(info.name, params.name, sizeof(info.name) - 1);
+ strncpy(info.description, params.description, sizeof(info.description) - 1);
+ info.vdev_id = params.vdev_id;
+ info.pdev_id = params.pdev_id;
+ info.max_instances = params.max_instances;
+
+ ret = nv_vgpu_register_type_info(&info);
+ if (ret)
+ return ret;
+
+ /* Re-create mdev types with updated info */
+ nv_vgpu_free_type_info();
+ ret = nv_vgpu_create_mdev_types();
+ if (ret)
+ return ret;
+
+ /* Re-register mdev driver with new types */
+ mdev_unregister_driver(&nv_vgpu_mdev_driver);
+ ret = mdev_register_driver(&nv_vgpu_mdev_driver);
+ if (ret) {
+ pr_err("Failed to re-register mdev driver: %d\n", ret);
+ return ret;
+ }
+
+ pr_info("vGPU type '%s' registered via ioctl\n", info.name);
+ return 0;
} \ No newline at end of file