lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <000601d254f7$5b6f1eb0$124d5c10$@dell.com>
Date:   Mon, 12 Dec 2016 23:14:09 -0500
From:   "Allen Hubbe" <Allen.Hubbe@...l.com>
To:     "'Serge Semin'" <fancer.lancer@...il.com>, <jdmason@...zu.us>,
        <dave.jiang@...el.com>, <Xiangliang.Yu@....com>
Cc:     <Sergey.Semin@...latforms.ru>, <linux-ntb@...glegroups.com>,
        <linux-kernel@...r.kernel.org>
Subject: RE: [PATCH v2 7/9] NTB: Add new Memory Windows API documentation

From: Serge Semin
> Since the new API slightly changes the way a typical NTB client driver
> works, the documentation file needs to be appropriately updated.
> 
> Signed-off-by: Serge Semin <fancer.lancer@...il.com>

Acked-by: Allen Hubbe <Allen.Hubbe@...l.com>

> 
> ---
>  Documentation/ntb.txt | 99 ++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 91 insertions(+), 8 deletions(-)
> 
> diff --git a/Documentation/ntb.txt b/Documentation/ntb.txt
> index 1d9bbab..d01bb69 100644
> --- a/Documentation/ntb.txt
> +++ b/Documentation/ntb.txt
> @@ -1,14 +1,16 @@
>  # NTB Drivers
> 
>  NTB (Non-Transparent Bridge) is a type of PCI-Express bridge chip that connects
> -the separate memory systems of two computers to the same PCI-Express fabric.
> -Existing NTB hardware supports a common feature set, including scratchpad
> -registers, doorbell registers, and memory translation windows.  Scratchpad
> -registers are read-and-writable registers that are accessible from either side
> -of the device, so that peers can exchange a small amount of information at a
> -fixed address.  Doorbell registers provide a way for peers to send interrupt
> -events.  Memory windows allow translated read and write access to the peer
> -memory.
> +the separate memory systems of two or more computers to the same PCI-Express
> +fabric. Existing NTB hardware supports a common feature set: doorbell
> +registers and memory translation windows, as well as non common features like
> +scratchpad and message registers. Scratchpad registers are read-and-writable
> +registers that are accessible from either side of the device, so that peers can
> +exchange a small amount of information at a fixed address. Message registers can
> +be utialized for the same purpose. Additionally they are provided with with
> +special status bits to make sure the information isn't rewritten by another
> +peer. Doorbell registers provide a way for peers to send interrupt events.
> +Memory windows allow translated read and write access to the peer memory.
> 
>  ## NTB Core Driver (ntb)
> 
> @@ -26,6 +28,87 @@ as ntb hardware, or hardware drivers, are inserted and removed.  The
>  registration uses the Linux Device framework, so it should feel familiar to
>  anyone who has written a pci driver.
> 
> +### NTB Typical client driver implementation
> +
> +Primary purpose of NTB is to share some peace of memory between at least two
> +systems. So the NTB device features like Scratchpad/Message regiesters are
> +mainly used to perform the proper memory window initialization. Typically
> +there are two types of memory window interfaces supported by the NTB API:
> +inbound translation configured on the local ntb port and outbound translation
> +configured by the peer, on the peer ntb port. The first type is
> +depicted on the next figure
> +
> +Inbound translation:
> + Memory:              Local NTB Port:      Peer NTB Port:      Peer MMIO:
> +  ____________
> + | dma-mapped |-ntb_mw_set_trans(addr)  |
> + | memory     |        _v____________   |   ______________
> + | (addr)     |<======| MW xlat addr |<====| MW base addr |<== memory-mapped IO
> + |------------|       |--------------|  |  |--------------|
> +
> +So typical scenario of the first type memory window initialization looks:
> +1) allocate a memory region, 2) put translated address to NTB config,
> +3) somehow notify a peer device of performed initialization, 4) peer device
> +maps corresponding outbound memory window so to have access to the shared
> +memory region.
> +
> +The second type of interface, that implies the shared windows being
> +initialized by a peer device, is depicted on the figure:
> +
> +Outbound translation:
> + Memory:        Local NTB Port:    Peer NTB Port:      Peer MMIO:
> +  ____________                      ______________
> + | dma-mapped |                |   | MW base addr |<== memory-mapped IO
> + | memory     |                |   |--------------|
> + | (addr)     |<===================| MW xlat addr |<-ntb_peer_mw_set_trans(addr)
> + |------------|                |   |--------------|
> +
> +Typical scenario of the second type interface initialization would be:
> +1) allocate a memory region, 2) somehow deliver a translated address to a peer
> +device, 3) peer puts the translated address to NTB config, 4) peer device maps
> +outbound memory window so to have access to the shared memory region.
> +
> +As one can see the described scenarios can be combined in one portable
> +algorithm.
> + Local device:
> +  1) Allocate memory for a shared window
> +  2) Initialize memory window by translated address of the allocated region
> +     (it may fail if local memory window initialzation is unsupported)
> +  3) Send the translated address and memory window index to a peer device
> + Peer device:
> +  1) Initialize memory window with retrieved address of the allocated
> +     by another device memory region (it may fail if peer memory window
> +     initialization is unsupported)
> +  2) Map outbound memory window
> +
> +In accordance with this scenario, the NTB Memory Window API can be used as
> +follows:
> + Local device:
> +  1) ntb_mw_count(pidx) - retrieve number of memory ranges, which can
> +     be allocated for memory windows between local device and peer device
> +     of port with specified index.
> +  2) ntb_get_align(pidx, midx) - retrieve parameters restricting the
> +     shared memory region alignment and size. Then memory can be properly
> +     allocated.
> +  3) Allocate physically contiguous memory region in complience with
> +     restrictions retrieved in 2).
> +  4) ntb_mw_set_trans(pidx, midx) - try to set translation address of
> +     the memory window with specified index for the defined peer device
> +     (it may fail if local translated address setting is not supported)
> +  5) Send translated base address (usually together with memory window
> +     number) to the peer device using, for instance, scratchpad or message
> +     registers.
> + Peer device:
> +  1) ntb_peer_mw_set_trans(pidx, midx) - try to set received from other
> +     device (related to pidx) translated address for specified memory
> +     window. It may fail if retrieved address, for instance, exceeds
> +     maximum possible address or isn't properly aligned.
> +  2) ntb_peer_mw_get_addr(widx) - retrieve MMIO address to map the memory
> +     window so to have an access to the shared memory.
> +
> +Also it is worth to note, that method ntb_mw_count(pidx) should return the
> +same value as ntb_peer_mw_count() on the peer with port index - pidx.
> +
>  ### NTB Transport Client (ntb\_transport) and NTB Netdev (ntb\_netdev)
> 
>  The primary client for NTB is the Transport client, used in tandem with NTB
> --
> 2.6.6


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