• dpdk eal_get_virtual_area + rte_config.mem_config


    static int
    rte_eal_config_create(void)
    {
            size_t page_sz = sysconf(_SC_PAGE_SIZE);
            size_t cfg_len = sizeof(*rte_config.mem_config);
            size_t cfg_len_aligned = RTE_ALIGN(cfg_len, page_sz);
            void *rte_mem_cfg_addr, *mapped_mem_cfg_addr;
            int retval;
    
            const char *pathname = eal_runtime_config_path();
    
            if (internal_config.no_shconf)
                    return 0;
    
            /* map the config before base address so that we don't waste a page */
            if (internal_config.base_virtaddr != 0)
                    rte_mem_cfg_addr = (void *)
                            RTE_ALIGN_FLOOR(internal_config.base_virtaddr -
                            sizeof(struct rte_mem_config), page_sz);
            else
                    rte_mem_cfg_addr = NULL;
    
            if (mem_cfg_fd < 0){
                    mem_cfg_fd = open(pathname, O_RDWR | O_CREAT, 0600);
                    if (mem_cfg_fd < 0) {
                            RTE_LOG(ERR, EAL, "Cannot open '%s' for rte_mem_config
    ",
                                    pathname);
                            return -1;
                    }
            }
    retval = ftruncate(mem_cfg_fd, cfg_len);
            if (retval < 0){
                    close(mem_cfg_fd);
                    mem_cfg_fd = -1;
                    RTE_LOG(ERR, EAL, "Cannot resize '%s' for rte_mem_config
    ",
                            pathname);
                    return -1;
            }
    
            retval = fcntl(mem_cfg_fd, F_SETLK, &wr_lock);
            if (retval < 0){
                    close(mem_cfg_fd);
                    mem_cfg_fd = -1;
                    RTE_LOG(ERR, EAL, "Cannot create lock on '%s'. Is another primary "
                            "process running?
    ", pathname);
                    return -1;
            }
    
            /* reserve space for config */
            rte_mem_cfg_addr = eal_get_virtual_area(rte_mem_cfg_addr,
                            &cfg_len_aligned, page_sz, 0, 0);
            if (rte_mem_cfg_addr == NULL) {
                    RTE_LOG(ERR, EAL, "Cannot mmap memory for rte_config
    ");
                    close(mem_cfg_fd);
                    mem_cfg_fd = -1;
                    return -1;
            }
    
            /* remap the actual file into the space we've just reserved */
            mapped_mem_cfg_addr = mmap(rte_mem_cfg_addr,
                            cfg_len_aligned, PROT_READ | PROT_WRITE,
                    MAP_SHARED | MAP_FIXED, mem_cfg_fd, 0);
            if (mapped_mem_cfg_addr == MAP_FAILED) {
                    RTE_LOG(ERR, EAL, "Cannot remap memory for rte_config
    ");
                    munmap(rte_mem_cfg_addr, cfg_len);
                    close(mem_cfg_fd);
                    mem_cfg_fd = -1;
                    return -1;
            }
    
            memcpy(rte_mem_cfg_addr, &early_mem_config, sizeof(early_mem_config));
            rte_config.mem_config = rte_mem_cfg_addr;
    
            /* store address of the config in the config itself so that secondary
             * processes could later map the config into this exact location
             */
            rte_config.mem_config->mem_cfg_addr = (uintptr_t) rte_mem_cfg_addr;
    
            return 0;
    }
  • 相关阅读:
    个人阅读作业
    软件工程基础/个人项目1
    个人阅读作业3
    个人阅读作业2
    代码复审
    软件工程:结对编程1
    个人阅读作业
    软工作业1:单词统计
    有关敏捷开发的一点感想[110617班 刘耀先]
    Pair Project: Elevator Scheduler [电梯调度算法的实现和测试][关于电梯调度算法的附加思考]:刘耀先-11061183,罗凡-11061174
  • 原文地址:https://www.cnblogs.com/dream397/p/13590951.html
Copyright © 2020-2023  润新知