• H
    vhost: fix initialization for vq->is_le · cda8bba0
    Halil Pasic 提交于
    Currently, under certain circumstances vhost_init_is_le does just a part
    of the initialization job, and depends on vhost_reset_is_le being called
    too. For this reason vhost_vq_init_access used to call vhost_reset_is_le
    when vq->private_data is NULL. This is not only counter intuitive, but
    also real a problem because it breaks vhost_net. The bug was introduced to
    vhost_net with commit 2751c988 ("vhost: cross-endian support for
    legacy devices"). The symptom is corruption of the vq's used.idx field
    (virtio) after VHOST_NET_SET_BACKEND was issued as a part of the vhost
    shutdown on a vq with pending descriptors.
    
    Let us make sure the outcome of vhost_init_is_le never depend on the state
    it is actually supposed to initialize, and fix virtio_net by removing the
    reset from vhost_vq_init_access.
    
    With the above, there is no reason for vhost_reset_is_le to do just half
    of the job. Let us make vhost_reset_is_le reinitialize is_le.
    Signed-off-by: NHalil Pasic <pasic@linux.vnet.ibm.com>
    Reported-by: NMichael A. Tebolt <miket@us.ibm.com>
    Reported-by: NDr. David Alan Gilbert <dgilbert@redhat.com>
    Fixes: commit 2751c988 ("vhost: cross-endian support for legacy devices")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: NGreg Kurz <groug@kaod.org>
    Tested-by: NMichael A. Tebolt <miket@us.ibm.com>
    cda8bba0
vhost.c 57.2 KB