* [dpdk-dev] [Bug 440] net/mlx5: Read of "out_of_buffer" using fopen/fread/fclose causing TLB shootdowns due to mmap/munmap
@ 2020-04-06 4:10 bugzilla
0 siblings, 0 replies; only message in thread
From: bugzilla @ 2020-04-06 4:10 UTC (permalink / raw)
To: dev
https://bugs.dpdk.org/show_bug.cgi?id=440
Bug ID: 440
Summary: net/mlx5: Read of "out_of_buffer" using
fopen/fread/fclose causing TLB shootdowns due to
mmap/munmap
Product: DPDK
Version: 19.11
Hardware: x86
OS: Linux
Status: UNCONFIRMED
Severity: normal
Priority: Normal
Component: ethdev
Assignee: dev@dpdk.org
Reporter: mohsinshaikh@niometrics.com
Target Milestone: ---
Created attachment 86
--> https://bugs.dpdk.org/attachment.cgi?id=86&action=edit
Potential fix patch
Setup: HPE ProLiant DL560 Gen10 Server with 4 x "Intel(R) Xeon(R) Platinum
8180M CPU @ 2.50GHz" and 6TB of memory (1 TB reserved huge pages) with 2 X
"Mellanox Technologies ConnectX®-5 EN network interface card, 100GbE
single-port QSFP28, PCIe3.0 x16, tall bracket; MCX515A-CCAT". OS is Centos 7
with kernel 3.10.0-957.27.2.el7.x86_64.
While testing I noticed that the rx cores of the DPDK app were getting TLB
shootdowns periodically. After debugging I found that the stats thread of the
DPDK app was responsible for those. Specifically the read of "out_of_buffer"
stat:
static inline void
mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat)
{
FILE *file;
if (priv->sh) {
MKSTR(path, "%s/ports/%d/hw_counters/%s",
priv->sh->ibdev_path,
priv->ibv_port,
ctr_name);
file = fopen(path, "rb");
if (file) {
int n = fscanf(file, "%" SCNu64, stat); <----- Calls
mmap().
fclose(file); <---- Calls munmap which leads to TLB
shootdown
if (n == 1)
return;
}
}
*stat = 0;
}
NOTE: We almost exclusively use huge pages in the DPDK app for allocations.
Stack traces:
(gdb) where
#0 __mmap (addr=addr@entry=0x0, len=4096, prot=prot@entry=3,
flags=flags@entry=34, fd=fd@entry=-1, offset=offset@entry=0) at
../sysdeps/unix/sysv/linux/wordsize-64/mmap.c:32
#1 0x00007fffdeaf8ed1 in __GI__IO_file_doallocate (fp=0x2b52263ae000) at
filedoalloc.c:127
#2 0x00007fffdeb07d07 in __GI__IO_doallocbuf (fp=fp@entry=0x2b52263ae000) at
genops.c:399
#3 0x00007fffdeb06c8c in _IO_new_file_underflow (fp=0x2b52263ae000) at
fileops.c:557
#4 0x00007fffdeb07dd2 in __GI__IO_default_uflow (fp=0x2b52263ae000) at
genops.c:414
#5 0x00007fffdeae7efa in _IO_vfscanf_internal (s=<optimized out>,
format=<optimized out>, argptr=argptr@entry=0x7fff51f07498,
errp=errp@entry=0x0) at vfscanf.c:600
#6 0x00007fffdeaed617 in ___vfscanf (s=<optimized out>, format=<optimized
out>, argptr=argptr@entry=0x7fff51f07498) at vfscanf.c:2942
#7 0x00007fffdeaf6247 in __fscanf (stream=<optimized out>, format=<optimized
out>) at fscanf.c:31
#8 0x00007fffe632ee9f in mlx5_stats_get () from
/opt/nio/dpdk/lib/librte_pmd_mlx5.so.20.0
#9 0x00007fffeee6b468 in rte_eth_stats_get () from
/opt/nio/dpdk/lib/librte_ethdev.so.20.0
Breakpoint 2, munmap () at ../sysdeps/unix/syscall-template.S:81
81 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
(gdb) where
#0 munmap () at ../sysdeps/unix/syscall-template.S:81
#1 0x00007fffdeb07cb2 in __GI__IO_setb (f=f@entry=0x2b52263ae000,
b=b@entry=0x0, eb=eb@entry=0x0, a=a@entry=0) at genops.c:383
#2 0x00007fffdeb06090 in _IO_new_file_close_it (fp=fp@entry=0x2b52263ae000) at
fileops.c:192
#3 0x00007fffdeaf9138 in _IO_new_fclose (fp=0x2b52263ae000) at iofclose.c:58
#4 0x00007fffe632eeaa in mlx5_stats_get () from
/opt/nio/dpdk/lib/librte_pmd_mlx5.so.20.0
#5 0x00007fffeee6b468 in rte_eth_stats_get () from
/opt/nio/dpdk/lib/librte_ethdev.so.20.0
Output from kernel tracing (using trace-cmd):
<...>-120694 [000] 502442.376421: function:
native_flush_tlb_others
<...>-120694 [000] 502442.376423: kernel_stack: <stack
trace>
=> tlb_flush_mmu.part.76 (ffffffffa89e57d7)
=> tlb_finish_mmu (ffffffffa89e70d5)
=> unmap_region (ffffffffa89f0754)
=> do_munmap (ffffffffa89f2d45)
=> vm_munmap (ffffffffa89f2f85)
=> SyS_munmap (ffffffffa89f4212)
=> tracesys (ffffffffa8f7706b)
<...>-120324 [002] 502442.382250: function:
flush_tlb_func
<...>-120323 [001] 502442.382250: function:
flush_tlb_func
<...>-120325 [003] 502442.382251: function:
flush_tlb_func
<...>-120327 [005] 502442.382251: function:
flush_tlb_func
<...>-120326 [004] 502442.382251: function:
flush_tlb_func
<...>-120332 [010] 502442.382251: function:
flush_tlb_func
<...>-120324 [002] 502442.382252: kernel_stack: <stack
trace>
=> generic_smp_call_function_single_interrupt (ffffffffa8912ea3)
=> smp_call_function_interrupt (ffffffffa885737d)
=> call_function_interrupt (ffffffffa8f79382)
The following patch seems to fix the issue:
=========================================================================
commit e4e93bd3ffb4e75b2178b0fdfe12341bfddf171d
Author: Mohsin Shaikh <mohsinshaikh@niometrics.com>
Date: Tue Mar 31 14:28:41 2020 +0800
net/mlx5: Use open/read/close for reading ib stat
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
index 205e4fe..769f080 100644
--- a/drivers/net/mlx5/mlx5_stats.c
+++ b/drivers/net/mlx5/mlx5_stats.c
@@ -8,6 +8,8 @@
#include <linux/ethtool.h>
#include <stdint.h>
#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
#include <rte_ethdev_driver.h>
#include <rte_common.h>
@@ -139,20 +141,22 @@
static inline void
mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t
*stat)
{
- FILE *file;
+ int fd;
if (priv->sh) {
MKSTR(path, "%s/ports/%d/hw_counters/%s",
priv->sh->ibdev_path,
priv->ibv_port,
ctr_name);
- file = fopen(path, "rb");
- if (file) {
- int n = fscanf(file, "%" SCNu64, stat);
-
- fclose(file);
- if (n == 1)
+ fd = open(path, O_RDONLY);
+ if (fd != -1) {
+ char buf[32];
+ ssize_t n = read(fd, buf, sizeof(buf));
+ close(fd);
+ if (n != -1) {
+ sscanf(buf, "%lu", stat);
return;
+ }
}
}
*stat = 0;
=========================================================================
Patch attached to bug.
These TLB shootdowns lead to packets being dropped sporadically by the mlx5
NICs with the "rx_discards_phy" counter being incremented. The above patch
significantly reduced the drops in our app.
--
You are receiving this mail because:
You are the assignee for the bug.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-04-06 4:10 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-06 4:10 [dpdk-dev] [Bug 440] net/mlx5: Read of "out_of_buffer" using fopen/fread/fclose causing TLB shootdowns due to mmap/munmap bugzilla
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).