mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
vhost-user: Add 'VHOST_USER_POSTCOPY_ADVISE' message
Wire up a notifier to send a VHOST_USER_POSTCOPY_ADVISE message on an incoming advise. Later patches will fill in the behaviour/contents of the message. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
9ccbfe14dd
commit
d3dff7a5a1
6 changed files with 79 additions and 0 deletions
|
@ -78,6 +78,7 @@ typedef enum VhostUserRequest {
|
|||
VHOST_USER_SET_CONFIG = 25,
|
||||
VHOST_USER_CREATE_CRYPTO_SESSION = 26,
|
||||
VHOST_USER_CLOSE_CRYPTO_SESSION = 27,
|
||||
VHOST_USER_POSTCOPY_ADVISE = 28,
|
||||
VHOST_USER_MAX
|
||||
} VhostUserRequest;
|
||||
|
||||
|
@ -795,6 +796,50 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called at the start of an inbound postcopy on reception of the
|
||||
* 'advise' command.
|
||||
*/
|
||||
static int vhost_user_postcopy_advise(struct vhost_dev *dev, Error **errp)
|
||||
{
|
||||
struct vhost_user *u = dev->opaque;
|
||||
CharBackend *chr = u->chr;
|
||||
int ufd;
|
||||
VhostUserMsg msg = {
|
||||
.hdr.request = VHOST_USER_POSTCOPY_ADVISE,
|
||||
.hdr.flags = VHOST_USER_VERSION,
|
||||
};
|
||||
|
||||
if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
||||
error_setg(errp, "Failed to send postcopy_advise to vhost");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (vhost_user_read(dev, &msg) < 0) {
|
||||
error_setg(errp, "Failed to get postcopy_advise reply from vhost");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (msg.hdr.request != VHOST_USER_POSTCOPY_ADVISE) {
|
||||
error_setg(errp, "Unexpected msg type. Expected %d received %d",
|
||||
VHOST_USER_POSTCOPY_ADVISE, msg.hdr.request);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (msg.hdr.size) {
|
||||
error_setg(errp, "Received bad msg size.");
|
||||
return -1;
|
||||
}
|
||||
ufd = qemu_chr_fe_get_msgfd(chr);
|
||||
if (ufd < 0) {
|
||||
error_setg(errp, "%s: Failed to get ufd", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* TODO: register ufd with userfault thread */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vhost_user_postcopy_notifier(NotifierWithReturn *notifier,
|
||||
void *opaque)
|
||||
{
|
||||
|
@ -814,6 +859,9 @@ static int vhost_user_postcopy_notifier(NotifierWithReturn *notifier,
|
|||
}
|
||||
break;
|
||||
|
||||
case POSTCOPY_NOTIFY_INBOUND_ADVISE:
|
||||
return vhost_user_postcopy_advise(dev, pnd->errp);
|
||||
|
||||
default:
|
||||
/* We ignore notifications we don't know */
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue