Commit 65b70958 authored by Stefano Garzarella's avatar Stefano Garzarella Committed by Michael S. Tsirkin

vdpa_sim: add get_config callback in vdpasim_dev_attr

The get_config callback can be used by the device to fill the
config structure.
The callback will be invoked in vdpasim_get_config() before copying
bytes into caller buffer.

Move vDPA-net config updates from vdpasim_set_features() in the
new vdpasim_net_get_config() callback.
This is safe since in vdpa_get_config() we already check that
.set_features() callback is called before .get_config().
Signed-off-by: default avatarStefano Garzarella <sgarzare@redhat.com>
Link: https://lore.kernel.org/r/20201215144256.155342-13-sgarzare@redhat.comSigned-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent f37cbbc6
...@@ -68,6 +68,8 @@ struct vdpasim_virtqueue { ...@@ -68,6 +68,8 @@ struct vdpasim_virtqueue {
#define VDPASIM_NET_FEATURES (VDPASIM_FEATURES | \ #define VDPASIM_NET_FEATURES (VDPASIM_FEATURES | \
(1ULL << VIRTIO_NET_F_MAC)) (1ULL << VIRTIO_NET_F_MAC))
struct vdpasim;
struct vdpasim_dev_attr { struct vdpasim_dev_attr {
u64 supported_features; u64 supported_features;
size_t config_size; size_t config_size;
...@@ -75,6 +77,7 @@ struct vdpasim_dev_attr { ...@@ -75,6 +77,7 @@ struct vdpasim_dev_attr {
u32 id; u32 id;
work_func_t work_fn; work_func_t work_fn;
void (*get_config)(struct vdpasim *vdpasim, void *config);
}; };
/* State of each vdpasim device */ /* State of each vdpasim device */
...@@ -530,8 +533,6 @@ static u64 vdpasim_get_features(struct vdpa_device *vdpa) ...@@ -530,8 +533,6 @@ static u64 vdpasim_get_features(struct vdpa_device *vdpa)
static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features) static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
{ {
struct vdpasim *vdpasim = vdpa_to_sim(vdpa); struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
struct virtio_net_config *config =
(struct virtio_net_config *)vdpasim->config;
/* DMA mapping must be done by driver */ /* DMA mapping must be done by driver */
if (!(features & (1ULL << VIRTIO_F_ACCESS_PLATFORM))) if (!(features & (1ULL << VIRTIO_F_ACCESS_PLATFORM)))
...@@ -539,16 +540,6 @@ static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features) ...@@ -539,16 +540,6 @@ static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
vdpasim->features = features & vdpasim->dev_attr.supported_features; vdpasim->features = features & vdpasim->dev_attr.supported_features;
/* We generally only know whether guest is using the legacy interface
* here, so generally that's the earliest we can set config fields.
* Note: We actually require VIRTIO_F_ACCESS_PLATFORM above which
* implies VIRTIO_F_VERSION_1, but let's not try to be clever here.
*/
config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
memcpy(config->mac, macaddr_buf, ETH_ALEN);
return 0; return 0;
} }
...@@ -603,8 +594,13 @@ static void vdpasim_get_config(struct vdpa_device *vdpa, unsigned int offset, ...@@ -603,8 +594,13 @@ static void vdpasim_get_config(struct vdpa_device *vdpa, unsigned int offset,
{ {
struct vdpasim *vdpasim = vdpa_to_sim(vdpa); struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
if (offset + len < vdpasim->dev_attr.config_size) if (offset + len > vdpasim->dev_attr.config_size)
memcpy(buf, vdpasim->config + offset, len); return;
if (vdpasim->dev_attr.get_config)
vdpasim->dev_attr.get_config(vdpasim, vdpasim->config);
memcpy(buf, vdpasim->config + offset, len);
} }
static void vdpasim_set_config(struct vdpa_device *vdpa, unsigned int offset, static void vdpasim_set_config(struct vdpa_device *vdpa, unsigned int offset,
...@@ -747,6 +743,16 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = { ...@@ -747,6 +743,16 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = {
.free = vdpasim_free, .free = vdpasim_free,
}; };
static void vdpasim_net_get_config(struct vdpasim *vdpasim, void *config)
{
struct virtio_net_config *net_config =
(struct virtio_net_config *)config;
net_config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
net_config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
memcpy(net_config->mac, macaddr_buf, ETH_ALEN);
}
static int __init vdpasim_dev_init(void) static int __init vdpasim_dev_init(void)
{ {
struct vdpasim_dev_attr dev_attr = {}; struct vdpasim_dev_attr dev_attr = {};
...@@ -755,6 +761,7 @@ static int __init vdpasim_dev_init(void) ...@@ -755,6 +761,7 @@ static int __init vdpasim_dev_init(void)
dev_attr.supported_features = VDPASIM_NET_FEATURES; dev_attr.supported_features = VDPASIM_NET_FEATURES;
dev_attr.nvqs = VDPASIM_VQ_NUM; dev_attr.nvqs = VDPASIM_VQ_NUM;
dev_attr.config_size = sizeof(struct virtio_net_config); dev_attr.config_size = sizeof(struct virtio_net_config);
dev_attr.get_config = vdpasim_net_get_config;
dev_attr.work_fn = vdpasim_net_work; dev_attr.work_fn = vdpasim_net_work;
vdpasim_dev = vdpasim_create(&dev_attr); vdpasim_dev = vdpasim_create(&dev_attr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment