[RFC,1/3] net/virtio: keep device and frontend features separated
Commit Message
This patch is preliminary rework to add support for getting
and setting device's config space.
In order to get or set a device config such as its MAC address,
we need to know whether the device itself support the feature,
or if it is emulated by the frontend.
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
drivers/net/virtio/virtio_user/virtio_user_dev.c | 10 ++--------
drivers/net/virtio/virtio_user_ethdev.c | 5 +++--
2 files changed, 5 insertions(+), 10 deletions(-)
@@ -572,11 +572,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER)
dev->frontend_features |= (1ull << VIRTIO_NET_F_STATUS);
- /*
- * Device features =
- * (frontend_features | backend_features) & ~unsupported_features;
- */
- dev->device_features |= dev->frontend_features;
+ dev->frontend_features &= ~dev->unsupported_features;
dev->device_features &= ~dev->unsupported_features;
if (rte_mem_event_callback_register(VIRTIO_USER_MEM_EVENT_CLB_NAME,
@@ -940,12 +936,10 @@ virtio_user_dev_server_reconnect(struct virtio_user_dev *dev)
return -1;
}
- dev->device_features |= dev->frontend_features;
-
/* unmask vhost-user unsupported features */
dev->device_features &= ~(dev->unsupported_features);
- dev->features &= dev->device_features;
+ dev->features &= (dev->device_features | dev->frontend_features);
/* For packed ring, resetting queues is required in reconnection. */
if (virtio_with_packed_queue(hw) &&
@@ -110,7 +110,8 @@ virtio_user_get_features(struct virtio_hw *hw)
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
/* unmask feature bits defined in vhost user protocol */
- return dev->device_features & VIRTIO_PMD_SUPPORTED_GUEST_FEATURES;
+ return (dev->device_features | dev->frontend_features) &
+ VIRTIO_PMD_SUPPORTED_GUEST_FEATURES;
}
static void
@@ -118,7 +119,7 @@ virtio_user_set_features(struct virtio_hw *hw, uint64_t features)
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
- dev->features = features & dev->device_features;
+ dev->features = features & (dev->device_features | dev->frontend_features);
}
static int