• 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.
       - iperf SMP x86_64 ->
       Client connecting to, TCP port 5001
       TCP window size: 85.0 KByte (default)
       [  3] local port 38888 connected with 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:  Bcast:  Mask:
              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
       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>