Separating the objects into different file descriptors sounds like a
good idea, but reusing an open dentry/inode with a new file and different
file operations is a rather unusual way to do it.
Your concept of allocating
a new context on each open is already weird, but there have been other
examples of that before.
I'd suggest going to a syscall-based model with your own file system right
away, even if you don't use the spufs approach but something in the middle:
* You do a trivial nonmountable new file system with anonymous objects,
similar to eventpollfs, and hand out file descriptors to inodes in it,
for both the kvm and the vcpu objects.
* You replace the syscall you'd normally use to hand out a new kvm instance
with an ioctl on /dev/kvm, and don't allow any other operations on that
device.
This would be a much more consistant object model, compared with other
generic kernel functionality that is not bound to an actual device.
You still have all the flexibility of a loadable module without core
kernel changes for the development phase, and can easily switch to real
syscalls when merging it into mainline.