rte_fbarray_init
eal_get_fbarray_path(path, sizeof(path), name); /* * Each fbarray is unique to process namespace, i.e. the * filename depends on process prefix. Try to take out a lock * and see if we succeed. If we don't, someone else is using it * already. */ fd = open(path, O_CREAT | O_RDWR, 0600);
rte_fbarray_init data = eal_get_virtual_area(NULL, &mmap_len, page_sz, 0, 0); eal_get_fbarray_path(path, sizeof(path), name); fd = open(path, O_CREAT | O_RDWR, 0600); resize_and_map(fd, data, mmap_len) arr->data = data;
void * eal_get_virtual_area(void *requested_addr, size_t *size, size_t page_sz, int flags, int mmap_flags) { /* ... */ /* 映射虚拟地址 */ mapped_addr = mmap(requested_addr, (size_t)map_sz, PROT_READ, mmap_flags, -1, 0); /* 经过了简化,去除了地址对齐 */ aligned_addr = mapped_addr : /* 如果 `requested_addr` 和 `aligned_addr` 不匹配。则提示出错 */ if (requested_addr != NULL && aligned_addr != requested_addr) { RTE_LOG(ERR, EAL, "Cannot get a virtual area at requested address: %p (got %p) ", requested_addr, aligned_addr); munmap(mapped_addr, map_sz); rte_errno = EADDRNOTAVAIL; return NULL; } return aligned_addr; }
[root@localhost memzone]# gdb build/app/TestMalloc GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "aarch64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /data1/dpdk-19.11/demo/memzone/build/app/TestMalloc...done. (gdb) b /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:713 Breakpoint 1 at 0x5afeac: file /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c, line 713. (gdb) set args 3 -c 0xf (gdb) r Starting program: /data1/dpdk-19.11/demo/memzone/build/app/TestMalloc 3 -c 0xf [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". EAL: Detected 128 lcore(s) EAL: Detected 4 NUMA nodes [New Thread 0xffffbe43d910 (LWP 129851)] EAL: Multi-process socket /var/run/dpdk/rte/mp_socket [New Thread 0xffffbdc2d910 (LWP 129852)] EAL: Selected IOVA mode 'PA' EAL: No available hugepages reported in hugepages-2048kB EAL: Probing VFIO support... EAL: VFIO support initialized Breakpoint 1, rte_fbarray_init (arr=0x100000028, name=0xbc8488 "memzone", len=2560, elt_sz=72) at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:719 719 struct mem_area *ma = NULL; (gdb) bt #0 rte_fbarray_init (arr=0x100000028, name=0xbc8488 "memzone", len=2560, elt_sz=72) at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:719 #1 0x000000000059f2c8 in rte_eal_memzone_init () at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_memzone.c:376 #2 0x000000000058a5a8 in rte_eal_init (argc=4, argv=0xfffffffff518) at /data1/dpdk-19.11/lib/librte_eal/linux/eal/eal.c:1170 #3 0x0000000000464d24 in main (argc=4, argv=0xfffffffff518) at /data1/dpdk-19.11/demo/memzone/main.c:40 (gdb)
rte_fbarray_init(struct rte_fbarray *arr, const char *name, unsigned int len, unsigned int elt_sz)
Breakpoint 1, rte_fbarray_init (arr=0x100000028, name=0xbc8488 "memzone", len=2560, elt_sz=72) at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:719 719 struct mem_area *ma = NULL; (gdb) bt #0 rte_fbarray_init (arr=0x100000028, name=0xbc8488 "memzone", len=2560, elt_sz=72) at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:719 #1 0x000000000059f2c8 in rte_eal_memzone_init () at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_memzone.c:376 #2 0x000000000058a5a8 in rte_eal_init (argc=4, argv=0xfffffffff518) at /data1/dpdk-19.11/lib/librte_eal/linux/eal/eal.c:1170 #3 0x0000000000464d24 in main (argc=4, argv=0xfffffffff518) at /data1/dpdk-19.11/demo/memzone/main.c:40 (gdb) list 714 unsigned int elt_sz) 715 { 716 size_t page_sz, mmap_len; 717 char path[PATH_MAX]; 718 struct used_mask *msk; 719 struct mem_area *ma = NULL; 720 void *data = NULL; 721 int fd = -1; 722 723 if (arr == NULL) { (gdb) b /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:745 Breakpoint 2 at 0x5aff88: file /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c, line 745. (gdb) c Continuing. Breakpoint 2, rte_fbarray_init (arr=0x100000028, name=0xbc8488 "memzone", len=2560, elt_sz=72) at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:745 745 mmap_len = calc_data_size(page_sz, elt_sz, len); (gdb) Continuing. Breakpoint 1, rte_fbarray_init (arr=0x1000000b0, name=0xfffffffff090 "memseg-524288k-0-0", len=64, elt_sz=48) at /data1/dpdk-19.11/lib/librte_eal/common/eal_common_fbarray.c:719 719 struct mem_area *ma = NULL; (gdb) n 720 void *data = NULL; (gdb) n 721 int fd = -1; (gdb) n 723 if (arr == NULL) { (gdb) n 728 if (fully_validate(name, elt_sz, len)) (gdb) p *arr $1 = {name = '