lkml.org 
[lkml]   [2017]   [Apr]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.18 110/124] virtio_balloon: init 1st buffer in stats vq
    Date
    3.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ladi Prosek <lprosek@redhat.com>

    commit fc8653228c8588a120f6b5dad6983b7b61ff669e upstream.

    When init_vqs runs, virtio_balloon.stats is either uninitialized or
    contains stale values. The host updates its state with garbage data
    because it has no way of knowing that this is just a marker buffer
    used for signaling.

    This patch updates the stats before pushing the initial buffer.

    Alternative fixes:
    * Push an empty buffer in init_vqs. Not easily done with the current
    virtio implementation and violates the spec "Driver MUST supply the
    same subset of statistics in all buffers submitted to the statsq".
    * Push a buffer with invalid tags in init_vqs. Violates the same
    spec clause, plus "invalid tag" is not really defined.

    Note: the spec says:
    When using the legacy interface, the device SHOULD ignore all values in
    the first buffer in the statsq supplied by the driver after device
    initialization. Note: Historically, drivers supplied an uninitialized
    buffer in the first buffer.

    Unfortunately QEMU does not seem to implement the recommendation
    even for the legacy interface.

    Signed-off-by: Ladi Prosek <lprosek@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/virtio/virtio_balloon.c | 2 ++
    1 file changed, 2 insertions(+)

    --- a/drivers/virtio/virtio_balloon.c
    +++ b/drivers/virtio/virtio_balloon.c
    @@ -355,6 +355,8 @@ static int init_vqs(struct virtio_balloo
    * Prime this virtqueue with one buffer so the hypervisor can
    * use it to signal us later (it can't be broken yet!).
    */
    + update_balloon_stats(vb);
    +
    sg_init_one(&sg, vb->stats, sizeof vb->stats);
    if (virtqueue_add_outbuf(vb->stats_vq, &sg, 1, vb, GFP_KERNEL)
    < 0)

    \
     
     \ /
      Last update: 2017-04-20 08:47    [W:4.154 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site