1016
技術社區[雲棲]
網絡子係統2_設備子係統相關的初始化
//在socket文件係統注冊之後,設備驅動程序注冊之前被調用 //start_kernel->rest_init->kernel_thread->init->do_basic_setup->do_initcalls->net_dev_init 2.1 static int __init net_dev_init(void) { ... //proc文件係統中相關項的初始化 if (dev_proc_init()) goto out; //注冊網絡設備類 if (netdev_sysfs_init()) goto out; //初始化ETH_P_ALL的鏈表 INIT_LIST_HEAD(&ptype_all); //初始化l3協議的hash表 //通過dev_add_pack和dev_remove_pack添加l3協議 //鏈表元素為struct packet_type for (i = 0; i < 16; i++) INIT_LIST_HEAD(&ptype_base[i]); //初始化與設備相關的兩個hash表 //其中一個hash設備名 for (i = 0; i < ARRAY_SIZE(dev_name_head); i++) INIT_HLIST_HEAD(&dev_name_head[i]); //另一個hash設備編號 for (i = 0; i < ARRAY_SIZE(dev_index_head); i++) INIT_HLIST_HEAD(&dev_index_head[i]); //初始化per-cpu的接收隊列 for (i = 0; i < NR_CPUS; i++) { struct softnet_data *queue; queue = &per_cpu(softnet_data, i); //不適用napi的設備的接收到的流量將會掛載到此queue上 skb_queue_head_init(&queue->input_pkt_queue); //與擁塞管理算法相關的字段 //表示cpu當前接收隊列是否被關閉,當input_pkt_queue滿時,throttle=1, //標示此cpu的接收功能被關閉,當第一個幀排入空隊列時,throttle會被netif_rx消除(注:netif_rx由非napi設備調用) queue->throttle = 0; //cng_level, avg_blog在get_sample_stats中被更新 //get_sample_states由netif_rx調用 queue->cng_level = 0;//擁塞等級 queue->avg_blog = 10; //平均值 //緩衝區list,其中為完成傳輸的skb,等待被釋放 queue->completion_queue = NULL; //此list上的設備都帶有輸入幀接收輪詢,中斷功能被關閉 INIT_LIST_HEAD(&queue->poll_list); //不使用napi的設備,linux默認提供一個積壓設備,完成輪詢 //__LINK_STATE_START表示設備已開啟 set_bit(__LINK_STATE_START, &queue->backlog_dev.state); //設置積壓設備的權重,weight_p通過proc文件係統修改 queue->backlog_dev.weight = weight_p; //積壓設備的輪詢函數 queue->backlog_dev.poll = process_backlog; atomic_set(&queue->backlog_dev.refcnt, 1); } //注冊網絡傳輸和接收的軟中斷 open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL); open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL); //注冊dst通知鏈,通知dst_entry子係統有關net_device unregister、ifdown的event dst_init(); //多播的初始化 dev_mcast_init(); rc = 0; out: return rc; } //subsys_initcall的優先級低於core_initcall subsys_initcall(net_dev_init);
最後更新:2017-04-03 15:21:55