亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 6224 | 回復(fù): 27
打印 上一主題 下一主題

內(nèi)核netfilter處理問(wèn)題(暨packet接受與NAPI介紹) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-01-08 18:41 |只看該作者 |倒序?yàn)g覽
我認(rèn)為,一個(gè)數(shù)據(jù)報(bào)在netfilter處理的過(guò)程中,一直是在softirq中進(jìn)行的,因此,不可能被其他softirq打斷,

如果在一個(gè)netfilter的動(dòng)作,也即target中,直接調(diào)用dev_queue_xmit()來(lái)發(fā)送自己構(gòu)造的數(shù)據(jù)報(bào),會(huì)出現(xiàn)內(nèi)存泄漏嗎?

內(nèi)核中,一個(gè)最為接近的類似的處理是ipt_REJECT,單它使用NF的鉤子來(lái)發(fā)送自己的數(shù)據(jù),而不是直接調(diào)用dev_queue_xmit()。

[ 本帖最后由 albcamus 于 2006-1-11 16:17 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2006-01-08 20:29 |只看該作者
原帖由 guotie 于 2006-1-8 18:41 發(fā)表
我認(rèn)為,一個(gè)數(shù)據(jù)報(bào)在netfilter處理的過(guò)程中,一直是在softirq中進(jìn)行的,因此,不可能被其他softirq打斷,

如果在一個(gè)netfilter的動(dòng)作,也即target中,直接調(diào)用dev_queue_xmit()來(lái)發(fā)送自己構(gòu)造的數(shù)據(jù)報(bào),會(huì)出現(xiàn)內(nèi)存泄漏嗎?


1)報(bào)文在netfilter處理的過(guò)程中,不一定是在softirq中。比如本機(jī)發(fā)出的報(bào)文,可能在進(jìn)程上下文中。

2)不會(huì)內(nèi)存泄露。倒不是說(shuō)不可以用dev_queue_xmit(),但這樣就bypass了ARP協(xié)議等的處理,你必須自己構(gòu)造鏈路層楨頭。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-01-09 09:53 |只看該作者
樓主的前提是錯(cuò)誤的,報(bào)文的處理過(guò)程不一定在軟中斷中進(jìn)行,即使是接收和ip層處理,請(qǐng)參考NAPI和softirqd代碼。當(dāng)接收?qǐng)?bào)文長(zhǎng)時(shí)間占用軟中斷后,會(huì)啟動(dòng)softirqd內(nèi)核線程執(zhí)行報(bào)文處理。 內(nèi)核2.6.15-rt2

感覺(jué)樓主想要實(shí)現(xiàn)的東西和我以前做過(guò)的一個(gè)項(xiàng)目很類似,把報(bào)文送到用戶空間處理,用PF_packet也可以。

用netfilter,使用正確的接口,也不會(huì)出現(xiàn)內(nèi)存泄露。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-01-09 09:57 |只看該作者
原帖由 xiaozhaoz 于 2006-1-9 09:53 發(fā)表
樓主的前提是錯(cuò)誤的,報(bào)文的處理過(guò)程不一定在軟中斷中進(jìn)行,即使是接收和ip層處理,請(qǐng)參考NAPI和softirqd代碼。當(dāng)接收?qǐng)?bào)文長(zhǎng)時(shí)間占用軟中斷后,會(huì)啟動(dòng)softirqd內(nèi)核線程執(zhí)行報(bào)文處理。 內(nèi)核2.6.15-rt2

感覺(jué)樓主 ...


能仔細(xì)講講NAPI,softirq和接受報(bào)文的關(guān)系嗎?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-01-09 10:15 |只看該作者
hehe,我對(duì)數(shù)據(jù)報(bào)直接在內(nèi)核處理,并不把它轉(zhuǎn)移到用戶空間。

所以,不用PF_packet

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2006-01-09 10:27 |只看該作者
NAPI的由來(lái):

NAPI是2.4.20后的內(nèi)核版本在網(wǎng)卡驅(qū)動(dòng)做的一項(xiàng)優(yōu)化措施,當(dāng)年某個(gè)商業(yè)測(cè)試2.2的Linux和Winnt的網(wǎng)絡(luò)效率,Linux在小包處理吞吐量輸了,這個(gè)報(bào)告引起了很大的爭(zhēng)議,后來(lái)Linux在驅(qū)動(dòng)采取了一系列的優(yōu)化措施,NAPI是很重要的一個(gè)。

