• Zhu Yanjun's avatar
    forcedeth: use per cpu to collect xmit/recv statistics · f4b633b9
    Zhu Yanjun authored
    When testing with a background iperf pushing 1Gbit/sec traffic and running
    both ifconfig and netstat to collect statistics, some deadlocks occurred.
    
    Ifconfig and netstat will call nv_get_stats64 to get software xmit/recv
    statistics. In the commit f5d827ae ("forcedeth: implement
    ndo_get_stats64() API"), the normal tx/rx variables is to collect tx/rx
    statistics. The fix is to replace normal tx/rx variables with per
    cpu 64-bit variable to collect xmit/recv statistics. The per cpu variable
    will avoid deadlocks and provide fast efficient statistics updates.
    
    In nv_probe, the per cpu variable is initialized. In nv_remove, this
    per cpu variable is freed.
    
    In xmit/recv process, this per cpu variable will be updated.
    
    In nv_get_stats64, this per cpu variable on each cpu is added up. Then
    the driver can get xmit/recv packets statistics.
    
    A test runs for several days with this commit, the deadlocks disappear
    and the performance is better.
    
    Tested:
       - iperf SMP x86_64 ->
       Client connecting to 1.1.1.108, TCP port 5001
       TCP window size: 85.0 KByte (default)
       ------------------------------------------------------------
       [  3] local 1.1.1.105 port 38888 connected with 1.1.1.108 port 5001
       [ ID] Interval       Transfer     Bandwidth
       [  3]  0.0-10.0 sec  1.10 GBytes   943 Mbits/sec
    
       ifconfig results:
    
       enp0s9 Link encap:Ethernet  HWaddr 00:21:28:6f:de:0f
              inet addr:1.1.1.105  Bcast:0.0.0.0  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:5774764531 errors:0 dropped:0 overruns:0 frame:0
              TX packets:633534193 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:7646159340904 (7.6 TB) TX bytes:11425340407722 (11.4 TB)
    
       netstat results:
    
       Kernel Interface table
       Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
       ...
       enp0s9 1500 0  5774764531 0    0 0      633534193      0      0  0 BMRU
       ...
    
    Fixes: f5d827ae
    
     ("forcedeth: implement ndo_get_stats64() API")
    CC: Joe Jin <joe.jin@oracle.com>
    CC: JUNXIAO_BI <junxiao.bi@oracle.com>
    Reported-and-tested-by: default avatarNan san <nan.1986san@gmail.com>
    Signed-off-by: default avatarZhu Yanjun <yanjun.zhu@oracle.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f4b633b9