• dpdk driver probe


    参考:  https://blog.csdn.net/jeawayfox/article/details/105444104

    net/hns3/hns3_ethdev.c:4918:    return rte_eth_dev_pci_generic_probe(pci_dev,

    rte_eal_init
       rte_bus_scan 
           rte_pci_scan
            rte_bus_probe
    rte_eth_dev_pci_generic_probe(struct rte_pci_device *pci_dev,
            size_t private_data_size, eth_dev_pci_callback_t dev_init)
    {
            struct rte_eth_dev *eth_dev;
            int ret;
    
            eth_dev = rte_eth_dev_pci_allocate(pci_dev, private_data_size);
            if (!eth_dev)
                    return -ENOMEM;
    
            RTE_FUNC_PTR_OR_ERR_RET(*dev_init, -EINVAL);
            ret = dev_init(eth_dev);
            if (ret)
                    rte_eth_dev_pci_release(eth_dev);
            else
                    rte_eth_dev_probing_finish(eth_dev);
    
            return ret;
    }
    rte_eth_dev_pci_allocate
         rte_eth_dev_allocate(name)
    struct rte_eth_dev *
    rte_eth_dev_allocated(const char *name)
    {
            struct rte_eth_dev *ethdev;
    
            rte_eth_dev_shared_data_prepare();
    
            rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
    
            ethdev = _rte_eth_dev_allocated(name);
    
            rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
    
            return ethdev;
    }
    static struct rte_eth_dev *
    _rte_eth_dev_allocated(const char *name)
    {
            unsigned i;
    
            for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
                    if (rte_eth_devices[i].data != NULL &&
                        strcmp(rte_eth_devices[i].data->name, name) == 0)
                            return &rte_eth_devices[i];
            }
            return NULL;
    }
    struct rte_eth_dev *
    rte_eth_dev_allocate(const char *name)
    {
        uint16_t port_id;
        struct rte_eth_dev *eth_dev = NULL;
        
        //申请进程间共享的data数据,用作挂到eth_dev->data下。
        rte_eth_dev_shared_data_prepare();
    
        /* Synchronize port creation between primary and secondary threads. */
        rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
        
        //check一下,此name是否已经被申请。
        if (_rte_eth_dev_allocated(name) != NULL) {
            RTE_ETHDEV_LOG(ERR,
                "Ethernet device with name %s already allocated
    ",
                name);
            goto unlock;
        }
        
        //找到第一个free的port id号。
        port_id = rte_eth_dev_find_free_port();
        if (port_id == RTE_MAX_ETHPORTS) {
            RTE_ETHDEV_LOG(ERR,
                "Reached maximum number of Ethernet ports
    ");
            goto unlock;
        }
        
        //返回全局变量数组rte_eth_devices[port_id],同时把上面申请到的共享data数据,正式挂到eth_dev->data下。
        eth_dev = eth_dev_get(port_id);
        snprintf(eth_dev->data->name, sizeof(eth_dev->data->name), "%s", name);
        eth_dev->data->port_id = port_id;
        eth_dev->data->mtu = ETHER_MTU;
    
    unlock:
        rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
    
        return eth_dev;
    }
  • 相关阅读:
    PostgreSQL Replication之第四章 设置异步复制(4)
    PostgreSQL Replication之第四章 设置异步复制(3)
    PostgreSQL Replication之第四章 设置异步复制(2)
    PostgreSQL Replication之第四章 设置异步复制(1)
    PostgreSQL Replication之第三章 理解即时恢复(4)
    Hdu3065 病毒侵袭持续中
    poj3974 Palindrome
    poj1204 Word Puzzles
    Hdu2222 Keywords Search
    Codeforce 633.C Spy Syndrome 2
  • 原文地址:https://www.cnblogs.com/dream397/p/13607734.html
Copyright © 2020-2023  润新知