diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-09-13 22:17:09 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-09-13 22:17:09 -0400 |
| commit | 9a7263fce4e3156349a526631805fce66b87fb1b (patch) | |
| tree | 6278c1972754e6cb60f953a1af05a472f4efecea /kernel/ioctl.c | |
| parent | bfd269ee74d166be4f386640f8b5daad31d5d6ed (diff) | |
| download | open-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.c | 44 |
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(¶ms, 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 |
