Thread (153 messages) 153 messages, 23 authors, 2023-05-23

Re: [PATCH v10 3/9] KVM: Extend the memslot to support fd-based private memory

From: Sean Christopherson <seanjc@google.com>
Date: 2023-01-13 22:37:52
Also in: kvm, linux-arch, linux-doc, linux-fsdevel, linux-mm, lkml, qemu-devel

On Tue, Jan 10, 2023, Chao Peng wrote:
On Mon, Jan 09, 2023 at 07:32:05PM +0000, Sean Christopherson wrote:
quoted
On Fri, Jan 06, 2023, Chao Peng wrote:
quoted
On Thu, Jan 05, 2023 at 11:23:01AM +0000, Jarkko Sakkinen wrote:
quoted
On Fri, Dec 02, 2022 at 02:13:41PM +0800, Chao Peng wrote:
quoted
To make future maintenance easy, internally use a binary compatible
alias struct kvm_user_mem_region to handle both the normal and the
'_ext' variants.
Feels bit hacky IMHO, and more like a completely new feature than
an extension.

Why not just add a new ioctl? The commit message does not address
the most essential design here.
Yes, people can always choose to add a new ioctl for this kind of change
and the balance point here is we want to also avoid 'too many ioctls' if
the functionalities are similar.  The '_ext' variant reuses all the
existing fields in the 'normal' variant and most importantly KVM
internally can reuse most of the code. I certainly can add some words in
the commit message to explain this design choice.
After seeing the userspace side of this, I agree with Jarkko; overloading
KVM_SET_USER_MEMORY_REGION is a hack.  E.g. the size validation ends up being
bogus, and userspace ends up abusing unions or implementing kvm_user_mem_region
itself.
How is the size validation being bogus? I don't quite follow.
The ioctl() magic embeds the size of the payload (struct kvm_userspace_memory_region
in this case) in the ioctl() number, and that information is visible to userspace
via _IOCTL_SIZE().  Attempting to take a larger size can mess up sanity checks,
e.g. KVM selftests get tripped up on this assert if KVM_SET_USER_MEMORY_REGION is
passed an "extended" struct.

	#define kvm_do_ioctl(fd, cmd, arg)						\
	({										\
		kvm_static_assert(!_IOC_SIZE(cmd) || sizeof(*arg) == _IOC_SIZE(cmd));	\
		ioctl(fd, cmd, arg);							\
	})
Then we will use kvm_userspace_memory_region2 as the KVM internal alias,
right?
Yep.
I see similar examples use different functions to handle different versions
but it does look easier if we use alias for this function.
quoted
It feels absolutely ridiculous, but I think the best option is to do:

#define KVM_SET_USER_MEMORY_REGION2 _IOW(KVMIO, 0x49, \
					 struct kvm_userspace_memory_region2)
Just interesting, is 0x49 a safe number we can use? 
Yes?  So long as its not used by KVM, it's safe.  AFAICT, it's unused.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help