rte_fbarray_init

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 = '