public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: Brijesh Singh <brijesh.singh@amd.com>, edk2-devel@lists.01.org
Cc: Jordan Justen <jordan.l.justen@intel.com>,
	Tom Lendacky <thomas.lendacky@amd.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: Re: [PATCH v1 06/14] OvmfPkg/VirtioLib: Add functions to map/unmap VRING
Date: Thu, 10 Aug 2017 01:51:19 +0200	[thread overview]
Message-ID: <01220a3b-565b-8a36-406d-cfcc63265fb7@redhat.com> (raw)
In-Reply-To: <1502107139-412-7-git-send-email-brijesh.singh@amd.com>

First some superficial comments, then some more serious ones.

On 08/07/17 13:58, Brijesh Singh wrote:
> Add functions to map and unmap the ring buffer with BusMasterCommonBuffer.
> 
> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> Cc: Tom Lendacky <thomas.lendacky@amd.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
> ---
>  OvmfPkg/Include/Library/VirtioLib.h   | 41 +++++++++++++++
>  OvmfPkg/Library/VirtioLib/VirtioLib.c | 52 ++++++++++++++++++++
>  2 files changed, 93 insertions(+)
> 
> diff --git a/OvmfPkg/Include/Library/VirtioLib.h b/OvmfPkg/Include/Library/VirtioLib.h
> index 610654225de7..877961af0514 100644
> --- a/OvmfPkg/Include/Library/VirtioLib.h
> +++ b/OvmfPkg/Include/Library/VirtioLib.h
> @@ -62,6 +62,47 @@ VirtioRingInit (
>  
>  /**
>  
> +  Map the ring buffer so that it can be accessed equally by both guest
> +  and hypervisor.
> +
> +  @param[in]      VirtIo    The virtio device instance.
> +
> +  @param[in]      Ring      The virtio ring to map.
> +
> +  @param[out]     Mapping   A resulting value to pass to Unmap().

(1) Please say "token" here (to be consistent with my earlier request).

(2) Please replace Unmap() with VirtIo->UnmapSharedBuffer().

> +
> +  @retval         Value returned from VirtIo->MapSharedBuffer()

(3) This should be @return, not @retval. @retval is for concrete
constants. Also I would suggest "Status code" rather than "Value".

(4) Please sync the comment block in the C file.

> +**/
> +EFI_STATUS
> +EFIAPI
> +VirtioRingMap (
> +  IN  VIRTIO_DEVICE_PROTOCOL *VirtIo,
> +  IN  VRING                  *Ring,
> +  OUT VOID                   **Mapping
> +  );
> +
> +/**
> +
> +  Unmap the ring buffer mapped using VirtioRingMap()
> +
> +  @param[in]      VirtIo    The virtio device instance.
> +
> +  @param[in]      Ring      The virtio ring to unmap.
> +
> +  @param[in]      Mapping   A value obtained through Map().
> +
> +  @retval         Value returned from VirtIo->UnmapSharedBuffer()
> +**/
> +EFI_STATUS
> +EFIAPI
> +VirtioRingUnmap (
> +  IN  VIRTIO_DEVICE_PROTOCOL *VirtIo,
> +  IN  VRING                  *Ring,
> +  IN  VOID                   *Mapping
> +  );

(5) Please drop this function. It doesn't save us anything. (The Ring
parameter isn't even used in the implementation.)

> +
> +/**
> +
>    Tear down the internal resources of a configured virtio ring.
>  
>    The caller is responsible to stop the host from using this ring before
> diff --git a/OvmfPkg/Library/VirtioLib/VirtioLib.c b/OvmfPkg/Library/VirtioLib/VirtioLib.c
> index 50e5ec28ea1b..09a3f9b7f2e5 100644
> --- a/OvmfPkg/Library/VirtioLib/VirtioLib.c
> +++ b/OvmfPkg/Library/VirtioLib/VirtioLib.c
> @@ -640,3 +640,55 @@ VirtioUnmapSharedBuffer (
>  {
>    return VirtIo->UnmapSharedBuffer (VirtIo, Mapping);
>  }
> +
> +/**
> +
> +  Map the ring buffer so that it can be accessed equally by both guest
> +  and hypervisor.
> +
> +  @param[in]      VirtIo    The virtio device instance.
> +
> +  @param[in]      Ring      The virtio ring to map.
> +
> +  @param[out]     Mapping   A resulting value to pass to Unmap().
> +
> +  @retval         Value returned from VirtIo->MapSharedBuffer()
> +**/
> +EFI_STATUS
> +EFIAPI
> +VirtioRingMap (
> +  IN  VIRTIO_DEVICE_PROTOCOL *VirtIo,
> +  IN  VRING                  *Ring,
> +  OUT VOID                   **Mapping
> +  )
> +{
> +  UINTN                 NumberOfBytes;
> +
> +  NumberOfBytes = Ring->NumPages * EFI_PAGE_SIZE;

(6) "EFI_PAGES_TO_SIZE (Ring->NumPages)" is more idiomatic.

> +
> +  return VirtioMapSharedBufferCommon (VirtIo, Ring->Base,
> +           NumberOfBytes, Mapping);

(7) So, based on my earlier request, this should become a call to
VirtioMapAllBytesInSharedBuffer(). Please break every argument to a
separate line.

Now, my important comments for this patch. :)

VirtioMapAllBytesInSharedBuffer() will give you a DeviceAddress. Here's
what we should do with it:


(8) Please introduce a new patch that modifies the
VIRTIO_SET_QUEUE_ADDRESS typedef, in
"OvmfPkg/Include/Protocol/VirtioDevice.h". Namely, please add a third
parameter:

  IN UINT64 RingBaseShift

In this initial patch, simply update all call sites to pass in 0.

In parallel (in the same initial patch), update all three implementations:
- VirtioMmioSetQueueAddress()
[OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c]
- VirtioPciSetQueueAddress()
[OvmfPkg/VirtioPciDeviceDxe/VirtioPciFunctions.c]
- Virtio10SetQueueAddress() [OvmfPkg/Virtio10Dxe/Virtio10.c]

as follows:
- accept the new parameter (obviously),
- simply assert that it is zero, at the top of the function.


(9) Modify Virtio10SetQueueAddress() as follows, in another separate patch:

- every time after the local variable "Address" is assigned, please insert:

  Address += RingBaseShift;

This is automatically going to happen in UINT64 arithmetic, which has
well-defined wrap-around semantics. Three such insertions will be necessary.

- remove the ASSERT added in (8)


(10) Then please include the present patch, with the following update
(beyond the changes requested above):

- Add the following output parameter to VirtioRingMap():

  OUT UINT64 *RingBaseShift

- In the implementation, assign it like this, if
VirtioMapAllBytesInSharedBuffer() succeeds:

  *RingBaseShift = DeviceAddress - (UINT64)(UINTN)Ring->Base;

(DeviceAddress has type EFI_PHYSICAL_ADDRESS, which is equivalent to
UINT64, on the spec level.)


(11) Please make sure that no output parameter is modified before we can
guarantee returning EFI_SUCCESS.


(12) In the individual virtio device drivers, whenever you insert the
VirtioRingMap() function call, carry "RingBaseShift" from
VirtioRingMap() to VirtIo->SetQueueAddress() in a new local UINT64 variable.

End result:
- the MMIO and legacy PCI transport implementations will always set
DeviceAddress to HostAddress in their no-op MapSharedBuffer() member
functions,
- therefore VirtioRingMap() will set RingBaseShift to zero,
- the ASSERT()s in the SetQueueAddress() members of those same transport
implementations will be satisfied,
- with the modern-only (1.0) transport, RingBaseShift will also be zero
(because of the SEV IOMMU that we have), and "Address += 0" will have no
effect,
- if we ever add an IOMMU driver that translates addresses, the
translation will happen automatically in the modern-only transport.

Thanks,
Laszlo


> +}
> +
> +/**
> +
> +  Unmap the ring buffer mapped using VirtioRingMap()
> +
> +  @param[in]      VirtIo    The virtio device instance.
> +
> +  @param[in]      Ring      The virtio ring to unmap.
> +
> +  @param[in]      Mapping   A value obtained through Map().
> +
> +  @retval         Value returned from VirtIo->UnmapSharedBuffer()
> +**/
> +EFI_STATUS
> +EFIAPI
> +VirtioRingUnmap (
> +  IN  VIRTIO_DEVICE_PROTOCOL *VirtIo,
> +  IN  VRING                  *Ring,
> +  IN  VOID                   *Mapping
> +  )
> +{
> +  return VirtioUnmapSharedBuffer (VirtIo, Mapping);
> +}
> 



  reply	other threads:[~2017-08-09 23:49 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-07 11:58 [PATCH v1 00/14] OvmfPkg/Virtio: Add APIs to map system physical to device address Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 01/14] OvmfPkg/Virtio: Introduce new member functions in VIRTIO_DEVICE_PROTOCOL Brijesh Singh
