diff --git a/drivers/gpu/drm/panthor-rs/file.rs b/drivers/gpu/drm/panthor-rs/file.rs
index 08aa207dad5ef99ce786b077dd46516775601909..2f2486f86e160d4a3d0d60f9a2de793a4398aeac 100644
--- a/drivers/gpu/drm/panthor-rs/file.rs
+++ b/drivers/gpu/drm/panthor-rs/file.rs
@@ -28,15 +28,27 @@ use core::ffi;
 pub(crate) type DrmFile = drm::file::File<File>;
 
 /// State associated with a client.
-pub(crate) struct File();
+#[repr(C)]
+pub(crate) struct File {
+    ptdev: *mut bindings::panthor_device,
+    // TODO make these embedded structs?
+    vms: *mut bindings::panthor_vm_pool,
+    groups: *mut bindings::panthor_group_pool,
+}
 
 impl drm::file::DriverFile for File {
     type Driver = PanthorDriver;
 
-    fn open(_dev: &DrmDevice<Self::Driver>) -> Result<Pin<Box<Self>>> {
+    fn open(dev: &DrmDevice<Self::Driver>) -> Result<Pin<Box<Self>>> {
+        let ptdev = dev.data().ptdev;
         pr_info!("DRM Device :: open()\n");
 
-        Ok(Box::into_pin(Box::new(Self(), GFP_KERNEL)?))
+        // TODO allocation error handling
+        Ok(Box::into_pin(Box::new(Self {
+            ptdev,
+            vms: unsafe { bindings::panthor_vm_pool_create() },
+            groups: unsafe { bindings::panthor_group_pool_create() }
+        }, GFP_KERNEL)?))
     }
 }
 
diff --git a/drivers/gpu/drm/panthor-rs/panthor_drv.c b/drivers/gpu/drm/panthor-rs/panthor_drv.c
index 1df2fb94f12eeb5b4c13de6dd835cb2cf55fba00..47ebc714288ac05bf23b2cc6a45d5d567d079d6e 100644
--- a/drivers/gpu/drm/panthor-rs/panthor_drv.c
+++ b/drivers/gpu/drm/panthor-rs/panthor_drv.c
@@ -1241,46 +1241,6 @@ static int panthor_ioctl_vm_get_state(struct drm_device *ddev, void *data,
 	return 0;
 }
 
-static int
-panthor_open(struct drm_device *ddev, struct drm_file *file)
-{
-	struct panthor_device *ptdev = container_of(ddev, struct panthor_device, base);
-	struct panthor_file *pfile;
-	int ret;
-
-	if (!try_module_get(THIS_MODULE))
-		return -EINVAL;
-
-	pfile = kzalloc(sizeof(*pfile), GFP_KERNEL);
-	if (!pfile) {
-		ret = -ENOMEM;
-		goto err_put_mod;
-	}
-
-	pfile->ptdev = ptdev;
-
-	ret = panthor_vm_pool_create(pfile);
-	if (ret)
-		goto err_free_file;
-
-	ret = panthor_group_pool_create(pfile);
-	if (ret)
-		goto err_destroy_vm_pool;
-
-	file->driver_priv = pfile;
-	return 0;
-
-err_destroy_vm_pool:
-	panthor_vm_pool_destroy(pfile);
-
-err_free_file:
-	kfree(pfile);
-
-err_put_mod:
-	module_put(THIS_MODULE);
-	return ret;
-}
-
 static void
 panthor_postclose(struct drm_device *ddev, struct drm_file *file)
 {
diff --git a/drivers/gpu/drm/panthor-rs/panthor_mmu.c b/drivers/gpu/drm/panthor-rs/panthor_mmu.c
index b38a540840abc9ebdad7da77f39d3f3aa4dec008..ead0f943b3cf980b29d960ac19cad3da8c89f837 100644
--- a/drivers/gpu/drm/panthor-rs/panthor_mmu.c
+++ b/drivers/gpu/drm/panthor-rs/panthor_mmu.c
@@ -1583,14 +1583,14 @@ void panthor_vm_pool_destroy(struct panthor_file *pfile)
  *
  * Return: 0 on success, a negative error code otherwise.
  */
-int panthor_vm_pool_create(struct panthor_file *pfile)
+struct panthor_vm_pool *panthor_vm_pool_create(void)
 {
-	pfile->vms = kzalloc(sizeof(*pfile->vms), GFP_KERNEL);
-	if (!pfile->vms)
-		return -ENOMEM;
+	struct panthor_vm_pool *vms = kzalloc(sizeof(*vms), GFP_KERNEL);
+	if (!vms)
+		return NULL;
 
-	xa_init_flags(&pfile->vms->xa, XA_FLAGS_ALLOC1);
-	return 0;
+	xa_init_flags(&vms->xa, XA_FLAGS_ALLOC1);
+	return vms;
 }
 
 /* dummy TLB ops, the real TLB flush happens in panthor_vm_flush_range() */
diff --git a/drivers/gpu/drm/panthor-rs/panthor_mmu.h b/drivers/gpu/drm/panthor-rs/panthor_mmu.h
index e08da9e6a42c7df937ae79bdb397646df1c3738a..97b2dc16e2d544a464c7ba95aad35d45a26ec34f 100644
--- a/drivers/gpu/drm/panthor-rs/panthor_mmu.h
+++ b/drivers/gpu/drm/panthor-rs/panthor_mmu.h
@@ -54,7 +54,7 @@ struct dma_resv *panthor_vm_resv(struct panthor_vm *vm);
 struct drm_gem_object *panthor_vm_root_gem(struct panthor_vm *vm);
 
 void panthor_vm_pool_destroy(struct panthor_file *pfile);
-int panthor_vm_pool_create(struct panthor_file *pfile);
+struct panthor_vm_pool *panthor_vm_pool_create(void);
 int panthor_vm_pool_create_vm(struct panthor_device *ptdev,
 			      struct panthor_vm_pool *pool,
 			      struct drm_panthor_vm_create *args);
diff --git a/drivers/gpu/drm/panthor-rs/panthor_sched.c b/drivers/gpu/drm/panthor-rs/panthor_sched.c
index 6ee2d0b2b07448ac8f76a7d96091e0ab355bdb47..63b61d74909ab1ef1de66874a13e6c88694c3b9f 100644
--- a/drivers/gpu/drm/panthor-rs/panthor_sched.c
+++ b/drivers/gpu/drm/panthor-rs/panthor_sched.c
@@ -3254,17 +3254,16 @@ int panthor_group_get_state(struct panthor_file *pfile,
 	return 0;
 }
 
-int panthor_group_pool_create(struct panthor_file *pfile)
+struct panthor_group_pool *panthor_group_pool_create(void)
 {
 	struct panthor_group_pool *gpool;
 
 	gpool = kzalloc(sizeof(*gpool), GFP_KERNEL);
 	if (!gpool)
-		return -ENOMEM;
+		return NULL;
 
 	xa_init_flags(&gpool->xa, XA_FLAGS_ALLOC1);
-	pfile->groups = gpool;
-	return 0;
+	return gpool;
 }
 
 void panthor_group_pool_destroy(struct panthor_file *pfile)
diff --git a/drivers/gpu/drm/panthor-rs/panthor_sched.h b/drivers/gpu/drm/panthor-rs/panthor_sched.h
index 3a30d2328b308df6eb5bf6204b07fa2ec33d8539..ec804894b39821b720b1ca649ab75c3b5390607d 100644
--- a/drivers/gpu/drm/panthor-rs/panthor_sched.h
+++ b/drivers/gpu/drm/panthor-rs/panthor_sched.h
@@ -34,7 +34,7 @@ struct panthor_vm *panthor_job_vm(struct drm_sched_job *sched_job);
 void panthor_job_put(struct drm_sched_job *job);
 void panthor_job_update_resvs(struct drm_exec *exec, struct drm_sched_job *job);
 
-int panthor_group_pool_create(struct panthor_file *pfile);
+struct panthor_group_pool *panthor_group_pool_create(void);
 void panthor_group_pool_destroy(struct panthor_file *pfile);
 
 int panthor_sched_init(struct panthor_device *ptdev);