• Matias Ezequiel Vara Larsen's avatar
    ALSA: virtio: use ack callback · fe981e67
    Matias Ezequiel Vara Larsen authored
    This commit uses the ack() callback to determine when a buffer has been
    updated, then exposes it to guest.
    
    The current mechanism splits a dma buffer into descriptors that are
    exposed to the device. This dma buffer is shared with the user
    application. When the device consumes a buffer, the driver moves the
    request from the used ring to available ring.
    
    The driver exposes the buffer to the device without knowing if the
    content has been updated from the user. The section 2.8.21.1 of the
    virtio spec states that: "The device MAY access the descriptor chains
    the driver created and the memory they refer to immediately". If the
    device picks up buffers from the available ring just after it is
    notified, it happens that the content may be old.
    
    When the ack() callback is invoked, the driver exposes only the buffers
    that have already been updated, i.e., enqueued in the available ring.
    Thus, the device always picks up a buffer that is updated.
    
    For capturing, the driver starts by exposing all the available buffers
    to device. After device updates the content of a buffer, it enqueues it
    in the used ring. It is only after the ack() for capturing is issued
    that the driver re-enqueues the buffer in the available ring.
    Co-developed-by: default avatarAnton Yakovlev <anton.yakovlev@opensynergy.com>
    Signed-off-by: default avatarAnton Yakovlev <anton.yakovlev@opensynergy.com>
    Signed-off-by: default avatarMatias Ezequiel Vara Larsen <mvaralar@redhat.com>
    Link: https://lore.kernel.org/r/ZTjkn1YAFz67yfqx@fedoraSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    fe981e67
virtio_pcm.c 14.4 KB