Re: [RFC PATCH 04/18] virt/mshv: request version ioctl
From: Vitaly Kuznetsov <vkuznets@redhat.com>
Date: 2021-03-05 09:19:35
Also in:
lkml, virtualization
Nuno Das Neves [off-list ref] writes:
On 2/9/2021 5:11 AM, Vitaly Kuznetsov wrote:quoted
Nuno Das Neves [off-list ref] writes:
...
quoted
quoted
+ +3.1 MSHV_REQUEST_VERSION +------------------------ +:Type: /dev/mshv ioctl +:Parameters: pointer to a u32 +:Returns: 0 on success + +Before issuing any other ioctls, a MSHV_REQUEST_VERSION ioctl must be called to +establish the interface version with the kernel module. + +The caller should pass the MSHV_VERSION as an argument. + +The kernel module will check which interface versions it supports and return 0 +if one of them matches. + +This /dev/mshv file descriptor will remain 'locked' to that version as long as +it is open - this ioctl can only be called once per open. +KVM used to have KVM_GET_API_VERSION too but this turned out to be not very convenient so we use capabilities (KVM_CHECK_EXTENSION/KVM_ENABLE_CAP) instead.The goal of MSHV_REQUEST_VERSION is to support changes to APIs in the core set. When we add new features/ioctls beyond the core we can use an extension/capability approach like KVM.
Driver versions is a very bad idea from distribution/stable kernel point of view as it presumes that the history is linear. It is not. Imagine you have the following history upstream: MSHV_REQUEST_VERSION = 1 <100 commits with features/fixes> MSHV_REQUEST_VERSION = 2 <another 100 commits with features/fixes> MSHV_REQUEST_VERSION = 2 Now I'm a linux distribution / stable kernel maintainer. My kernel is at MSHV_REQUEST_VERSION = 1. Now I want to backport 1 feature from between VER=1 and VER=2 and another feature from between VER=2 and VER=3. My history now looks like MSHV_REQUEST_VERSION = 1 <5 commits from between VER=1 and VER=2> Which version should I declare here???? <5 commits from between VER=2 and VER=3> Which version should I declare here???? If I keep VER=1 then userspace will think that I don't have any extra features added and just won't use them. If I change VER to 2/3, it'll think I have *all* features from between these versions. The only reasonable way to manage this is to attach a "capability" to every ABI change and expose this capability *in the same commit which introduces the change to the ABI*. This way userspace will now exactly which ioctls are available and what are their interfaces. Also, trying to define "core set" is hard but you don't really need to. -- Vitaly