vhost-user: introduce protocol feature for skip drain on GET_VRING_BASE
Add vhost-user protocol feature VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT Now on GET_VRING_BASE this feature can control whether to wait for in-flight requests to complete or not. Also we have to validate that this feature will be enabled only when qemu and back-end supports in-flight buffer and in-flight migration It will be helpfull in future for in-flight requests migration in vhost-user devices. Update docs, add ref to label for inflight-io-tracking Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20260115081103.655749-3-dtalexundeer@yandex-team.ru>
This commit is contained in:
committed by
Michael S. Tsirkin
parent
e7985b6a56
commit
e0822e6085
@@ -743,6 +743,8 @@ negotiated, back-end can send file descriptors (at most 8 descriptors in
|
||||
each message) to front-end via ancillary data using this fd communication
|
||||
channel.
|
||||
|
||||
.. _inflight_io_tracking:
|
||||
|
||||
Inflight I/O tracking
|
||||
---------------------
|
||||
|
||||
@@ -1040,26 +1042,27 @@ Protocol features
|
||||
|
||||
.. code:: c
|
||||
|
||||
#define VHOST_USER_PROTOCOL_F_MQ 0
|
||||
#define VHOST_USER_PROTOCOL_F_LOG_SHMFD 1
|
||||
#define VHOST_USER_PROTOCOL_F_RARP 2
|
||||
#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
|
||||
#define VHOST_USER_PROTOCOL_F_MTU 4
|
||||
#define VHOST_USER_PROTOCOL_F_BACKEND_REQ 5
|
||||
#define VHOST_USER_PROTOCOL_F_CROSS_ENDIAN 6
|
||||
#define VHOST_USER_PROTOCOL_F_CRYPTO_SESSION 7
|
||||
#define VHOST_USER_PROTOCOL_F_PAGEFAULT 8
|
||||
#define VHOST_USER_PROTOCOL_F_CONFIG 9
|
||||
#define VHOST_USER_PROTOCOL_F_BACKEND_SEND_FD 10
|
||||
#define VHOST_USER_PROTOCOL_F_HOST_NOTIFIER 11
|
||||
#define VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD 12
|
||||
#define VHOST_USER_PROTOCOL_F_RESET_DEVICE 13
|
||||
#define VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS 14
|
||||
#define VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS 15
|
||||
#define VHOST_USER_PROTOCOL_F_STATUS 16
|
||||
#define VHOST_USER_PROTOCOL_F_XEN_MMAP 17
|
||||
#define VHOST_USER_PROTOCOL_F_SHARED_OBJECT 18
|
||||
#define VHOST_USER_PROTOCOL_F_DEVICE_STATE 19
|
||||
#define VHOST_USER_PROTOCOL_F_MQ 0
|
||||
#define VHOST_USER_PROTOCOL_F_LOG_SHMFD 1
|
||||
#define VHOST_USER_PROTOCOL_F_RARP 2
|
||||
#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
|
||||
#define VHOST_USER_PROTOCOL_F_MTU 4
|
||||
#define VHOST_USER_PROTOCOL_F_BACKEND_REQ 5
|
||||
#define VHOST_USER_PROTOCOL_F_CROSS_ENDIAN 6
|
||||
#define VHOST_USER_PROTOCOL_F_CRYPTO_SESSION 7
|
||||
#define VHOST_USER_PROTOCOL_F_PAGEFAULT 8
|
||||
#define VHOST_USER_PROTOCOL_F_CONFIG 9
|
||||
#define VHOST_USER_PROTOCOL_F_BACKEND_SEND_FD 10
|
||||
#define VHOST_USER_PROTOCOL_F_HOST_NOTIFIER 11
|
||||
#define VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD 12
|
||||
#define VHOST_USER_PROTOCOL_F_RESET_DEVICE 13
|
||||
#define VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS 14
|
||||
#define VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS 15
|
||||
#define VHOST_USER_PROTOCOL_F_STATUS 16
|
||||
#define VHOST_USER_PROTOCOL_F_XEN_MMAP 17
|
||||
#define VHOST_USER_PROTOCOL_F_SHARED_OBJECT 18
|
||||
#define VHOST_USER_PROTOCOL_F_DEVICE_STATE 19
|
||||
#define VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT 20
|
||||
|
||||
Front-end message types
|
||||
-----------------------
|
||||
@@ -1250,12 +1253,24 @@ Front-end message types
|
||||
|
||||
When and as long as all of a device's vrings are stopped, it is
|
||||
*suspended*, see :ref:`Suspended device state
|
||||
<suspended_device_state>`. The back-end must complete all inflight I/O
|
||||
requests for the specified vring before stopping it.
|
||||
<suspended_device_state>`.
|
||||
|
||||
The request payload's *num* field is currently reserved and must be
|
||||
set to 0.
|
||||
|
||||
By default, the back-end must complete all inflight I/O requests for the
|
||||
specified vring before stopping it.
|
||||
|
||||
If the ``VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT`` protocol
|
||||
feature has been negotiated, the back-end may suspend in-flight I/O
|
||||
requests and record them as described in :ref:`Inflight I/O tracking
|
||||
<inflight_io_tracking>` instead of completing them before stopping the vring.
|
||||
How to suspend an in-flight request depends on the implementation of the back-end
|
||||
but it typically can be done by aborting or cancelling the underlying I/O
|
||||
request. The ``VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT``
|
||||
protocol feature must only be neogotiated if
|
||||
``VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD`` is also negotiated.
|
||||
|
||||
``VHOST_USER_SET_VRING_KICK``
|
||||
:id: 12
|
||||
:equivalent ioctl: ``VHOST_SET_VRING_KICK``
|
||||
|
||||
@@ -2225,6 +2225,13 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
|
||||
}
|
||||
}
|
||||
|
||||
if (!u->user->supports_inflight_migration ||
|
||||
!virtio_has_feature(protocol_features,
|
||||
VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD)) {
|
||||
protocol_features &= ~(1ULL <<
|
||||
VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT);
|
||||
}
|
||||
|
||||
/* final set of protocol features */
|
||||
dev->protocol_features = protocol_features;
|
||||
err = vhost_user_set_protocol_features(dev, dev->protocol_features);
|
||||
|
||||
@@ -32,6 +32,7 @@ enum VhostUserProtocolFeature {
|
||||
/* Feature 17 reserved for VHOST_USER_PROTOCOL_F_XEN_MMAP. */
|
||||
VHOST_USER_PROTOCOL_F_SHARED_OBJECT = 18,
|
||||
VHOST_USER_PROTOCOL_F_DEVICE_STATE = 19,
|
||||
VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT = 20,
|
||||
VHOST_USER_PROTOCOL_F_MAX
|
||||
};
|
||||
|
||||
@@ -68,6 +69,7 @@ typedef struct VhostUserState {
|
||||
GPtrArray *notifiers;
|
||||
int memory_slots;
|
||||
bool supports_config;
|
||||
bool supports_inflight_migration;
|
||||
} VhostUserState;
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user