On 02/24/16 01:34, Jordan Justen wrote:
> Reviewed-by: Jordan Justen <[email protected]>
Thanks!
Ard, please add Jordan's R-b to the (identical) instance of this patch
that you included in your larger series:
[edk2] [PATCH v3 1/3] OvmfPkg: VirtioFlush(): return the number of
bytes written by the host
http://thread.gmane.org/gmane.comp.bios.edk2.devel/7958/focus=7956
Then (after addressing
<http://thread.gmane.org/gmane.comp.bios.edk2.devel/7958/focus=7979>)
you can push it immediately.
Thanks!
Laszlo
>
> On 2016-02-19 09:15:07, Laszlo Ersek wrote:
>> VirtioLib provides an API for simple, synchronous (request/response-style)
>> virtio communication. The guest driver builds one descriptor chain, link
>> for link, with VirtioPrepare() and VirtioAppendDesc(), then submits the
>> chain, and awaits the processing, with VirtioFlush().
>>
>> The descriptor chain is always built at the beginning of the descriptor
>> area, with the head descriptor having descriptor index 0.
>>
>> In order to submit the descriptor chain to the host, the guest always
>> pushes a new "available element" to the Available Ring, in genuine
>> queue-like fashion, with the new element referencing the head descriptor
>> (which always has index 0, see above).
>>
>> In turn, after processing, the host always pushes a new "used element" to
>> the Used Ring, in genuine queue-like fashion, with the new element
>> referencing the head descriptor of the chain that was just processed. The
>> same element also reports the number of bytes that the host wrote,
>> consecutively across the host-writeable buffers that were linked by the
>> descriptors.
>>
>> (See "OvmfPkg/VirtioNetDxe/TechNotes.txt" for a diagram about the
>> descriptor area and the rings.)
>>
>> Because at most one descriptor chain can be in flight with VirtioLib at
>> any time,
>>
>> - the Available Ring and the Used Ring proceed in lock-step,
>>
>> - and the head descriptor that the new "available" and "used" elements can
>> ever reference has index 0.
>>
>> Based on the above, we can modify VirtioFlush() to return the number of
>> bytes written by the host across the descriptor chain. The virtio-block
>> and virtio-scsi drivers don't care (they have other ways to parse the data
>> produced by the host), while the virtio-net driver doesn't use
>> VirtioFlush() at all (it employs VirtioLib only to set up its rings).
>>
>> However, the virtio entropy device, to be covered in the upcoming
>> patches, reports the amount of randomness produced by the host only
>> through this quantity.
>>
>> Cc: Ard Biesheuvel <[email protected]>
>> Cc: Jordan Justen <[email protected]>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Laszlo Ersek <[email protected]>
>> ---
>> OvmfPkg/Include/Library/VirtioLib.h | 11 +++++++--
>> OvmfPkg/Library/VirtioLib/VirtioLib.c | 26 ++++++++++++++++++--
>> OvmfPkg/VirtioBlkDxe/VirtioBlk.c | 3 ++-
>> OvmfPkg/VirtioScsiDxe/VirtioScsi.c | 2 +-
>> 4 files changed, 36 insertions(+), 6 deletions(-)
>>
>> diff --git a/OvmfPkg/Include/Library/VirtioLib.h
>> b/OvmfPkg/Include/Library/VirtioLib.h
>> index 36527a523f28..decd4418af3d 100644
>> --- a/OvmfPkg/Include/Library/VirtioLib.h
>> +++ b/OvmfPkg/Include/Library/VirtioLib.h
>> @@ -2,7 +2,7 @@
>>
>> Declarations of utility functions used by virtio device drivers.
>>
>> - Copyright (C) 2012, Red Hat, Inc.
>> + Copyright (C) 2012-2016, Red Hat, Inc.
>>
>> This program and the accompanying materials are licensed and made
>> available
>> under the terms and conditions of the BSD License which accompanies this
>> @@ -167,6 +167,12 @@ VirtioAppendDesc (
>> Indices->HeadDescIdx identifies the head
>> descriptor
>> of the descriptor chain.
>>
>> + @param[out] UsedLen On success, the total number of bytes,
>> consecutively
>> + across the buffers linked by the descriptor chain,
>> + that the host wrote. May be NULL if the caller
>> + doesn't care, or can compute the same information
>> + from device-specific request structures linked by
>> the
>> + descriptor chain.
>>
>> @return Error code from VirtIo->SetQueueNotify() if it fails.
>>
>> @@ -179,7 +185,8 @@ VirtioFlush (
>> IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
>> IN UINT16 VirtQueueId,
>> IN OUT VRING *Ring,
>> - IN DESC_INDICES *Indices
>> + IN DESC_INDICES *Indices,
>> + OUT UINT32 *UsedLen OPTIONAL
>> );
>>
>> #endif // _VIRTIO_LIB_H_
>> diff --git a/OvmfPkg/Library/VirtioLib/VirtioLib.c
>> b/OvmfPkg/Library/VirtioLib/VirtioLib.c
>> index 54cf225c9885..4b1d78b5a03e 100644
>> --- a/OvmfPkg/Library/VirtioLib/VirtioLib.c
>> +++ b/OvmfPkg/Library/VirtioLib/VirtioLib.c
>> @@ -2,7 +2,7 @@
>>
>> Utility functions used by virtio device drivers.
>>
>> - Copyright (C) 2012, Red Hat, Inc.
>> + Copyright (C) 2012-2016, Red Hat, Inc.
>> Portion of Copyright (C) 2013, ARM Ltd.
>>
>> This program and the accompanying materials are licensed and made
>> available
>> @@ -249,6 +249,12 @@ VirtioAppendDesc (
>> Indices->HeadDescIdx identifies the head
>> descriptor
>> of the descriptor chain.
>>
>> + @param[out] UsedLen On success, the total number of bytes,
>> consecutively
>> + across the buffers linked by the descriptor chain,
>> + that the host wrote. May be NULL if the caller
>> + doesn't care, or can compute the same information
>> + from device-specific request structures linked by
>> the
>> + descriptor chain.
>>
>> @return Error code from VirtIo->SetQueueNotify() if it fails.
>>
>> @@ -261,10 +267,12 @@ VirtioFlush (
>> IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
>> IN UINT16 VirtQueueId,
>> IN OUT VRING *Ring,
>> - IN DESC_INDICES *Indices
>> + IN DESC_INDICES *Indices,
>> + OUT UINT32 *UsedLen OPTIONAL
>> )
>> {
>> UINT16 NextAvailIdx;
>> + UINT16 LastUsedIdx;
>> EFI_STATUS Status;
>> UINTN PollPeriodUsecs;
>>
>> @@ -276,6 +284,11 @@ VirtioFlush (
>> // head descriptor of any given descriptor chain.
>> //
>> NextAvailIdx = *Ring->Avail.Idx;
>> + //
>> + // (Due to our lock-step progress, this is where the host will produce the
>> + // used element with the head descriptor's index in it.)
>> + //
>> + LastUsedIdx = NextAvailIdx;
>> Ring->Avail.Ring[NextAvailIdx++ % Ring->QueueSize] =
>> Indices->HeadDescIdx % Ring->QueueSize;
>>
>> @@ -315,5 +328,14 @@ VirtioFlush (
>> }
>>
>> MemoryFence();
>> +
>> + if (UsedLen != NULL) {
>> + volatile CONST VRING_USED_ELEM *UsedElem;
>> +
>> + UsedElem = &Ring->Used.UsedElem[LastUsedIdx % Ring->QueueSize];
>> + ASSERT (UsedElem->Id == Indices->HeadDescIdx);
>> + *UsedLen = UsedElem->Len;
>> + }
>> +
>> return EFI_SUCCESS;
>> }
>> diff --git a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c
>> b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c
>> index 75f85ca6e09a..50511a1e446b 100644
>> --- a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c
>> +++ b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c
>> @@ -324,7 +324,8 @@ SynchronousRequest (
>> //
>> // virtio-blk's only virtqueue is #0, called "requestq" (see Appendix D).
>> //
>> - if (VirtioFlush (Dev->VirtIo, 0, &Dev->Ring, &Indices) == EFI_SUCCESS &&
>> + if (VirtioFlush (Dev->VirtIo, 0, &Dev->Ring, &Indices,
>> + NULL) == EFI_SUCCESS &&
>> HostStatus == VIRTIO_BLK_S_OK) {
>> return EFI_SUCCESS;
>> }
>> diff --git a/OvmfPkg/VirtioScsiDxe/VirtioScsi.c
>> b/OvmfPkg/VirtioScsiDxe/VirtioScsi.c
>> index e1e12039b359..f5f412a32e9b 100644
>> --- a/OvmfPkg/VirtioScsiDxe/VirtioScsi.c
>> +++ b/OvmfPkg/VirtioScsiDxe/VirtioScsi.c
>> @@ -470,7 +470,7 @@ VirtioScsiPassThru (
>> // caller retry.
>> //
>> if (VirtioFlush (Dev->VirtIo, VIRTIO_SCSI_REQUEST_QUEUE, &Dev->Ring,
>> - &Indices) != EFI_SUCCESS) {
>> + &Indices, NULL) != EFI_SUCCESS) {
>> Packet->InTransferLength = 0;
>> Packet->OutTransferLength = 0;
>> Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OTHER;
>> --
>> 1.8.3.1
>>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel