vdpa: block migration if device has unsupported features
A vdpa net device must initialize with SVQ in order to be migratable at this moment, and initialization code verifies some conditions. If the device is not initialized with the x-svq parameter, it will not expose _F_LOG so the vhost subsystem will block VM migration from its initialization. Next patches change this, so we need to verify migration conditions differently. QEMU only supports a subset of net features in SVQ, and it cannot migrate state that cannot track or restore in the destination. Add a migration blocker if the device offers an unsupported feature. Signed-off-by: Eugenio Pérez <eperezma@redhat.com> Message-Id: <20230303172445.1089785-12-eperezma@redhat.com> Tested-by: Lei Yang <leiyang@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
9c363cf6d5
commit
5c1ebd4c43
@ -795,7 +795,8 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
|
|||||||
int nvqs,
|
int nvqs,
|
||||||
bool is_datapath,
|
bool is_datapath,
|
||||||
bool svq,
|
bool svq,
|
||||||
struct vhost_vdpa_iova_range iova_range)
|
struct vhost_vdpa_iova_range iova_range,
|
||||||
|
uint64_t features)
|
||||||
{
|
{
|
||||||
NetClientState *nc = NULL;
|
NetClientState *nc = NULL;
|
||||||
VhostVDPAState *s;
|
VhostVDPAState *s;
|
||||||
@ -818,7 +819,10 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
|
|||||||
s->vhost_vdpa.shadow_vqs_enabled = svq;
|
s->vhost_vdpa.shadow_vqs_enabled = svq;
|
||||||
s->vhost_vdpa.iova_range = iova_range;
|
s->vhost_vdpa.iova_range = iova_range;
|
||||||
s->vhost_vdpa.shadow_data = svq;
|
s->vhost_vdpa.shadow_data = svq;
|
||||||
if (!is_datapath) {
|
if (queue_pair_index == 0) {
|
||||||
|
vhost_vdpa_net_valid_svq_features(features,
|
||||||
|
&s->vhost_vdpa.migration_blocker);
|
||||||
|
} else if (!is_datapath) {
|
||||||
s->cvq_cmd_out_buffer = qemu_memalign(qemu_real_host_page_size(),
|
s->cvq_cmd_out_buffer = qemu_memalign(qemu_real_host_page_size(),
|
||||||
vhost_vdpa_net_cvq_cmd_page_len());
|
vhost_vdpa_net_cvq_cmd_page_len());
|
||||||
memset(s->cvq_cmd_out_buffer, 0, vhost_vdpa_net_cvq_cmd_page_len());
|
memset(s->cvq_cmd_out_buffer, 0, vhost_vdpa_net_cvq_cmd_page_len());
|
||||||
@ -956,7 +960,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
|
|||||||
for (i = 0; i < queue_pairs; i++) {
|
for (i = 0; i < queue_pairs; i++) {
|
||||||
ncs[i] = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
|
ncs[i] = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
|
||||||
vdpa_device_fd, i, 2, true, opts->x_svq,
|
vdpa_device_fd, i, 2, true, opts->x_svq,
|
||||||
iova_range);
|
iova_range, features);
|
||||||
if (!ncs[i])
|
if (!ncs[i])
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -964,7 +968,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
|
|||||||
if (has_cvq) {
|
if (has_cvq) {
|
||||||
nc = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
|
nc = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
|
||||||
vdpa_device_fd, i, 1, false,
|
vdpa_device_fd, i, 1, false,
|
||||||
opts->x_svq, iova_range);
|
opts->x_svq, iova_range, features);
|
||||||
if (!nc)
|
if (!nc)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user