• Karsten Graul's avatar
    net/smc: fix dmb buffer shortage · a9e44502
    Karsten Graul authored
    There is a current limit of 1920 registered dmb buffers per ISM device
    for smc-d. One link group can contain 255 connections, each connection
    is using one dmb buffer. When the connection is closed then the
    registered buffer is held in a queue and is reused by the next
    connection. When a link group is 'full' then another link group is
    created and uses an own buffer pool. The link groups are added to a
    list using list_add() which puts a new link group to the first position
    in the list.
    In the situation that many connections are opened (>1920) and a few of
    them stay open while others are closed quickly we end up with at least 8
    link groups. For a new connection a matching link group is looked up,
    iterating over the list of link groups. The trailing 7 link groups
    all have registered dmb buffers which could be reused, while the first
    link group has only a few dmb buffers and then hit the 1920 limit.
    Because the first link group is not full (255 connection limit not
    reached) it is chosen and finally the connection falls back to TCP
    because there is no dmb buffer available in this link group.
    There are multiple ways to fix that: using list_add_tail() allows
    to scan older link groups first for free buffers which ensures that
    buffers are reused first. This fixes the problem for smc-r link groups
    as well. For smc-d there is an even better way to address this problem
    because smc-d does not have the 255 connections per link group limit.
    So fix the problem for smc-d by allowing large link groups.
    
    Fixes: c6ba7c9b ("net/smc: add base infrastructure for SMC-D and ISM")
    Reviewed-by: default avatarUrsula Braun <ubraun@linux.ibm.com>
    Signed-off-by: default avatarKarsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a9e44502
smc_core.c 50.5 KB