NAPI的原理: 一般情況下,每接收到一個(gè)幀,都會(huì)出發(fā)一次網(wǎng)絡(luò)中斷,然后軟中斷處理這個(gè)報(bào)文,直到報(bào)文到目的地(轉(zhuǎn)發(fā)或用戶socket buffer).
現(xiàn)在的做法,大流量情況下,收中斷是不啟用的。這樣收幀不會(huì)頻繁觸發(fā)網(wǎng)絡(luò)中斷,而是報(bào)文到了一定數(shù)量后觸發(fā)一次中斷,如8139網(wǎng)卡。在cp_interrupt()中,會(huì)調(diào)用NAPI的接口,將網(wǎng)卡加入到softirq任務(wù)鏈表中,然后喚醒softirq, 在softirq中,回調(diào)dev中的接口批量處理報(bào)文。

        if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr))
                if (netif_rx_schedule_prep(dev)) {
                        cpw16_f(IntrMask, cp_norx_intr_mask);
                        __netif_rx_schedule(dev);
                }

__netif_rx_schedule() -->
{
        unsigned long flags;

        raw_local_irq_save(flags);
        dev_hold(dev);
/* 將dev加入到軟中斷處理鏈表中 */
        list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
        if (dev->quota < 0)
                dev->quota += dev->weight;
        else
                dev->quota = dev->weight;
/* 喚醒軟中斷 */
        raise_softirq_irqoff(NET_RX_SOFTIRQ);
        raw_local_irq_restore(flags);
}

軟中斷處理中,會(huì)利用dev->poll() 函數(shù),實(shí)現(xiàn)一次軟中斷,處理大量報(bào)文,如8139
cp_rx_poll() -->
批量處理網(wǎng)卡buffer中的報(bào)文。

softirq處理過(guò)程也有同樣的優(yōu)化,正常情況下,所有的報(bào)文都是在軟中斷中完成,但是當(dāng)軟中斷一直有處理不完的報(bào)文,為了提高系統(tǒng)實(shí)時(shí)行,軟中斷處理完一定數(shù)量的報(bào)文后,必須退出,剩余的報(bào)文通過(guò)喚醒softirqd 內(nèi)核線程來(lái)完成。
void ___do_softirq(void) -->
/* 如果處理一輪后,仍然后報(bào)文要處理,喚醒softirqd任務(wù)代為處理 */
        if (pending)
                trigger_softirqs();

trigger_softirqs()-->
static void trigger_softirqs(void)
{
        u32 pending = local_softirq_pending();
        int curr = 0;

        while (pending) {
                if (pending & 1)
                                             /* 喚醒softirqd */
                        wakeup_softirqd(curr);
                pending >>= 1;
                curr++;
        }
}

內(nèi)核: 2.6.15-rt2

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2006-01-09 10:55 |只看該作者
非常感謝。

ip_rcv,netfilter的處理鏈都是在softirq中進(jìn)行的,對(duì)嗎?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2006-01-09 11:04 |只看該作者

回復(fù) 6樓 xiaozhaoz 的帖子

> 現(xiàn)在的做法,大流量情況下,收中斷是不啟用的。
> 這樣收幀不會(huì)頻繁觸發(fā)網(wǎng)絡(luò)中斷,而是報(bào)文到了一定數(shù)量后觸發(fā)一次中斷

這個(gè)說(shuō)法欠妥,并不是“報(bào)文到了一定數(shù)量后觸發(fā)一次中斷”,
而是,只有第一個(gè)中斷會(huì)觸發(fā),然后NAPI會(huì)關(guān)中斷,進(jìn)入poll(),持續(xù)收包。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2006-01-09 12:13 |只看該作者

回復(fù) 8樓 wheelz 的帖子

同意你的說(shuō)法。

to guotie:
ip_rcv,netfilter 不一定都是在軟中斷中進(jìn)行:
我上面的描述中已經(jīng)說(shuō)了:
當(dāng)軟中斷持續(xù)被觸發(fā)時(shí),為了保持系統(tǒng)實(shí)時(shí)行,會(huì)將后續(xù)的報(bào)文處理放到softirqd任務(wù)中進(jìn)行,這時(shí)一個(gè)內(nèi)核任務(wù),默認(rèn)情況下,每個(gè)CPU啟一個(gè)。

所以ip_rcv可能運(yùn)行在兩種上下文中:
1. 軟中斷 (軟中斷有自己的棧,但是上下文是在被中斷的任務(wù)中)
2. softirqd 內(nèi)核線程

用戶程序報(bào)文的發(fā)送是在自己的上下文中完成。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2006-01-09 13:14 |只看該作者
非常感謝。!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP