virtio-net: Move virtio_net_get_features() down
Move virtio_net_get_features() to the later part of the file so that it can call other functions. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Message-Id: <20250530-vdpa-v1-3-5af4109b1c19@daynix.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
14f521f491
commit
2deec9ab7d
1 changed files with 73 additions and 73 deletions
|
|
@ -752,79 +752,6 @@ static void virtio_net_set_queue_pairs(VirtIONet *n)
|
|||
|
||||
static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue);
|
||||
|
||||
static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features,
|
||||
Error **errp)
|
||||
{
|
||||
VirtIONet *n = VIRTIO_NET(vdev);
|
||||
NetClientState *nc = qemu_get_queue(n->nic);
|
||||
|
||||
/* Firstly sync all virtio-net possible supported features */
|
||||
features |= n->host_features;
|
||||
|
||||
virtio_add_feature(&features, VIRTIO_NET_F_MAC);
|
||||
|
||||
if (!peer_has_vnet_hdr(n)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_CSUM);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO6);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_ECN);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_CSUM);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO6);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ECN);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HASH_REPORT);
|
||||
}
|
||||
|
||||
if (!peer_has_vnet_hdr(n) || !peer_has_ufo(n)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_UFO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_UFO);
|
||||
}
|
||||
|
||||
if (!peer_has_uso(n)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6);
|
||||
}
|
||||
|
||||
if (!get_vhost_net(nc->peer)) {
|
||||
return features;
|
||||
}
|
||||
|
||||
if (!ebpf_rss_is_loaded(&n->ebpf_rss)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_RSS);
|
||||
}
|
||||
features = vhost_net_get_features(get_vhost_net(nc->peer), features);
|
||||
vdev->backend_features = features;
|
||||
|
||||
if (n->mtu_bypass_backend &&
|
||||
(n->host_features & 1ULL << VIRTIO_NET_F_MTU)) {
|
||||
features |= (1ULL << VIRTIO_NET_F_MTU);
|
||||
}
|
||||
|
||||
/*
|
||||
* Since GUEST_ANNOUNCE is emulated the feature bit could be set without
|
||||
* enabled. This happens in the vDPA case.
|
||||
*
|
||||
* Make sure the feature set is not incoherent, as the driver could refuse
|
||||
* to start.
|
||||
*
|
||||
* TODO: QEMU is able to emulate a CVQ just for guest_announce purposes,
|
||||
* helping guest to notify the new location with vDPA devices that does not
|
||||
* support it.
|
||||
*/
|
||||
if (!virtio_has_feature(vdev->backend_features, VIRTIO_NET_F_CTRL_VQ)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ANNOUNCE);
|
||||
}
|
||||
|
||||
return features;
|
||||
}
|
||||
|
||||
static uint64_t virtio_net_bad_features(VirtIODevice *vdev)
|
||||
{
|
||||
uint64_t features = 0;
|
||||
|
|
@ -3076,6 +3003,79 @@ static int virtio_net_pre_load_queues(VirtIODevice *vdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features,
|
||||
Error **errp)
|
||||
{
|
||||
VirtIONet *n = VIRTIO_NET(vdev);
|
||||
NetClientState *nc = qemu_get_queue(n->nic);
|
||||
|
||||
/* Firstly sync all virtio-net possible supported features */
|
||||
features |= n->host_features;
|
||||
|
||||
virtio_add_feature(&features, VIRTIO_NET_F_MAC);
|
||||
|
||||
if (!peer_has_vnet_hdr(n)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_CSUM);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO6);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_ECN);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_CSUM);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO6);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ECN);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6);
|
||||
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HASH_REPORT);
|
||||
}
|
||||
|
||||
if (!peer_has_vnet_hdr(n) || !peer_has_ufo(n)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_UFO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_UFO);
|
||||
}
|
||||
|
||||
if (!peer_has_uso(n)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4);
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6);
|
||||
}
|
||||
|
||||
if (!get_vhost_net(nc->peer)) {
|
||||
return features;
|
||||
}
|
||||
|
||||
if (!ebpf_rss_is_loaded(&n->ebpf_rss)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_RSS);
|
||||
}
|
||||
features = vhost_net_get_features(get_vhost_net(nc->peer), features);
|
||||
vdev->backend_features = features;
|
||||
|
||||
if (n->mtu_bypass_backend &&
|
||||
(n->host_features & 1ULL << VIRTIO_NET_F_MTU)) {
|
||||
features |= (1ULL << VIRTIO_NET_F_MTU);
|
||||
}
|
||||
|
||||
/*
|
||||
* Since GUEST_ANNOUNCE is emulated the feature bit could be set without
|
||||
* enabled. This happens in the vDPA case.
|
||||
*
|
||||
* Make sure the feature set is not incoherent, as the driver could refuse
|
||||
* to start.
|
||||
*
|
||||
* TODO: QEMU is able to emulate a CVQ just for guest_announce purposes,
|
||||
* helping guest to notify the new location with vDPA devices that does not
|
||||
* support it.
|
||||
*/
|
||||
if (!virtio_has_feature(vdev->backend_features, VIRTIO_NET_F_CTRL_VQ)) {
|
||||
virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ANNOUNCE);
|
||||
}
|
||||
|
||||
return features;
|
||||
}
|
||||
|
||||
static int virtio_net_post_load_device(void *opaque, int version_id)
|
||||
{
|
||||
VirtIONet *n = opaque;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue