• Sujith Sankar's avatar
    enic: Add support for adaptive interrupt coalescing · 7c2ce6e6
    Sujith Sankar authored
    This patch adds support for adaptive interrupt coalescing.
    
    For small pkts with low pkt rate, we can decrease the coalescing interrupt
    dynamically which decreases the latency. This however increases the cpu
    utilization. Based on testing with different coal intr and pkt rate we came up
    with a table(mod_table) with rx_rate and coalescing interrupt value where we
    get low latency without significant increase in cpu. mod_table table stores
    the coalescing timer percentage value for different throughputs.
    
    Function enic_calc_int_moderation() calculates the desired coalescing intr timer
    value. This function is called in driver rx napi_poll. The actual value is set
    by enic_set_int_moderation() which is called when napi_poll is complete. i.e
    when we unmask the rx intr.
    
    Adaptive coal intr is support only when driver is using msix intr. Because
    intr is not shared.
    
    Struct mod_range is used to store only the default adaptive coalescing intr
    value.
    
    Adaptive coal intr calue is calculated by
    
    timer = range_start + ((rx_coal->range_end - range_start) *
    		       mod_table[index].range_percent / 100);
    
    rx_coal->range_end is the rx-usecs-high value set using ethtool.
    range_start is rx-usecs-low, set using ethtool, if rx_small_pkt_bytes_cnt is
    greater than 2 * rx_large_pkt_bytes_cnt. i.e small pkts are dominant. Else its
    rx-usecs-low + 3.
    
    Cc: Christian Benvenuti <benve@cisco.com>
    Cc: Neel Patel <neepatel@cisco.com>
    Signed-off-by: default avatarSujith Sankar <ssujith@cisco.com>
    Signed-off-by: default avatarGovindarajulu Varadarajan <_govind@gmx.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    7c2ce6e6
enic_main.c 62.1 KB