Skip to content
  • Thadeu Lima de Souza Cascardo's avatar
    mlx4_en: map entire pages to increase throughput · 4cce66cd
    Thadeu Lima de Souza Cascardo authored
    
    
    In its receive path, mlx4_en driver maps each page chunk that it pushes
    to the hardware and unmaps it when pushing it up the stack. This limits
    throughput to about 3Gbps on a Power7 8-core machine.
    
    One solution is to map the entire allocated page at once. However, this
    requires that we keep track of every page fragment we give to a
    descriptor. We also need to work with the discipline that all fragments will
    be released (in the sense that it will not be reused by the driver
    anymore) in the order they are allocated to the driver.
    
    This requires that we don't reuse any fragments, every single one of
    them must be reallocated. We do that by releasing all the fragments that
    are processed and only after finished processing the descriptors, we
    start the refill.
    
    We also must somehow guarantee that we either refill all fragments in a
    descriptor or none at all, without resorting to giving up a page
    fragment that we would have already given. Otherwise, we would break the
    discipline of only releasing the fragments in the order they were
    allocated.
    
    This has passed page allocation fault injections (restricted to the
    driver by using required-start and required-end) and device hotplug
    while 16 TCP streams were able to deliver more than 9Gbps.
    
    Signed-off-by: default avatarThadeu Lima de Souza Cascardo <cascardo@linux.vnet.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4cce66cd