lkml.org 
[lkml]   [2020]   [Dec]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 09/19] vdpa_sim: add supported_features field in vdpasim_dev_attr
    Date
    Introduce a new VDPASIM_FEATURES macro with the generic features
    supported by the vDPA simulator, and VDPASIM_NET_FEATURES macro with
    vDPA-net features.

    Add 'supported_features' field in vdpasim_dev_attr, to allow devices
    to specify their features.

    Co-developed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
    Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
    ---
    drivers/vdpa/vdpa_sim/vdpa_sim.c | 29 ++++++++++++++++++-----------
    1 file changed, 18 insertions(+), 11 deletions(-)

    diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c
    index 3d97bc709fb9..569c5213ee01 100644
    --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c
    +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c
    @@ -51,12 +51,15 @@ struct vdpasim_virtqueue {
    #define VDPASIM_VQ_NUM 0x2
    #define VDPASIM_NAME "vdpasim-netdev"

    -static u64 vdpasim_features = (1ULL << VIRTIO_F_ANY_LAYOUT) |
    - (1ULL << VIRTIO_F_VERSION_1) |
    - (1ULL << VIRTIO_F_ACCESS_PLATFORM) |
    - (1ULL << VIRTIO_NET_F_MAC);
    +#define VDPASIM_FEATURES ((1ULL << VIRTIO_F_ANY_LAYOUT) | \
    + (1ULL << VIRTIO_F_VERSION_1) | \
    + (1ULL << VIRTIO_F_ACCESS_PLATFORM))
    +
    +#define VDPASIM_NET_FEATURES (VDPASIM_FEATURES | \
    + (1ULL << VIRTIO_NET_F_MAC))

    struct vdpasim_dev_attr {
    + u64 supported_features;
    int nvqs;
    u32 id;
    };
    @@ -114,7 +117,7 @@ static void vdpasim_queue_ready(struct vdpasim *vdpasim, unsigned int idx)
    {
    struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx];

    - vringh_init_iotlb(&vq->vring, vdpasim_features,
    + vringh_init_iotlb(&vq->vring, vdpasim->dev_attr.supported_features,
    VDPASIM_QUEUE_MAX, false,
    (struct vring_desc *)(uintptr_t)vq->desc_addr,
    (struct vring_avail *)
    @@ -123,7 +126,8 @@ static void vdpasim_queue_ready(struct vdpasim *vdpasim, unsigned int idx)
    (uintptr_t)vq->device_addr);
    }

    -static void vdpasim_vq_reset(struct vdpasim_virtqueue *vq)
    +static void vdpasim_vq_reset(struct vdpasim *vdpasim,
    + struct vdpasim_virtqueue *vq)
    {
    vq->ready = false;
    vq->desc_addr = 0;
    @@ -131,8 +135,8 @@ static void vdpasim_vq_reset(struct vdpasim_virtqueue *vq)
    vq->device_addr = 0;
    vq->cb = NULL;
    vq->private = NULL;
    - vringh_init_iotlb(&vq->vring, vdpasim_features, VDPASIM_QUEUE_MAX,
    - false, NULL, NULL, NULL);
    + vringh_init_iotlb(&vq->vring, vdpasim->dev_attr.supported_features,
    + VDPASIM_QUEUE_MAX, false, NULL, NULL, NULL);
    }

    static void vdpasim_reset(struct vdpasim *vdpasim)
    @@ -140,7 +144,7 @@ static void vdpasim_reset(struct vdpasim *vdpasim)
    int i;

    for (i = 0; i < vdpasim->dev_attr.nvqs; i++)
    - vdpasim_vq_reset(&vdpasim->vqs[i]);
    + vdpasim_vq_reset(vdpasim, &vdpasim->vqs[i]);

    spin_lock(&vdpasim->iommu_lock);
    vhost_iotlb_reset(vdpasim->iommu);
    @@ -500,7 +504,9 @@ static u32 vdpasim_get_vq_align(struct vdpa_device *vdpa)

    static u64 vdpasim_get_features(struct vdpa_device *vdpa)
    {
    - return vdpasim_features;
    + struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
    +
    + return vdpasim->dev_attr.supported_features;
    }

    static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
    @@ -512,7 +518,7 @@ static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
    if (!(features & (1ULL << VIRTIO_F_ACCESS_PLATFORM)))
    return -EINVAL;

    - vdpasim->features = features & vdpasim_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.
    @@ -724,6 +730,7 @@ static int __init vdpasim_dev_init(void)
    struct vdpasim_dev_attr dev_attr = {};

    dev_attr.id = VIRTIO_ID_NET;
    + dev_attr.supported_features = VDPASIM_NET_FEATURES;
    dev_attr.nvqs = VDPASIM_VQ_NUM;

    vdpasim_dev = vdpasim_create(&dev_attr);
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-12-03 18:10    [W:4.180 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site