26 Mar, 2016

1 commit

  • Kernel zero day testing warned about address space confusion. A virtual
    iomem address was used where a physical address is expected. The
    offending functions implement an optional part of the api, so they are
    removed. They can be added later, after testing.

    Fixes: a1b3695820aa490e58915d720a1438069813008b

    Signed-off-by: Allen Hubbe
    Acked-by: Xiangliang Yu
    Signed-off-by: Jon Mason

    Allen Hubbe
     

22 Mar, 2016

2 commits


18 Mar, 2016

5 commits

  • kmalloc can fail and we should check for NULL before using the pointer
    returned by kmalloc.

    Signed-off-by: Sudip Mukherjee
    Acked-by: Dave Jiang
    Signed-off-by: Jon Mason

    Sudip Mukherjee
     
  • The perf tool is missing the setup of translation window. Adding call to
    setup the translation window for backed memory.

    Signed-off-by: John Kading
    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • Instead of keep trying to go through the init routine when we aren't able
    to allocate memory, we should just stop and go down.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • We can leave tasklet spinning forever if we disable the tasklet during
    qp shutdown and the tasklets are still being kicked off. This hopefully
    should avoid that race condition.

    Signed-off-by: Dave Jiang
    Reported-by: Alex Depoutovitch
    Tested-by: Alex Depoutovitch
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • The ntb driver assigns between pointers an __iomem tokens, and
    also casts them to 64-bit integers, which results in compiler
    warnings on 32-bit systems:

    drivers/ntb/test/ntb_perf.c: In function 'perf_copy':
    drivers/ntb/test/ntb_perf.c:213:10: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
    vbase = (u64)(u64 *)mw->vbase;
    ^
    drivers/ntb/test/ntb_perf.c:214:14: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
    dst_vaddr = (u64)(u64 *)dst;
    ^

    This adds __iomem annotations where needed and changes the temporary
    variables to iomem pointers to avoid casting them to u64. I did not
    see the problem in linux-next earlier, but it show showed up in
    4.5-rc1.

    Signed-off-by: Arnd Bergmann
    Acked-by: Dave Jiang
    Fixes: 8a7b6a778a85 ("ntb: ntb perf tool")
    Signed-off-by: Jon Mason

    Arnd Bergmann
     

22 Jan, 2016

2 commits

  • If the parameter given to the macro is replaced throughout the macro as
    it is evaluated. The intent is that the macro parameter should replace
    the only the first parameter to container_of(). However, the way the
    macro was written, it would also inadvertantly replace a structure field
    name. If a parameter of any other name is given to the macro, it will
    fail to compile, if the structure does not contain a field of the same
    name. At worst, it will compile, and hide improper access of an
    unintended field in the structure.

    Change the macro parameter name, so it does not conflict with the
    structure field name.

    Signed-off-by: Allen Hubbe
    Acked-by: Dave Jiang
    Signed-off-by: Jon Mason

    Allen Hubbe
     
  • This adds support for AMD's PCI-Express Non-Transparent Bridge
    (NTB) device on the Zeppelin platform. The driver connnects to the
    standard NTB sub-system interface, with modification to add hooks
    for power management in a separate patch. The AMD NTB device has 3
    memory windows, 16 doorbell, 16 scratch-pad registers, and supports
    up to 16 PCIe lanes running a Gen3 speeds.

    Signed-off-by: Xiangliang Yu
    Reviewed-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Xiangliang Yu
     

18 Jan, 2016

1 commit

  • Providing raw performance data via a tool that directly access data from
    NTB w/o any software overhead. This allows measurement of the hardware
    performance limit. In revision one we are only doing single direction
    CPU and DMA writes. Eventually we will provide bi-directional writes.

    The measurement using DMA engine for NTB performance measure does
    not measure the raw performance of DMA engine over NTB due to software
    overhead. But it should provide the peak performance through the Linux DMA
    driver.

    Signed-off-by: Dave Jiang
    Tested-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Dave Jiang
     

11 Jan, 2016

3 commits

  • The transport right now does not handle the case where we run out of DMA
    descriptors. We just fail when we do not succeed. Adding code to retry for
    a bit attempting to use the DMA engine instead of instantly fail to CPU
    copy.

    Signed-off-by: Dave Jiang
    Reviewed-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • The lower bits read from a BAR register will contain property bits
    that we do not care about. Clear those so that we can use the BAR
    values for limit and xlat registers.

    Reported-by: Conrad Meyer
    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • The transmit overrun avoidance error path in ntb_process_tx accidentally
    swapped the first two values being passed to the tx_handler client.
    This could result in crashes in the ntb_netdev (or other out-of-tree NTB
    clients).

    Reported-by: Alex Depoutovitch
    Signed-off-by: Jon Mason

    Jon Mason
     

09 Nov, 2015

6 commits

  • resource_size_t may be 32-bit wide on some architectures, which causes
    this warning when building the NTB code:

    drivers/ntb/ntb_transport.c: In function 'ntb_transport_link_work':
    drivers/ntb/ntb_transport.c:828:46: warning: right shift count >= width of type [-Wshift-count-overflow]

    The warning is harmless but can be avoided by using the upper_32_bits()
    macro.

    Signed-off-by: Arnd Bergmann
    Fixes: e26a5843f7f5 ("NTB: Split ntb_hw_intel and ntb_transport drivers")
    Signed-off-by: Jon Mason

    Arnd Bergmann
     
  • There is no need for the upstream and downstream addresses to be different
    for the NTB configs. Go to using a single set of address. It is still
    possible to configure them differently using module parameter override
    however.

    Signed-off-by: Dave Jiang
    Acked and Tested-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • Order of operations issue with the QP Num and MW count, which would
    result in the receive buffer pointer being invalid if there are more
    than 1 MW. Corrected with parenthesis to enforce the proper order of
    operations.

    Reported-by: John I. Kading
    Signed-off-by: Jon Mason

    Jon Mason
     
  • These variables were not used anywhere. So remove them.

    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Jon Mason

    Sudip Mukherjee
     
  • We were accessing nt->mw_vec after freeing it. Fix the error path so
    that we free nt->mw_vec after we have finished using it.

    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Jon Mason

    Sudip Mukherjee
     
  • smatch detected an issue in the function ntb_transport_max_size() where
    we could be dereferencing a dma channel pointer when it is NULL.

    Reported-by: Dan Carpenter
    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     

08 Sep, 2015

8 commits

  • The range check must exclude the upper bound.

    Signed-off-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Allen Hubbe
     
  • Check that b2b_mw_idx is in range of the number of memory windows when
    initializing the device. The workaround is considered to be in effect
    only if the device b2b_idx is exactly UINT_MAX, instead of any index
    past the last memory window.

    Only print B2B MW workaround information in debugfs if the workaround is
    in effect.

    Signed-off-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Allen Hubbe
     
  • Allocate two DMA channels, one for TX operation and one for RX
    operation, instead of having one DMA channel for everything. This
    provides slightly better performance, and also will make error handling
    cleaner later on.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • The dma_sync_wait can hurt the performance of workloads mixed with both
    large and small frames. Large frames will be copied using the dma
    engine. Small frames will be copied by the cpu. The dma_sync_wait
    prevents the cpu and dma engine copying in parallel.

    In the period where the cpu is copying, the dma engine is stopped. The
    dma engine is not doing any useful work to copy large frames during that
    time, and the additional time to restart the dma engine for the next
    large frame. This will decrease the throughput for the portion of a
    workload with large frames.

    In the period where the dma engine is copying, the cpu is held up
    waiting for dma to complete. The small frames processing will be
    delayed until the dma is complete. The RX frames are completed
    in-order, and the processing of small frames takes very little time, so
    dma_sync_wait may have an insignificant impact on the respose time of
    frames. The more significant impact is to the system, because the delay
    in dma_sync_wait is implemented as busy non-blocking wait. This can
    prevent the delayed core from doing any useful work, even if it could be
    processing work for other drivers, unrelated to transport RX processing.

    After applying the earlier patch to fix out-of-order RX acknoledgement,
    the dma_sync_wait is no longer necessary. Remove it, so that cpu memcpy
    will proceed immediately for small frames, in parallel with ongoing dma
    for large frames. Do not hold up the cpu from doing work while dma is
    in progress. The prior fix will continue to ensure in-order completion
    of the RX frames to the upper layer, and in-order delivery of the RX
    acknoledgement.

    Signed-off-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Allen Hubbe
     
  • Make QP stats info more readable for debugging purposes. Also add an
    entry to indicate whether DMA is being used.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • The list should be added from the bottom and not the top in order to
    ensure the transport is provided in the same order to clients as ntb
    devices are discovered.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • Adding PCI Device IDs for B2B (back to back), RP (root port, primary),
    and TB (transparent bridge, secondary) devices.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • Right now if we push the NTB really hard, we start dropping packets due
    to not able to process the packets fast enough. We need to st:qop the
    upper layer from flooding us when that happens.

    A timer is necessary in order to restart the queue once the resource has
    been processed on the receive side. Due to the way NTB is setup, the
    resources on the tx side are tied to the processing of the rx side and
    there's no async way to know when the rx side has released those
    resources.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     

10 Aug, 2015

7 commits

  • Avoid any chance of format string expansion when calling dev_set_name.

    Signed-off-by: Kees Cook
    Signed-off-by: Jon Mason

    Kees Cook
     
  • Remove early dereference of a pointer that is checked later in the code.

    Reported-by: Dan Carpenter
    Signed-off-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Allen Hubbe
     
  • A plain 32 bit integer will overflow for values over 4GiB.

    Change the plain integer size to the appropriate size type in
    ntb_set_mw. Change the type of the size parameter and two local
    variables used for size.

    Even if there is no overflow, a size of zero is invalid here.

    Reported-by: Juyoung Jung
    Signed-off-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Allen Hubbe
     
  • Schedule to receive on QP link up, to make sure that the doorbell is
    properly cleared for interrupts.

    Signed-off-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Allen Hubbe
     
  • When the remote side is not up, we do not have all the context for the
    transport, and that causes NULL ptr access. Have the debugfs reads check
    to see if transport is up before we make access.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • Currently the debugfs does not have files for all NTB transport queue
    pairs. When there are multiple NTBs present in a system, the QP names
    of the last transport clobber the names of previously added transport
    QPs. Only the last added QPs can be observed via debugfs.

    Create a directory per NTB transport to associate the QPs with that
    transport. Name the directory the same as the PCI device.

    Signed-off-by: Dave Jiang
    Signed-off-by: Jon Mason

    Dave Jiang
     
  • It was possible for a synchronous update of the RX index in the error
    case to get ahead of the asynchronous RX index update in the normal
    case. Change the RX processing to preserve an RX completion order.

    There were two error cases. First, if a buffer is not present to
    receive data, there would be no queue entry to preserve the RX
    completion order. Instead of dropping the RX frame, leave the RX frame
    in the ring. Schedule RX processing when RX entries are enqueued, in
    case there are RX frames waiting in the ring to be received.

    Second, if a buffer is too small to receive data, drop the frame in the
    ring, mark the RX entry as done, and indicate the error in the RX entry
    length. Check for a negative length in the receive callback in
    ntb_netdev, and count occurrences as rx_length_errors.

    Signed-off-by: Allen Hubbe
    Signed-off-by: Jon Mason

    Allen Hubbe
     

05 Jul, 2015

5 commits