2017-08-09 14:27   ` Laszlo Ersek
2017-08-09 18:23     ` Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 02/14] OvmfPkg/Virtio10Dxe: Implement new member functions Brijesh Singh
2017-08-09 16:50   ` Laszlo Ersek
2017-08-07 11:58 ` [PATCH v1 03/14] OvmfPkg/VirtioPciDeviceDxe: " Brijesh Singh
2017-08-09 17:09   ` Laszlo Ersek
2017-08-10 18:41     ` Brijesh Singh
2017-08-10 19:47       ` Laszlo Ersek
2017-08-07 11:58 ` [PATCH v1 04/14] OvmfPkg/VirtioLib: Add SharedBuffer helper functions Brijesh Singh
2017-08-09 20:30   ` Laszlo Ersek
2017-08-07 11:58 ` [PATCH v1 05/14] OvmfPkg/VirtioLib: Pass VirtIo instance in VringInit/Uinit() Brijesh Singh
2017-08-09 21:13   ` Laszlo Ersek
2017-08-07 11:58 ` [PATCH v1 06/14] OvmfPkg/VirtioLib: Add functions to map/unmap VRING Brijesh Singh
2017-08-09 23:51   ` Laszlo Ersek [this message]
2017-08-07 11:58 ` [PATCH v1 07/14] OvmfPkg/VirtioLib: Use AllocateShared() to allocate vring buffer Brijesh Singh
2017-08-10  0:02   ` Laszlo Ersek
2017-08-07 11:58 ` [PATCH v1 08/14] OvmfPkg/VirtioBlkDxe: Use DeviceAddresses in vring descriptors Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 09/14] OvmfPkg/VirtioScsiDxe: " Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 10/14] OvmfPkg/VirtioNetDxe: Allocate Tx and Rx ring using AllocateSharedPage() Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 11/14] OvmfPkg/VirtioNetDxe: Allocate RxBuf using AllocateSharedPages() Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 12/14] OvmfPkg/VirtioNetDxe: Dynamically allocate transmit header Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 13/14] OvmfPkg/VirtioNetDxe: Use DeviceAddress in transmit vring descriptors Brijesh Singh
2017-08-07 11:58 ` [PATCH v1 14/14] OvmfPkg/VirtioRngDxe: Use DeviceAddresses in " Brijesh Singh
2017-08-10  0:25   ` Laszlo Ersek
2017-08-10  0:46     ` Laszlo Ersek
2017-08-09 14:39 ` [PATCH v1 00/14] OvmfPkg/Virtio: Add APIs to map system physical to device address Laszlo Ersek
2017-08-09 17:35   ` Brijesh Singh
2017-08-09 17:56     ` Laszlo Ersek
2017-08-09 19:29       ` Laszlo Ersek
2017-08-11 22:22       ` Brijesh Singh
2017-08-15 10:42         ` Laszlo Ersek
2017-08-15 19:32           ` Brijesh Singh
2017-08-15 19:48             ` Laszlo Ersek
2017-08-15 20:26               ` Brijesh Singh
2017-08-15 20:39                 ` Laszlo Ersek
2017-08-15 20:44                   ` Brijesh Singh
2017-08-15 21:57                     ` Laszlo Ersek
2017-08-09 22:38 ` Laszlo Ersek
2017-08-09 22:44   ` Brijesh Singh
2017-08-10  9:53     ` Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=01220a3b-565b-8a36-406d-cfcc63265fb7@redhat.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox