專(zhuān)利名稱(chēng):用于多事件隊(duì)列的中斷管理的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種網(wǎng)絡(luò)接口,更具體地,涉及使性能最佳化的基于隊(duì)列的網(wǎng)絡(luò)發(fā)送和接收機(jī)制。
背景技術(shù):
當(dāng)通過(guò)諸如網(wǎng)絡(luò)的數(shù)據(jù)通道在兩個(gè)設(shè)備之間傳送數(shù)據(jù)時(shí),這些設(shè)備中的每一個(gè)都必須具有合適的網(wǎng)絡(luò)接口,以允許它通過(guò)該通道進(jìn)行通信。通常網(wǎng)絡(luò)是基于以太網(wǎng)技術(shù)的。要通過(guò)網(wǎng)絡(luò)進(jìn)行通信的設(shè)備配備有能夠支持網(wǎng)絡(luò)協(xié)議的物理和邏輯要求的多個(gè)網(wǎng)絡(luò)接口。將網(wǎng)絡(luò)接口的物理硬件部分稱(chēng)為網(wǎng)絡(luò)接口卡(NIC),盡管它們不一定采用卡的形式例如,它們可以采用直接安裝到主板上的集成電路(IC)和連接器的形式,或者采用與計(jì)算機(jī)系統(tǒng)的其他組件一起在單個(gè)集成電路芯片上制造出的宏單元的形式。
大多數(shù)計(jì)算機(jī)系統(tǒng)包括操作系統(tǒng)(OS),用戶(hù)級(jí)應(yīng)用通過(guò)操作系統(tǒng)與網(wǎng)絡(luò)相通信。操作系統(tǒng)的一部分(已知為內(nèi)核)包括多個(gè)協(xié)議棧,這些協(xié)議棧用于在NIC專(zhuān)用的應(yīng)用和設(shè)備驅(qū)動(dòng)器與用于直接控制NIC的設(shè)備驅(qū)動(dòng)器之間進(jìn)行命令和數(shù)據(jù)的轉(zhuǎn)換。通過(guò)在操作系統(tǒng)內(nèi)核中提供這些功能,可以從用戶(hù)級(jí)應(yīng)用中隱藏掉在多個(gè)NIC之間的復(fù)雜性和差異。此外,許多應(yīng)用可以安全地共享網(wǎng)絡(luò)硬件和其他系統(tǒng)資源(如存儲(chǔ)器),并且可以針對(duì)有故障或惡意的應(yīng)用來(lái)保護(hù)系統(tǒng)。
在典型的內(nèi)核棧系統(tǒng)的操作中,硬件網(wǎng)絡(luò)接口卡是在網(wǎng)絡(luò)與內(nèi)核之間的接口。在內(nèi)核中,設(shè)備驅(qū)動(dòng)器層直接與NIC相通信,而協(xié)議層與系統(tǒng)的應(yīng)用級(jí)相通信。
NIC存儲(chǔ)指向主存儲(chǔ)器中的用于提供給內(nèi)核的來(lái)達(dá)數(shù)據(jù)和待施加給網(wǎng)絡(luò)的外發(fā)數(shù)據(jù)的緩沖區(qū)的指針。將這些指針?lè)Q為RX數(shù)據(jù)環(huán)和TX數(shù)據(jù)環(huán)。NIC對(duì)表示RX緩沖區(qū)環(huán)上的內(nèi)核要讀取的下一數(shù)據(jù)的緩沖區(qū)指針進(jìn)行更新。通過(guò)直接存儲(chǔ)器存取(DMA)來(lái)提供TX數(shù)據(jù)環(huán),并且NIC對(duì)表示已發(fā)送的外發(fā)數(shù)據(jù)的緩沖區(qū)指針進(jìn)行更新。NIC可以利用中斷向內(nèi)核發(fā)送信號(hào)。
由內(nèi)核從RX數(shù)據(jù)環(huán)中摘掉來(lái)達(dá)數(shù)據(jù),依次對(duì)其進(jìn)行處理。通常由內(nèi)核本身來(lái)處理帶外數(shù)據(jù)(out of band data)。通過(guò)指向應(yīng)用專(zhuān)用端口所專(zhuān)用的緩沖區(qū)隊(duì)列(其駐留在內(nèi)核的私有地址空間中)的指針來(lái)添加要到該應(yīng)用專(zhuān)用端口的數(shù)據(jù)。
在用于進(jìn)行數(shù)據(jù)接收的系統(tǒng)操作中會(huì)發(fā)生以下步驟1.在系統(tǒng)初始化過(guò)程中,操作系統(tǒng)設(shè)備驅(qū)動(dòng)器創(chuàng)建內(nèi)核緩沖區(qū)并對(duì)NIC的RX環(huán)進(jìn)行初始化,以指向這些緩沖區(qū)。還將來(lái)自配置腳本的OS的IP主地址通知給該OS。
2.一應(yīng)用希望接收網(wǎng)絡(luò)分組并典型地創(chuàng)建一套接字(a socket),該套接字被綁定到一端口,該套接字是駐留在操作系統(tǒng)內(nèi)的隊(duì)列狀數(shù)據(jù)結(jié)構(gòu)。對(duì)于給定的網(wǎng)絡(luò)協(xié)議,該端口具有在主機(jī)內(nèi)唯一的編號(hào),使得可以將尋址到<主機(jī)端口>的網(wǎng)絡(luò)分組傳送到正確的端口的隊(duì)列。
3.分組到達(dá)網(wǎng)絡(luò)接口卡(NIC)。該NIC通過(guò)主機(jī)I/O總線(xiàn)(例如,PCI總線(xiàn))將該分組復(fù)制到由下一合法RX DMA環(huán)指針值指向的存儲(chǔ)器地址。
4.要么沒(méi)有可用的剩余DMA指針,要么達(dá)到了預(yù)指定超時(shí),NIC斷言I/O總線(xiàn)中斷,以通知主機(jī)已傳送了數(shù)據(jù)。
5.響應(yīng)于該中斷,設(shè)備驅(qū)動(dòng)器檢查所傳送的緩沖區(qū),如果該緩沖區(qū)含有合法的地址信息,如合法的主機(jī)地址,則將指向該緩沖區(qū)的指針傳遞給合適的協(xié)議棧(例如,TCP/IP)。在某些系統(tǒng)中,設(shè)備驅(qū)動(dòng)器能夠進(jìn)行切換以輪詢(xún)有限的時(shí)段,以試圖減少中斷次數(shù)。
6.協(xié)議棧確定是否存在合法的目的地端口,如果存在,則執(zhí)行網(wǎng)絡(luò)協(xié)議處理(例如生成對(duì)所接收到的數(shù)據(jù)的確認(rèn))并將該分組排入(enqueue)該端口的隊(duì)列中。
7.OS可以指示(例如,通過(guò)進(jìn)行再調(diào)度并設(shè)置“選擇”位掩碼中的位)應(yīng)用一分組已到達(dá)所述端口被綁定到的網(wǎng)絡(luò)端點(diǎn)上(通過(guò)將該應(yīng)用標(biāo)記為可運(yùn)行的并調(diào)用調(diào)度器)。
8.應(yīng)用例如通過(guò)執(zhí)行recv()系統(tǒng)調(diào)用(提供緩沖區(qū)的地址和大小)從OS請(qǐng)求數(shù)據(jù),同時(shí)在OS內(nèi)核中,將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用的緩沖區(qū)。在從該系統(tǒng)調(diào)用返回時(shí),應(yīng)用可以從應(yīng)用緩沖區(qū)訪(fǎng)問(wèn)該數(shù)據(jù)。
9.在進(jìn)行了復(fù)制(其通常發(fā)生在軟中斷的環(huán)境下)之后,內(nèi)核會(huì)將內(nèi)核緩沖區(qū)返回給空閑存儲(chǔ)器的OS池。而且,在中斷過(guò)程中,設(shè)備驅(qū)動(dòng)器分配一新緩沖區(qū)并向DMA環(huán)添加一指針。按此方式,緩沖區(qū)從空閑池到應(yīng)用的端口隊(duì)列存在循環(huán),并周而復(fù)始。
10.典型地,內(nèi)核緩沖區(qū)位于物理RAM中,并且永遠(yuǎn)都不會(huì)被虛擬存儲(chǔ)器(VM)系統(tǒng)調(diào)頁(yè)出去(page out)。然而,可以將空閑池共享為所有應(yīng)用的公共資源。
對(duì)于數(shù)據(jù)發(fā)送,會(huì)發(fā)生以下步驟1.操作系統(tǒng)設(shè)備驅(qū)動(dòng)器創(chuàng)建用于進(jìn)行發(fā)送的內(nèi)核緩沖區(qū),并對(duì)NIC的TX環(huán)進(jìn)行初始化。
2.要發(fā)送數(shù)據(jù)的應(yīng)用將該數(shù)據(jù)存儲(chǔ)在應(yīng)用緩沖區(qū)中,并例如通過(guò)執(zhí)行send()系統(tǒng)調(diào)用(提供應(yīng)用緩沖區(qū)的地址和大小)來(lái)請(qǐng)求由OS進(jìn)行發(fā)送。
3.響應(yīng)于該send()調(diào)用,OS內(nèi)核將該數(shù)據(jù)從應(yīng)用緩沖區(qū)復(fù)制到內(nèi)核緩沖區(qū)中并應(yīng)用合適的協(xié)議棧(例如TCP/IP)。
4.將指向含有該數(shù)據(jù)的內(nèi)核緩沖區(qū)的指針置于TX環(huán)的下一空閑空隙(slot)中。如果沒(méi)有可用空隙,則在內(nèi)核中將該緩沖區(qū)排隊(duì),直到NIC例如通過(guò)中斷指示一空隙已變得可用。
5.當(dāng)NIC要處理該空隙時(shí),NIC通過(guò)主機(jī)I/O總線(xiàn)利用DMA循環(huán)訪(fǎng)問(wèn)由該空隙的內(nèi)容表示的內(nèi)核緩沖區(qū),然后發(fā)送該數(shù)據(jù)。
過(guò)去已經(jīng)認(rèn)識(shí)到,發(fā)送和接收操作均會(huì)涉及過(guò)多的數(shù)據(jù)移動(dòng)。已經(jīng)提出一些解決方案來(lái)減輕由這種數(shù)據(jù)移動(dòng)所導(dǎo)致的性能劣化。例如,參見(jiàn)美國(guó)專(zhuān)利No.6246683,通過(guò)引用將其并入于此。在PCT國(guó)際公報(bào)No.WO2004/025477A2(通過(guò)引用將其并入于此)中,進(jìn)一步認(rèn)識(shí)到發(fā)送和接收操作均會(huì)涉及過(guò)多的環(huán)境切換,這也會(huì)導(dǎo)致顯著的開(kāi)銷(xiāo)。其中對(duì)用于減少所需環(huán)境切換次數(shù)的技術(shù)進(jìn)行了描述。
在其中所描述的機(jī)制中,使用事件隊(duì)列來(lái)在主機(jī)系統(tǒng)與NIC之間對(duì)控制信息進(jìn)行通信。當(dāng)通過(guò)I/O總線(xiàn)(如通過(guò)PCI總線(xiàn))將網(wǎng)絡(luò)接口設(shè)備連接到主機(jī)系統(tǒng)時(shí),需要在處理器與NIC之間對(duì)控制信息進(jìn)行頻繁的通信。典型地,由NIC發(fā)出的中斷來(lái)啟動(dòng)控制通信,這導(dǎo)致環(huán)境切換。此外,該通信往往要求主機(jī)系統(tǒng)通過(guò)PCI總線(xiàn)從NIC讀取控制信息或向NIC寫(xiě)入控制信息,并且這會(huì)導(dǎo)致總線(xiàn)瓶頸。該問(wèn)題在數(shù)據(jù)分組往往很短的網(wǎng)絡(luò)連接環(huán)境下尤其嚴(yán)重,使得所需控制工作量占總網(wǎng)絡(luò)處理工作的百分比很大。
在該P(yáng)CT公報(bào)中描述的實(shí)施例中,“端口”被視為綁定到應(yīng)用的操作系統(tǒng)專(zhuān)用實(shí)體,具有地址碼,并且可以接收消息。尋址到一端口的一個(gè)或更多個(gè)來(lái)達(dá)消息形成消息隊(duì)列,由操作系統(tǒng)來(lái)處理該消息隊(duì)列。操作系統(tǒng)先前已存儲(chǔ)有在該端口與在該操作系統(tǒng)上運(yùn)行的應(yīng)用之間的綁定關(guān)系。由操作系統(tǒng)來(lái)處理用于一端口的消息隊(duì)列中的消息,并由操作系統(tǒng)將這些消息提供給該端口所綁定的應(yīng)用。操作系統(tǒng)可以存儲(chǔ)端口到應(yīng)用的多重綁定關(guān)系,使得通過(guò)指定合適的端口可以將來(lái)達(dá)消息施加給合適的應(yīng)用。端口存在于操作系統(tǒng)內(nèi),使得無(wú)論對(duì)應(yīng)的狀態(tài)如何,都可以接收并安全地處理這些消息。
在操作系統(tǒng)的操作開(kāi)始時(shí),操作系統(tǒng)創(chuàng)建一隊(duì)列以處理帶外消息??梢杂蒒IC對(duì)該隊(duì)列進(jìn)行寫(xiě)入,并且該隊(duì)列可以具有與其相關(guān)聯(lián)的中斷。當(dāng)一應(yīng)用綁定于一端口時(shí),操作系統(tǒng)創(chuàng)建該端口并將其與該應(yīng)用關(guān)聯(lián)起來(lái)。操作系統(tǒng)還創(chuàng)建一隊(duì)列(事件隊(duì)列),以處理僅用于該端口的帶外消息。然后將用于該端口的帶外消息隊(duì)列存儲(chǔ)映射到該應(yīng)用的虛擬地址空間,使得不必進(jìn)行內(nèi)核環(huán)境切換就可以使事件退出隊(duì)列(de-queue)。
將事件隊(duì)列與NIC一起進(jìn)行注冊(cè),并且在與各隊(duì)列相關(guān)聯(lián)的NIC上存在控制塊(并將其映射到OS和應(yīng)用中的任一個(gè)或這兩者的地址空間中)。
圖1例示了如在PCT公報(bào)中描述的帶有控制塊的隊(duì)列。在所描述的實(shí)現(xiàn)中,將NIC161通過(guò)PCI總線(xiàn)110連接到主機(jī)系統(tǒng)中。將事件隊(duì)列159存儲(chǔ)在主機(jī)存儲(chǔ)器160中,NIC161具有到主機(jī)存儲(chǔ)器160的訪(fǎng)問(wèn)權(quán)。與事件隊(duì)列159相關(guān)聯(lián)的是讀指針(RDPTR)162a和寫(xiě)指針(WRPTR)163a,其表示在該隊(duì)列中接下來(lái)要讀取和寫(xiě)入數(shù)據(jù)處的點(diǎn)。將指針162a存儲(chǔ)在主機(jī)存儲(chǔ)器160中。將指針163a存儲(chǔ)在NIC161中。在NIC和存儲(chǔ)器中的與原始指針不同的另一個(gè)中存儲(chǔ)有指針的映射復(fù)本RDPTR162b和WRPTR163b。在該系統(tǒng)的操作中1.NIC161可以通過(guò)對(duì)本地存儲(chǔ)的RDPTR與WRPTR進(jìn)行比較來(lái)確定用于寫(xiě)入事件隊(duì)列159中的可用空間。
2.NIC161生成帶外數(shù)據(jù)并將其寫(xiě)入隊(duì)列159。
3.當(dāng)已寫(xiě)入數(shù)據(jù)時(shí)NIC161對(duì)WRPTR和WRPTR進(jìn)行更新,使得在最后一個(gè)數(shù)據(jù)之后將寫(xiě)入下一數(shù)據(jù)。
4.應(yīng)用通過(guò)對(duì)如從存儲(chǔ)器160訪(fǎng)問(wèn)的RDPTR與WRPTR進(jìn)行比較來(lái)確定用于讀取的可用空間。
5.應(yīng)用從隊(duì)列159讀取帶外數(shù)據(jù)并對(duì)消息進(jìn)行處理。
6.應(yīng)用對(duì)RDPTR和RDPTR進(jìn)行更新。
7.如果應(yīng)用要求中斷,則該應(yīng)用(或者代表該應(yīng)用的操作系統(tǒng))設(shè)置控制塊164的IRQ165a和IRQ165b位。將控制塊存儲(chǔ)在主機(jī)存儲(chǔ)器160中并將其映射到NIC中的相對(duì)應(yīng)的存儲(chǔ)器上。如果進(jìn)行了設(shè)置,則NIC還將在以上步驟3中生成中斷。
事件隊(duì)列機(jī)制通過(guò)在應(yīng)用和OS已具有環(huán)境的同時(shí)不斷允許它們對(duì)新事件進(jìn)行輪詢(xún),有助于改進(jìn)性能;通過(guò)只在需要時(shí)產(chǎn)生中斷減少了環(huán)境切換。還減少了總線(xiàn)瓶頸,因?yàn)橹鳈C(jī)系統(tǒng)可以從現(xiàn)在在主機(jī)存儲(chǔ)器中的事件隊(duì)列中的事件中更頻繁地取出控制信息,而不是從NIC直接通過(guò)PCI總線(xiàn)取出控制信息。
然而,對(duì)事件隊(duì)列的使用并沒(méi)有完全消除中斷和環(huán)境切換。在常規(guī)事件隊(duì)列布置中,外設(shè)斷言事件隊(duì)列的事件,然后引起一中斷以激活事件處理器。然后該外設(shè)使它自己不能進(jìn)一步進(jìn)行中斷,直到主機(jī)確認(rèn)了所述中斷。外設(shè)可以繼續(xù)斷言事件隊(duì)列的事件,但是不斷言其他中斷。對(duì)于主機(jī)事件處理器,其進(jìn)入一循環(huán),在該循環(huán)中,其重復(fù)地處理隊(duì)列中的事件,直到其相信該隊(duì)列是空的。在此過(guò)程中(在沒(méi)有新中斷的情況下)外設(shè)可以斷言隊(duì)列的其他事件,并且主機(jī)事件處理器在失活之前將處理這些事件,只要這些事件在主機(jī)事件處理器確定隊(duì)列是空的之前到達(dá)。可能由于其他原因會(huì)發(fā)生其他環(huán)境切換,但是不會(huì)由于來(lái)自外設(shè)的中斷而發(fā)生環(huán)境切換。僅當(dāng)主機(jī)事件處理器確定隊(duì)列是空的時(shí),它才對(duì)中斷進(jìn)行確認(rèn)并使之失活。響應(yīng)于該中斷確認(rèn),外設(shè)再使能中斷,使得它可以連同它的下一斷言事件一起產(chǎn)生新的中斷。
在對(duì)單個(gè)事件隊(duì)列的管理中,與其中針對(duì)每個(gè)事件斷言新中斷的系統(tǒng)相比,以上方法可以減少中斷顫動(dòng)(interrupt chatter)。但是在一個(gè)或更多個(gè)外設(shè)可以向一個(gè)以上的事件隊(duì)列中斷言事件的情況下會(huì)產(chǎn)生其他問(wèn)題。以上機(jī)制可以減少針對(duì)多個(gè)事件隊(duì)列中的各單個(gè)隊(duì)列斷言的中斷次數(shù),但是無(wú)助于減少在所有事件隊(duì)列上斷言的中斷次數(shù)。
在希望所述多個(gè)事件隊(duì)列中的一些是用戶(hù)級(jí)隊(duì)列(在用戶(hù)地址空間中運(yùn)行的驅(qū)動(dòng)器的控制下)的情況下會(huì)產(chǎn)生其他甚至更重要的問(wèn)題。在于2004年4月21日提交的標(biāo)題為“User-Level Stack”的英國(guó)專(zhuān)利公報(bào)No.GB0408876A0中描述了這種結(jié)構(gòu),通過(guò)引用將其并入于此。在這種架構(gòu)中,可以支持多個(gè)協(xié)議棧,每個(gè)協(xié)議棧都具有它自己的發(fā)送和接收數(shù)據(jù)結(jié)構(gòu)組,并且均由在NIC上的硬件中執(zhí)行的功能所輔助。但是由于這些驅(qū)動(dòng)器運(yùn)行在用戶(hù)地址空間中,因此它們根本不能接收中斷。希望找到支持用戶(hù)級(jí)棧的事件隊(duì)列的方式,具有當(dāng)事件隊(duì)列為空時(shí)阻斷驅(qū)動(dòng)器而在事件隊(duì)列含有事件時(shí)喚醒驅(qū)動(dòng)器的能力,以再次使環(huán)境切換達(dá)到最少。
發(fā)明內(nèi)容
根據(jù)本發(fā)明一實(shí)施例,粗略地講,使用中間事件隊(duì)列(其為中斷事件)對(duì)在多個(gè)單個(gè)事件隊(duì)列(它們不一定是中斷隊(duì)列)之間的中斷進(jìn)行協(xié)調(diào)。當(dāng)向所述多個(gè)單個(gè)事件隊(duì)列中的一個(gè)斷言一事件時(shí),所述外設(shè)不產(chǎn)生中斷。相反,如果被使能了,當(dāng)向所述多個(gè)單個(gè)事件隊(duì)列中的一個(gè)斷言一事件時(shí),它還向所述中間事件隊(duì)列斷言一附加事件(這里被稱(chēng)為“喚醒”事件)。所述喚醒事件標(biāo)識(shí)了其處理器需要激活的所述單個(gè)事件隊(duì)列。然后,在所述設(shè)備斷言標(biāo)識(shí)該單個(gè)事件隊(duì)列的另一喚醒事件之前,它等待喚醒事件請(qǐng)求。連同向所述中間事件隊(duì)列斷言所述喚醒事件,所述外設(shè)不斷言中斷以激活所述中間隊(duì)列事件處理器,而同樣僅在被使能時(shí)才斷言中斷。連同向所述中間事件隊(duì)列斷言其他喚醒事件(可選地,也可以是其他事件),所述設(shè)備然后立即禁用或抑制對(duì)所述主機(jī)的其他中斷。雖然不再向標(biāo)識(shí)第一單個(gè)事件隊(duì)列的所述中間事件隊(duì)列斷言其他喚醒事件,但是還可以向標(biāo)識(shí)其他單個(gè)事件隊(duì)列的所述中間事件隊(duì)列斷言喚醒事件;連同對(duì)那些喚醒事件進(jìn)行斷言,對(duì)中斷的抑制會(huì)防止所述設(shè)備中斷所述主機(jī)。
來(lái)自所述外設(shè)的中斷使得所述主機(jī)激活它的中間隊(duì)列事件處理器。與常規(guī)結(jié)構(gòu)類(lèi)似,該事件處理器進(jìn)入如下循環(huán)它循環(huán)地對(duì)所述中間事件隊(duì)列中的事件進(jìn)行處理,直到它相信所述隊(duì)列是空的。在此過(guò)程中,所述外設(shè)可以向所述中間隊(duì)列斷言其他喚醒事件,而不產(chǎn)生新的中斷,并且所述主機(jī)中間隊(duì)列事件處理器將在失活之前處理它們,只要它們?cè)谒鲋鳈C(jī)中間隊(duì)列事件處理器確定所述隊(duì)列是空的之前到達(dá)。僅當(dāng)所述主機(jī)中間隊(duì)列事件處理器確定所述事件是空的時(shí),它才確認(rèn)所述中斷并使之失活。響應(yīng)于所述中斷確認(rèn),所述外設(shè)再使能中斷,使得它可以連同下一斷言喚醒事件一起產(chǎn)生新的中斷。
當(dāng)所述主機(jī)中間隊(duì)列事件處理器從所述中間隊(duì)列事件隊(duì)列中取出用戶(hù)事件隊(duì)列喚醒事件時(shí),它進(jìn)行到激活負(fù)責(zé)在所述隊(duì)列喚醒事件中標(biāo)識(shí)的事件隊(duì)列的主機(jī)事件處理器。然后該處理器循環(huán)地對(duì)該單個(gè)事件隊(duì)列中的事件進(jìn)行處理,直到它相信該單個(gè)隊(duì)列是空的。在此過(guò)程中所述外設(shè)可以向所述單個(gè)事件隊(duì)列中斷言附加事件,而不產(chǎn)生新的中斷并且不斷言新的喚醒事件,并且所述主機(jī)單個(gè)隊(duì)列事件處理器將在失活之前處理它們,只要它們?cè)谒鲋鳈C(jī)單個(gè)隊(duì)列事件處理器確定所述單個(gè)事件隊(duì)列是空的之前到達(dá)。僅當(dāng)所述主機(jī)單個(gè)隊(duì)列事件處理器確定所述事件是空的時(shí),它才確認(rèn)所述喚醒事件并失活。所述喚醒事件確認(rèn)充當(dāng)對(duì)新喚醒事件的請(qǐng)求,以使能所述外設(shè)來(lái)連同下一斷言事件一起產(chǎn)生新的喚醒事件。
可以看到,通過(guò)向用于協(xié)調(diào)中斷的中間驅(qū)動(dòng)器發(fā)送喚醒事件而提供的附加間接層不僅有助于單個(gè)地使各事件隊(duì)列的中斷最少化,而且有助于總體地使所有事件隊(duì)列的中斷最少化。此外,所述附加間接層使得可以支持用戶(hù)級(jí)棧的事件隊(duì)列,使所述驅(qū)動(dòng)器具備如下能力當(dāng)所述事件隊(duì)列是空的時(shí),進(jìn)行阻斷;而當(dāng)所述事件隊(duì)列含有事件時(shí),被喚醒,以使環(huán)境切換達(dá)到最少。
另外,在其中所述主機(jī)檢測(cè)到事件隊(duì)列空狀況然后通知所述外設(shè)再使能它的能力以激活所述主機(jī)事件處理器的任何結(jié)構(gòu)中,可能出現(xiàn)競(jìng)爭(zhēng)狀況,在該競(jìng)爭(zhēng)狀況中,在所述主機(jī)檢測(cè)到所述空狀況之后但是在所述外設(shè)接收到所述通知之前,所述外設(shè)向所述事件隊(duì)列斷言一個(gè)或更多個(gè)附加事件。如果出現(xiàn)了該競(jìng)爭(zhēng)狀況,則所述主機(jī)將使其事件隊(duì)列處理器失活,相信它是空的,但是外設(shè)不喚醒所述主機(jī)事件隊(duì)列處理器,相信所述主機(jī)的如下通知的準(zhǔn)確性已經(jīng)處理了所述外設(shè)在此之前已斷言的所有事件。
為了避免該競(jìng)爭(zhēng)狀況,粗略地講,所述主機(jī)對(duì)單個(gè)事件隊(duì)列空狀況的通知具有以下形式所述主機(jī)向所述外設(shè)寫(xiě)入它的當(dāng)前主機(jī)中心單個(gè)事件隊(duì)列讀指針。所述外設(shè)將該讀指針與同一事件隊(duì)列的它自己的設(shè)備中心寫(xiě)指針進(jìn)行比較。如果這兩者相等,則未出現(xiàn)競(jìng)爭(zhēng),并且所述外設(shè)簡(jiǎn)單地再使能它對(duì)標(biāo)識(shí)所述特定單個(gè)事件隊(duì)列的喚醒事件的斷言。然而,如果這兩者不相等,則出現(xiàn)了競(jìng)爭(zhēng)。那么所述外設(shè)并不再使能它對(duì)喚醒事件的斷言,而是向所述中間事件隊(duì)列斷言標(biāo)識(shí)所述特定單個(gè)事件隊(duì)列的新喚醒事件。然后,在所述主機(jī)檢測(cè)到所述空狀況之后但是在所述外設(shè)接收到所述通知之前,所述單個(gè)事件隊(duì)列的所述主機(jī)處理器可以處理所述外設(shè)斷言的事件。
類(lèi)似地,為了避免針對(duì)所述中間事件隊(duì)列產(chǎn)生的類(lèi)似的競(jìng)爭(zhēng)狀況,所述主機(jī)對(duì)所述中間事件隊(duì)列空狀況的通知具有以下形式所述主機(jī)向所述外設(shè)寫(xiě)入它的當(dāng)前主機(jī)中心中間事件隊(duì)列讀指針。所述外設(shè)將該讀指針與所述中間事件隊(duì)列的它自己的設(shè)備中心寫(xiě)指針進(jìn)行比較。如果這兩者相等,則未出現(xiàn)競(jìng)爭(zhēng),并且當(dāng)接著向所述中間事件隊(duì)列斷言喚醒事件(或其他事件)時(shí)所述外設(shè)簡(jiǎn)單地再使能它對(duì)中斷的斷言。如果這兩者不相等,則所述外設(shè)相反地?cái)嘌砸恍轮袛?,以再激活用于所述中間事件隊(duì)列的處理器。然后,在所述主機(jī)檢測(cè)到所述空狀況之后但是在所述外設(shè)接收到所述通知之前,所述主機(jī)處理器可以處理所述外設(shè)向所述中間事件隊(duì)列斷言的事件。
針對(duì)本發(fā)明的多個(gè)具體實(shí)施例對(duì)本發(fā)明進(jìn)行描述,并且將參照附圖,在附圖中圖1是帶有如在PCT國(guó)際公報(bào)No.WO2004/025477A2中描述的控制塊的隊(duì)列的框圖。
圖2是結(jié)合有本發(fā)明的多個(gè)特征的典型計(jì)算機(jī)系統(tǒng)的簡(jiǎn)化框圖。
圖3例示了根據(jù)本發(fā)明的發(fā)送隊(duì)列的簡(jiǎn)化實(shí)施例。
圖4例示了根據(jù)本發(fā)明的接收隊(duì)列的簡(jiǎn)化實(shí)施例。
圖5、6以及7是例示了使用圖3的結(jié)構(gòu)執(zhí)行的功能的流程圖。
圖8到11和15是例示了用于使用圖4的結(jié)構(gòu)執(zhí)行的功能的流程圖。
圖12是結(jié)合有本發(fā)明的多個(gè)方面的另一系統(tǒng)的簡(jiǎn)化框圖。
圖13是由支持發(fā)送隊(duì)列的圖12的系統(tǒng)使用的特定數(shù)據(jù)結(jié)構(gòu)的框圖。
圖14是由支持接收隊(duì)列的圖12的系統(tǒng)使用的特定數(shù)據(jù)結(jié)構(gòu)的框圖。
具體實(shí)施例方式
為了使得本領(lǐng)域的任何技術(shù)人員能夠?qū)崿F(xiàn)并使用本發(fā)明,給出了以下描述,并且以下描述是在特定應(yīng)用及其要求的情況下提供的。本領(lǐng)域的技術(shù)人員容易想到對(duì)所公開(kāi)的實(shí)施例的各種修改,并且在不脫離本發(fā)明的精神和范圍的情況下可以將這里限定的總體原理應(yīng)用于其他實(shí)施例和應(yīng)用。由此,本發(fā)明并不限于所示出的多個(gè)實(shí)施例,而是包括與這里所公開(kāi)的原理和特征相一致的最寬的范圍。
圖2是可以通過(guò)網(wǎng)絡(luò)212與諸如230、232以及234的其他計(jì)算機(jī)系統(tǒng)相通信的典型計(jì)算機(jī)系統(tǒng)210的簡(jiǎn)化框圖。計(jì)算機(jī)系統(tǒng)210包括通過(guò)通信通道218與主機(jī)子系統(tǒng)214相通信的網(wǎng)絡(luò)接口卡(NIC)216。主機(jī)子系統(tǒng)214包括處理器子系統(tǒng)220(其包括至少一個(gè)處理器)、主機(jī)存儲(chǔ)器子系統(tǒng)222以及核心邏輯子系統(tǒng)224。核心邏輯子系統(tǒng)224提供在處理器子系統(tǒng)220、主機(jī)存儲(chǔ)器子系統(tǒng)222以及通信通道218之間的橋。主機(jī)子系統(tǒng)214還可以包括與通信通道218相通信的其他設(shè)備226。
網(wǎng)絡(luò)接口卡216提供與外部網(wǎng)絡(luò)的接口,包括到網(wǎng)絡(luò)212的接口,并通過(guò)網(wǎng)絡(luò)212耦合到其他計(jì)算機(jī)系統(tǒng)中的對(duì)應(yīng)接口設(shè)備。網(wǎng)絡(luò)212可以包括許多互連的計(jì)算機(jī)系統(tǒng)和通信鏈路。這些通信鏈路可以是有線(xiàn)鏈路、光學(xué)鏈路、無(wú)線(xiàn)鏈路或用于對(duì)信息進(jìn)行通信的任何其他機(jī)制。盡管在一個(gè)實(shí)施例中網(wǎng)絡(luò)212是因特網(wǎng),但是在其他實(shí)施例中,網(wǎng)絡(luò)212可以是任何合適的計(jì)算機(jī)網(wǎng)絡(luò)或多個(gè)網(wǎng)絡(luò)的組合。在這里描述的實(shí)施例中,網(wǎng)絡(luò)212支持以太網(wǎng)協(xié)議。
主機(jī)存儲(chǔ)器子系統(tǒng)222通常包括多個(gè)存儲(chǔ)器,這些存儲(chǔ)器包括用于在程序執(zhí)行過(guò)程中存儲(chǔ)指令和數(shù)據(jù)的主隨機(jī)存取存儲(chǔ)器(RAM),和其中存儲(chǔ)有固定指令和數(shù)據(jù)的只讀存儲(chǔ)器(ROM)。在主機(jī)存儲(chǔ)器子系統(tǒng)222中還可以包括一級(jí)或更多級(jí)的高速緩存。為了簡(jiǎn)化討論,這里有時(shí)將主機(jī)存儲(chǔ)器子系統(tǒng)222簡(jiǎn)稱(chēng)為“主機(jī)存儲(chǔ)器”。
通信通道218提供了用于允許計(jì)算機(jī)系統(tǒng)210的各種組件和子系統(tǒng)相互進(jìn)行通信的機(jī)制。在一個(gè)實(shí)施例中,通信通道218包括PCI總線(xiàn)。其他實(shí)施例可以包括其他總線(xiàn),還可以包括多重總線(xiàn)。
計(jì)算機(jī)系統(tǒng)210本身可以是變化的類(lèi)型,包括個(gè)人計(jì)算機(jī)、便攜式計(jì)算機(jī)、工作站、計(jì)算機(jī)終端、網(wǎng)絡(luò)計(jì)算機(jī)、電視、大型機(jī)、服務(wù)器或任何其他數(shù)據(jù)處理系統(tǒng)或用戶(hù)設(shè)備。由于計(jì)算機(jī)和網(wǎng)絡(luò)的不斷變化的性質(zhì),因此對(duì)圖1所示的計(jì)算機(jī)系統(tǒng)210的描述僅作為用于例示本發(fā)明一實(shí)施例的具體示例。計(jì)算機(jī)系統(tǒng)210的許多其他配置可以具有更多或更少的組件,并具有與圖1所示的計(jì)算機(jī)系統(tǒng)類(lèi)似或不同的配置。
數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)化實(shí)施例圖3和4例示了被并入于圖2的計(jì)算機(jī)系統(tǒng)210中的本發(fā)明的簡(jiǎn)化實(shí)施例。在圖3的實(shí)施例中,僅示出了帶有相關(guān)聯(lián)的結(jié)構(gòu)的單個(gè)發(fā)送隊(duì)列,在圖4的實(shí)施例中,僅示出了帶有相關(guān)聯(lián)的結(jié)構(gòu)的單個(gè)接收隊(duì)列。在典型實(shí)現(xiàn)中包括有發(fā)送和接收隊(duì)列,但是可以單獨(dú)地在各隊(duì)列中實(shí)現(xiàn)本發(fā)明的多個(gè)方面。圖3和4僅示出了主機(jī)存儲(chǔ)器子系統(tǒng)222和網(wǎng)絡(luò)接口卡216,只有這些組件內(nèi)的結(jié)構(gòu)與本討論有關(guān)。
首先參照?qǐng)D3,將發(fā)送隊(duì)列存儲(chǔ)在主機(jī)存儲(chǔ)器222中的一系列發(fā)送數(shù)據(jù)緩沖區(qū)310中。在主機(jī)存儲(chǔ)器222中這些發(fā)送數(shù)據(jù)緩沖區(qū)可以是不連續(xù)的,并且通過(guò)發(fā)送緩沖區(qū)鏈表312將這些發(fā)送數(shù)據(jù)緩沖區(qū)鏈接起來(lái)。主機(jī)子系統(tǒng)214將發(fā)送數(shù)據(jù)緩沖區(qū)描述符寫(xiě)入發(fā)送緩沖區(qū)鏈表312中的由主機(jī)存儲(chǔ)器222中的緩沖區(qū)鏈表寫(xiě)指針314指向的位置處,并且NIC216從發(fā)送緩沖區(qū)鏈表312中的由NIC216上的(與主機(jī)存儲(chǔ)器222中的緩沖區(qū)鏈表讀指針316相對(duì)應(yīng)的)緩沖區(qū)鏈表讀指針326指向的位置處讀取發(fā)送緩沖區(qū)描述符。發(fā)送緩沖區(qū)鏈表312是“環(huán)繞”鏈表,意思是指針連續(xù)地遞增,然后鏈表的末端按環(huán)狀方式自動(dòng)環(huán)繞到起始。如果鏈表具有例如N個(gè)條目,可以說(shuō)讀和寫(xiě)指針遞增“模N”。還可以說(shuō)指針“模數(shù)遞增”,這暗含了鏈表的長(zhǎng)度。
與發(fā)送緩沖區(qū)鏈表312和發(fā)送數(shù)據(jù)緩沖區(qū)310相關(guān)聯(lián)的還有發(fā)送事件隊(duì)列318,它也是個(gè)環(huán)繞結(jié)構(gòu)。將事件寫(xiě)入到發(fā)送事件隊(duì)列318中的由NIC216上的發(fā)送事件隊(duì)列寫(xiě)指針332標(biāo)識(shí)的位置處,并由主機(jī)子系統(tǒng)214從該發(fā)送事件隊(duì)列中的由主機(jī)存儲(chǔ)器222中的發(fā)送事件隊(duì)列讀指針320標(biāo)識(shí)的位置處讀取事件。只要有可能,圖2的系統(tǒng)就使用事件而非中斷作為硬件狀態(tài)報(bào)告方法。為了改進(jìn)事件遞送潛伏期和整體總線(xiàn)效率,由NIC216將事件寫(xiě)出到主機(jī)存儲(chǔ)器222中,而不是由主機(jī)子系統(tǒng)214從NIC216中的位置讀取事件。
這里將指向發(fā)送緩沖區(qū)鏈表312中的讀指針314和寫(xiě)指針316稱(chēng)為是“主機(jī)中心”的,因此它們表示如由主機(jī)子系統(tǒng)214觀察到的隊(duì)列狀態(tài)。在各種實(shí)施例中,主機(jī)子系統(tǒng)214可以將這些指針進(jìn)行比較,以根據(jù)在該實(shí)施例中對(duì)于隊(duì)列深度管理需要什么來(lái)檢測(cè)隊(duì)列溢出狀況、隊(duì)列充滿(mǎn)狀況或隊(duì)列高或低水線(xiàn)(watermark)狀況。NIC216還保持有分別指向發(fā)送數(shù)據(jù)隊(duì)列310中的寫(xiě)指針324和讀指針326,如下所述。將NIC上的寫(xiě)指針324和讀指針326稱(chēng)為“設(shè)備中心”指針,因?yàn)樗鼈儽硎救缬蒒IC設(shè)備216觀察到的隊(duì)列狀態(tài)。按常規(guī)方式,主機(jī)子系統(tǒng)使用它的主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針314向發(fā)送緩沖區(qū)鏈表312進(jìn)行寫(xiě)入,在進(jìn)行了寫(xiě)入之后使主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針314模數(shù)遞增,并通知NIC更新它的設(shè)備中心緩沖區(qū)鏈表寫(xiě)指針324。類(lèi)似地,NIC使用它的設(shè)備中心緩沖區(qū)鏈表讀指針326從發(fā)送緩沖區(qū)鏈表312進(jìn)行讀取,在進(jìn)行了讀取之后使設(shè)備中心緩沖區(qū)鏈表讀指針326模數(shù)遞增,并通知主機(jī)子系統(tǒng)214更新它的主機(jī)中心緩沖區(qū)鏈表讀指針316。由此,盡管盡力使得主機(jī)中心緩沖區(qū)鏈表讀指針與設(shè)備中心緩沖區(qū)鏈表讀指針、主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針與設(shè)備中心緩沖區(qū)鏈表寫(xiě)指針相同步,但是可能存在其中各對(duì)中的兩個(gè)指針并不完全匹配的某個(gè)時(shí)間點(diǎn)。重要的是,在該簡(jiǎn)化實(shí)施例中,主機(jī)子系統(tǒng)214不保持發(fā)送事件隊(duì)列寫(xiě)指針332的主機(jī)中心復(fù)本。NIC216確實(shí)保持有發(fā)送事件隊(duì)列讀指針320的設(shè)備中心復(fù)本344,但是它并不是用于事件隊(duì)列深度管理的。相反地,如下更詳細(xì)地描述的,它是用于管理對(duì)主機(jī)子系統(tǒng)的中斷的生成以激活發(fā)送事件處理器。
NIC216還包括將設(shè)備中心發(fā)送事件隊(duì)列寫(xiě)指針332中的值與設(shè)備中心發(fā)送事件隊(duì)列讀指針344中的值進(jìn)行比較的比較器346。當(dāng)這兩個(gè)值不相等時(shí),比較器346的輸出是有效的。NIC216還包括中斷使能寄存器位348和邏輯350,當(dāng)中斷使能寄存器位348和比較器346的輸出均有效時(shí)邏輯350觸發(fā)中斷發(fā)生器352。以下對(duì)中斷發(fā)生組件的操作進(jìn)行描述。
NIC216以及已經(jīng)提及的組件還保持有發(fā)送FIFO340,NIC216將它從發(fā)送數(shù)據(jù)緩沖區(qū)310取出的發(fā)送數(shù)據(jù)寫(xiě)入發(fā)送FIFO340中。由物理網(wǎng)絡(luò)接口(PHY)342將從發(fā)送FIFO340輸出的數(shù)據(jù)驅(qū)動(dòng)到網(wǎng)絡(luò)212上。
網(wǎng)絡(luò)接口卡216通過(guò)I/O總線(xiàn)218(及其他手段)與主機(jī)存儲(chǔ)器222相通信。優(yōu)選地,I/O總線(xiàn)218是PCI總線(xiàn),更優(yōu)選地PCI的版本是PCIexpress。在PCI Special Interest Group的“PCI Express Base Specification1.0a”(April 15,2003)中描述了PCI express,通過(guò)引用將其并入于此。通過(guò)核心邏輯子系統(tǒng)224使用直接存儲(chǔ)器存取(DMA)協(xié)議、經(jīng)由I/O總線(xiàn)218對(duì)大部分?jǐn)?shù)據(jù)(包括來(lái)自發(fā)送數(shù)據(jù)緩沖區(qū)310的發(fā)送數(shù)據(jù))進(jìn)行通信,盡管在主機(jī)子系統(tǒng)214與NIC216之間的某些通信可以涉及處理器子系統(tǒng)220。
現(xiàn)在參照?qǐng)D4,類(lèi)似于發(fā)送隊(duì)列,將接收隊(duì)列存儲(chǔ)在主機(jī)存儲(chǔ)器222中的一系列接收數(shù)據(jù)緩沖區(qū)410中。通過(guò)環(huán)繞接收緩沖區(qū)鏈表412將這些接收數(shù)據(jù)緩沖區(qū)鏈接起來(lái)。當(dāng)主機(jī)子系統(tǒng)214希望使得附加緩沖區(qū)可用于接受接收數(shù)據(jù)時(shí),它將新接收數(shù)據(jù)緩沖區(qū)的標(biāo)識(shí)寫(xiě)入接收緩沖區(qū)鏈表412中的由主機(jī)存儲(chǔ)器222中的主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針414指向的位置處。NIC216從接收緩沖區(qū)鏈表412中的由NIC216上的(與主機(jī)存儲(chǔ)器222中的主機(jī)中心緩沖區(qū)鏈表讀指針416相對(duì)應(yīng)的)設(shè)備中心緩沖區(qū)鏈表讀指針426指向的位置處讀取接收緩沖區(qū)描述符。
與接收緩沖區(qū)鏈表412和接收數(shù)據(jù)緩沖區(qū)410相關(guān)聯(lián)的還有環(huán)繞接收事件隊(duì)列418。將事件寫(xiě)入到接收事件隊(duì)列418中的由NIC216上的接收事件隊(duì)列寫(xiě)指針432標(biāo)識(shí)的位置處,并從該接收事件隊(duì)列418中的由主機(jī)存儲(chǔ)器222中的接收事件隊(duì)列讀指針420標(biāo)識(shí)的位置處讀取事件。對(duì)于發(fā)送事件隊(duì)列讀指針和寫(xiě)指針,按常規(guī)的方式,主機(jī)子系統(tǒng)使用它的主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針414向接收緩沖區(qū)鏈表412進(jìn)行寫(xiě)入,在進(jìn)行了寫(xiě)入之后使主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針414模數(shù)遞增,并通知NIC更新它的設(shè)備中心緩沖區(qū)鏈表寫(xiě)指針424。類(lèi)似地,NIC使用它的設(shè)備中心緩沖區(qū)鏈表讀指針426從接收緩沖區(qū)鏈表412進(jìn)行讀取,在進(jìn)行了讀取之后使設(shè)備中心緩沖區(qū)鏈表讀指針426模數(shù)遞增,并通知主機(jī)子系統(tǒng)214更新它的主機(jī)中心緩沖區(qū)鏈表讀指針416。重要的是,在該簡(jiǎn)化實(shí)施例中,主機(jī)子系統(tǒng)214不保持接收事件隊(duì)列寫(xiě)指針432的主機(jī)中心復(fù)本。如在發(fā)送端那樣,NIC216確實(shí)保持有接收事件隊(duì)列讀指針420的設(shè)備中心復(fù)本444,但是它是用于管理對(duì)主機(jī)子系統(tǒng)的中斷的生成以激活接收事件處理器,而不是用于事件隊(duì)列深度管理。
NIC216還包括將設(shè)備中心接收事件隊(duì)列寫(xiě)指針432中的值與設(shè)備中心接收事件隊(duì)列讀指針444中的值進(jìn)行比較的比較器446。當(dāng)這兩個(gè)值不相等時(shí),比較器446的輸出是有效的。NIC216還包括中斷使能寄存器位448和邏輯450,當(dāng)中斷使能寄存器位448和比較器446的輸出均有效時(shí)邏輯450觸發(fā)中斷發(fā)生器452。
NIC216以及圖3的發(fā)送設(shè)備和上述接收端組件還保持有接收FIFO440,NIC216將它從PHY342接收的數(shù)據(jù)寫(xiě)入接收FIFO440中。NIC216根據(jù)接收緩沖區(qū)鏈表412的當(dāng)前條目將從接收FIFO440輸出的數(shù)據(jù)寫(xiě)入接收數(shù)據(jù)緩沖區(qū)410中。
發(fā)送隊(duì)列操作,簡(jiǎn)化實(shí)施例在操作中,許多不同的功能并發(fā)地操作。圖5、6以及7是例示了使用圖3的結(jié)構(gòu)為了發(fā)送數(shù)據(jù)而執(zhí)行的功能的流程圖。對(duì)于這里的所有流程圖,應(yīng)當(dāng)理解,可以對(duì)這些流程圖中的許多步驟進(jìn)行組合,可以并行地執(zhí)行或在不影響所實(shí)現(xiàn)的功能的情況下按不同的次序來(lái)執(zhí)行這些步驟。此外,盡管這里將這些功能描述為按不同的“模塊”來(lái)執(zhí)行,但是應(yīng)當(dāng)理解,如果存在的話(huà),實(shí)際實(shí)現(xiàn)并不一定要按相同的方式來(lái)“模塊化”。
在圖5中,主機(jī)發(fā)送事件管理模塊從更高級(jí)軟件接收到一指示發(fā)送數(shù)據(jù)緩沖區(qū)310中的一個(gè)或更多個(gè)新緩沖區(qū)等待發(fā)送(步驟510)。還可以在輪詢(xún)循環(huán)或定時(shí)器到期時(shí)定期地激活該模塊(步驟512)。在步驟515中,主機(jī)子系統(tǒng)214確定數(shù)量“M”,其為待推發(fā)的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量。
在步驟518中,確定M大于還是等于某個(gè)最小閾值。在一個(gè)實(shí)施例中,該閾值為1,這意味著只要新發(fā)送數(shù)據(jù)緩沖區(qū)準(zhǔn)備好進(jìn)行發(fā)送并且在發(fā)送事件隊(duì)列318中存在任何可用空間就許可發(fā)送事件隊(duì)列318的事件。然而,逐個(gè)地許可事件會(huì)對(duì)I/O總線(xiàn)218增加顯著的額外開(kāi)銷(xiāo),因此在更優(yōu)選的實(shí)施例中,選擇較大的數(shù)作為該閾值。如果M小于該閾值,則主機(jī)發(fā)送事件隊(duì)列管理模塊500僅僅變得不活動(dòng),以等待下一激活事件(步驟530)。
如果M大于或等于該最小閾值,則在步驟522中主機(jī)子系統(tǒng)214將其主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針314更新(模數(shù)遞增)M個(gè)條目。在步驟524中,以先前(在步驟522之前)由主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針314指定的條目為起點(diǎn),主機(jī)子系統(tǒng)214將M個(gè)待(ready)發(fā)送數(shù)據(jù)緩沖區(qū)描述符寫(xiě)入發(fā)送緩沖區(qū)鏈表312中。在步驟526中,主機(jī)子系統(tǒng)214將所更新的寫(xiě)指針通知給NIC216,在步驟528中,NIC216更新它自己的設(shè)備中心緩沖區(qū)鏈表寫(xiě)指針324。在一個(gè)實(shí)施例中,將步驟526與528組合成單個(gè)步驟,在該步驟中,主機(jī)子系統(tǒng)214將所更新的寫(xiě)指針寫(xiě)入設(shè)備中心發(fā)送緩沖區(qū)鏈表寫(xiě)指針324的存儲(chǔ)器映射位置中。
在步驟530中,主機(jī)發(fā)送事件隊(duì)列管理模塊變得不活動(dòng),以等待下一激活事件。
圖6是例示了在NIC216上發(fā)起的用于將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)212上的功能的流程圖。在TX FIFO低水線(xiàn)(LWM)狀況610上激活NIC發(fā)送數(shù)據(jù)模塊600。在通過(guò)輪詢(xún)循環(huán)進(jìn)行選擇時(shí)或定時(shí)器到期時(shí)也定期地激活該模塊(步驟612)。
在步驟620中,NIC216首先確定在發(fā)送緩沖區(qū)鏈表312中并且待取出的發(fā)送數(shù)據(jù)緩沖區(qū)描述符的數(shù)量。通過(guò)從設(shè)備中心緩沖區(qū)鏈表寫(xiě)指針324模數(shù)減去設(shè)備中心緩沖區(qū)鏈表讀指針326,來(lái)進(jìn)行該確定。NIC還根據(jù)它自己的指向TX FIFO340中的讀和寫(xiě)指針知道在它自己的TX FIFO340中的可用空間。在步驟622中,NIC確定待發(fā)送緩沖區(qū)描述符的數(shù)量和TX FIFO340中的可用空間中的較小者M(jìn)。因此M是當(dāng)前可以被復(fù)制到TX FIFO340中的發(fā)送數(shù)據(jù)緩沖區(qū)描述符的數(shù)量。
在步驟626中,NIC216進(jìn)行到以由設(shè)備中心緩沖區(qū)鏈表讀指針326表示的條目為起點(diǎn)從發(fā)送緩沖區(qū)鏈表312中讀取M個(gè)緩沖區(qū)描述符。在步驟628中,NIC從主機(jī)存儲(chǔ)器中的發(fā)送數(shù)據(jù)緩沖區(qū)310中的由緩沖區(qū)描述符標(biāo)識(shí)的緩沖區(qū)取出數(shù)據(jù)。由于通過(guò)DMA經(jīng)由I/O總線(xiàn)218執(zhí)行從發(fā)送數(shù)據(jù)緩沖區(qū)310的數(shù)據(jù)取出,因此這里有時(shí)將發(fā)送緩沖區(qū)描述符稱(chēng)為DMA描述符或DMA命令。對(duì)M個(gè)緩沖區(qū)描述符本身的取出也是通過(guò)DMA經(jīng)由I/O總線(xiàn)218來(lái)執(zhí)行。
注意,在不同的實(shí)施例中,對(duì)M個(gè)緩沖區(qū)描述符的讀取可以與對(duì)發(fā)送數(shù)據(jù)的讀取相交織或按流水線(xiàn)式進(jìn)行,而不是作為獨(dú)立的原子步驟(atomic step)來(lái)執(zhí)行。還要注意的是,從由已存在于FIFO340中的緩沖區(qū)描述符標(biāo)識(shí)的發(fā)送數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù)不是等到低水線(xiàn)或閾值數(shù)量的緩沖區(qū)進(jìn)行取出。只使從發(fā)送緩沖區(qū)鏈表312中對(duì)緩沖區(qū)描述符的取出延遲,以進(jìn)行批處理;并且如果NIC216處理完了待發(fā)送數(shù)據(jù),也不為了進(jìn)行批處理而使這些描述符延遲。
在步驟630中,NIC對(duì)設(shè)備中心緩沖區(qū)鏈表讀指針326進(jìn)行更新。在一實(shí)施例中,NIC216不對(duì)相對(duì)應(yīng)的主機(jī)中心緩沖區(qū)鏈表讀指針316顯式地進(jìn)行更新,因?yàn)橛捎谕瓿墒录f送的結(jié)果,隱式或顯式地進(jìn)行通知。
在圖6的實(shí)施例中,每個(gè)發(fā)送完成事件都可以表示多個(gè)數(shù)據(jù)緩沖區(qū)完成。除了在某些下述更不常見(jiàn)的情況下以外,由每個(gè)發(fā)送完成事件表示的數(shù)據(jù)緩沖區(qū)完成的數(shù)量是可編程的,因而是固定數(shù)量B。
在步驟642中,NIC對(duì)N與B進(jìn)行比較,N是表示除在先前寫(xiě)入發(fā)送事件隊(duì)列318中的批處理發(fā)送完成事件中已報(bào)告的那些發(fā)送緩沖區(qū)以外的已從主機(jī)存儲(chǔ)器中取出的發(fā)送緩沖區(qū)的數(shù)量的值。如果N<B,則NIC發(fā)送數(shù)據(jù)模塊600僅僅變得不活動(dòng),以等待下一激活事件(步驟644)。另一方面,如果在步驟642中N>=B,則在步驟646中,以由設(shè)備中心發(fā)送事件隊(duì)列寫(xiě)指針標(biāo)識(shí)的條目為起點(diǎn),NIC216將表示B個(gè)發(fā)送數(shù)據(jù)緩沖區(qū)的整數(shù)倍(總共)的批處理發(fā)送完成事件寫(xiě)入發(fā)送事件隊(duì)列318中。因此在步驟646中寫(xiě)入的批處理發(fā)送完成事件的數(shù)量是N/B的整數(shù)部分,并且不將任何余數(shù)報(bào)告給主機(jī)子系統(tǒng)214,直到下一次寫(xiě)入這種完成事件時(shí)。
在一實(shí)施例中,NIC確定N=B,并且只要NIC的設(shè)備中心緩沖區(qū)鏈表寫(xiě)指針324是B的整數(shù)倍就寫(xiě)入批處理發(fā)送完成事件。
注意,當(dāng)完成了將數(shù)據(jù)從主機(jī)存儲(chǔ)器222傳送到發(fā)送FIFO340中時(shí),NIC216將發(fā)送完成事件寫(xiě)入發(fā)送事件隊(duì)列318中。它不進(jìn)行等待,直到將數(shù)據(jù)實(shí)際發(fā)送到網(wǎng)絡(luò)212上,這是因?yàn)橥ǔ8呒?jí)應(yīng)用軟件對(duì)發(fā)送錯(cuò)誤不感興趣。另一實(shí)施例不將‘發(fā)送完成’通知給主機(jī)子系統(tǒng),直到在將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上的處理中發(fā)生了隨后步驟,例如網(wǎng)絡(luò)接口設(shè)備完成了將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。如這里使用的,如果在特定實(shí)施例中對(duì)這種下游步驟的通知意味著NIC已經(jīng)完成了從發(fā)送數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù),則將這種通知視為“包括”如下步驟,即,向主機(jī)子系統(tǒng)通知網(wǎng)絡(luò)接口設(shè)備完成了從發(fā)送數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù)。
如果在步驟646中將任何發(fā)送完成事件寫(xiě)入發(fā)送事件隊(duì)列318中,則在步驟634中NIC216相應(yīng)地更新它自己的發(fā)送事件隊(duì)列寫(xiě)指針。在步驟634中對(duì)設(shè)備中心發(fā)送事件隊(duì)列寫(xiě)指針332的更新可能會(huì)導(dǎo)致產(chǎn)生一中斷(步驟636)以激活參照?qǐng)D7討論的主機(jī)發(fā)送事件處理器。如可以從圖3中的邏輯看到的,如果設(shè)備中心發(fā)送事件隊(duì)列寫(xiě)指針332先前等于設(shè)備中心發(fā)送事件隊(duì)列讀指針344,則在步驟634中進(jìn)行的更新會(huì)導(dǎo)致比較器346進(jìn)行輸出以過(guò)渡到活動(dòng)狀態(tài)。如果在出現(xiàn)該情況時(shí)中斷使能位348是有效的,則中斷發(fā)生器352將產(chǎn)生中斷。如果在步驟634中進(jìn)行更新時(shí)所述讀寫(xiě)指針先前不相等,則不會(huì)產(chǎn)生新的中斷,因?yàn)楸容^器346輸出將已經(jīng)處于活動(dòng)狀態(tài)。注意,在某些情況下對(duì)寫(xiě)指針332的更新會(huì)導(dǎo)致比較器346過(guò)渡到不活動(dòng)狀態(tài),尤其是如果該寫(xiě)指針已繞回并且就要追上讀指針。但是這不是邏輯350需要處理的情況,因?yàn)?,如下所述,將算法設(shè)計(jì)成使得如果出現(xiàn)了該情況則中斷使能位348總是不活動(dòng)的。
在步驟636之后,NIC發(fā)送數(shù)據(jù)模塊600失活(步驟644)。
圖7是例示了主機(jī)發(fā)送事件處理器模塊700的相關(guān)功能的流程圖。要么在接收到中斷時(shí)(步驟710)、要么在步驟636(圖6)中產(chǎn)生中斷時(shí)、要么在通過(guò)輪詢(xún)循環(huán)定期地進(jìn)行選擇時(shí)、要么在定時(shí)器到期時(shí)(步驟712)激活模塊700。
在步驟720中,主機(jī)子系統(tǒng)214在事件隊(duì)列中的由發(fā)送事件隊(duì)列讀指針320指定的位置處取出事件描述符。如果該新事件處于清空狀態(tài)(步驟722),則發(fā)送事件隊(duì)列318還不是空的。在步驟726中,確定新事件是否為發(fā)送完成事件。在一個(gè)實(shí)施例中,發(fā)送事件隊(duì)列318不能含有除發(fā)送完成事件以外的任何事件,但是在另一實(shí)施例中它可以如此。由此,如果當(dāng)前事件是除發(fā)送完成事件以外的事件,如管理事件,則在步驟728中對(duì)其進(jìn)行處理。
如果當(dāng)前事件是發(fā)送完成事件,則在步驟730中,主機(jī)子系統(tǒng)214使發(fā)送緩沖區(qū)鏈表312的主機(jī)中心緩沖區(qū)鏈表讀指針316模數(shù)遞增在當(dāng)前發(fā)送完成事件中表示的緩沖區(qū)數(shù)量。這是主機(jī)子系統(tǒng)214借以知道NIC216已經(jīng)更新了它自己的設(shè)備中心緩沖區(qū)鏈表讀指針326的機(jī)制。然而,在一實(shí)施例中,NIC可以在發(fā)送完成事件中顯式地指定它的已更新設(shè)備中心緩沖區(qū)鏈表讀指針326。可以使用后一機(jī)制來(lái)替代前一機(jī)制,或者連同前一機(jī)制一起使用后一機(jī)制。
而且,在步驟730中,一旦主機(jī)已經(jīng)使主機(jī)中心緩沖區(qū)鏈表讀指針316遞增得超過(guò)了特定發(fā)送數(shù)據(jù)緩沖區(qū)描述符,它還將所標(biāo)識(shí)的發(fā)送緩沖區(qū)釋放回池中。最終,在更高級(jí)軟件使用新數(shù)據(jù)再填充了該緩沖區(qū)之后,主機(jī)會(huì)將數(shù)據(jù)緩沖區(qū)描述符再寫(xiě)入發(fā)送緩沖區(qū)鏈表312中以再次使其入隊(duì),以通過(guò)NIC216進(jìn)行發(fā)送。
在步驟732中,主機(jī)子系統(tǒng)214清除發(fā)送事件隊(duì)列318中的由當(dāng)前發(fā)送事件隊(duì)列讀指針標(biāo)識(shí)的位置處的事件描述符,在步驟734中,主機(jī)子系統(tǒng)214使發(fā)送事件隊(duì)列讀指針320模數(shù)遞增。然后該模塊返回到步驟720以取出下一事件描述符,依此類(lèi)推,直到取出一清空的條目然后該模塊變得不活動(dòng)(步驟724)。
如果在步驟722中確定所取出的下一事件描述符是清空的,則發(fā)送事件隊(duì)列318此時(shí)不再含有其他待處理事件。在步驟723中,如果主機(jī)中心發(fā)送事件隊(duì)列讀指針320已發(fā)生了變化,則作為如以下更詳細(xì)地描述的一種管理事件隊(duì)列中斷的手段,主機(jī)將所更新的指針值寫(xiě)入NIC的設(shè)備中心發(fā)送事件隊(duì)列讀指針中。然后在步驟724中主機(jī)發(fā)送事件處理器700變得不活動(dòng)。
接收隊(duì)列操作,簡(jiǎn)化實(shí)施例圖8到11是例示了用于使用圖4的結(jié)構(gòu)接收數(shù)據(jù)而執(zhí)行的功能的流程圖。接收隊(duì)列操作在許多方面與如上所述的發(fā)送隊(duì)列操作是類(lèi)似的,因此這里將略去已經(jīng)描述的操作的某些方面。在圖8中,主機(jī)接收事件管理模塊從更高級(jí)軟件接收如下指示接收數(shù)據(jù)緩沖區(qū)410中的新數(shù)據(jù)緩沖區(qū)是空的并且可用于接收數(shù)據(jù)(步驟811)。還響應(yīng)于主機(jī)對(duì)接收緩沖區(qū)鏈表空事件的接收而激活該模塊(步驟810)。還可以在輪詢(xún)循環(huán)或定時(shí)器到期時(shí)定期地激活該模塊(步驟812)。在步驟815中,主機(jī)子系統(tǒng)214確定數(shù)量‘M’,其為待推(push)的數(shù)據(jù)緩沖區(qū)的數(shù)量。
在步驟818中,確定M大于還是等于某個(gè)最小閾值。優(yōu)選地,該最小閾值為1,但是在其他實(shí)施例中選擇較大的數(shù)量作為該閾值。如果M小于該閾值,則主機(jī)接收事件隊(duì)列管理模塊800僅僅變得不活動(dòng),以等待下一激活事件(步驟830)。
如果M大于或等于最小閾值,則在步驟822中,主機(jī)子系統(tǒng)214將其主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針414更新(模數(shù)遞增)M個(gè)條目。在步驟824中,以先前(在步驟822之前)由主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針414指定的條目為起點(diǎn),主機(jī)子系統(tǒng)214將M個(gè)可用接收數(shù)據(jù)緩沖區(qū)描述符寫(xiě)入接收緩沖區(qū)鏈表412中。在步驟826中,主機(jī)子系統(tǒng)214將所更新的寫(xiě)指針通知給NIC216,在步驟828中,NIC216更新它自己的設(shè)備中心緩沖區(qū)鏈表寫(xiě)指針424。在一個(gè)實(shí)施例中,將步驟826與828組合成單個(gè)步驟,在該步驟中,主機(jī)子系統(tǒng)214將所更新的寫(xiě)指針寫(xiě)入設(shè)備中心接收緩沖區(qū)鏈表寫(xiě)指針424的存儲(chǔ)器映射位置中。
在步驟830中,主機(jī)接收事件隊(duì)列管理模塊變得不活動(dòng),以等待下一激活事件。
圖9是例示了當(dāng)從網(wǎng)絡(luò)212接收到數(shù)據(jù)時(shí)在NIC216上發(fā)起的功能的流程圖。將來(lái)達(dá)數(shù)據(jù)置于RX FIFO440中,當(dāng)達(dá)到高水線(xiàn)時(shí),激活NIC接收數(shù)據(jù)模塊900(步驟910)。與發(fā)送端不同,NIC216不將固定數(shù)量個(gè)接收數(shù)據(jù)緩沖區(qū)完成批處理到各接收完成事件中。然而,在一個(gè)實(shí)施例中,它確實(shí)進(jìn)行等待,以在一分組完成時(shí)斷言單個(gè)接收完成事件,即使該分組占據(jù)一個(gè)以上接收數(shù)據(jù)緩沖區(qū)。
在步驟912中,NIC216取出下一接收緩沖區(qū)的描述符,并從由設(shè)備中心緩沖區(qū)鏈表讀指針426指定的接收緩沖區(qū)鏈表412的條目起進(jìn)行偏移。在步驟914中,NIC216對(duì)它的設(shè)備中心緩沖區(qū)鏈表讀指針進(jìn)行更新(模數(shù)遞增)。此時(shí)NIC不將新的讀指針通知給主機(jī)214,因?yàn)槿缦滤鰧⑼ㄟ^(guò)事件遞送隱式或顯式地進(jìn)行該通知。
在步驟916中,以所指定的偏移量為起點(diǎn),NIC216將來(lái)自來(lái)達(dá)分組的數(shù)據(jù)寫(xiě)入由所取出的描述符指定的接收數(shù)據(jù)緩沖區(qū)中。通過(guò)DMA繼續(xù)進(jìn)行寫(xiě)入,直到達(dá)到當(dāng)前數(shù)據(jù)緩沖區(qū)的末端或達(dá)到來(lái)達(dá)數(shù)據(jù)分組的末端,或這兩者。
在步驟920中,NIC確定是否達(dá)到了分組末端。若否,則NIC接收數(shù)據(jù)模塊900返回到步驟912,以取出下一接收數(shù)據(jù)緩沖區(qū)的描述符。在本實(shí)施例中不斷言任何事件以表示“接收數(shù)據(jù)緩沖區(qū)已滿(mǎn)”?;谠诮邮站彌_區(qū)鏈表412中以主機(jī)中心RX隊(duì)列讀指針為起點(diǎn)的連續(xù)標(biāo)識(shí)的多個(gè)接收數(shù)據(jù)緩沖區(qū),主機(jī)214將變得知道哪個(gè)接收數(shù)據(jù)緩沖區(qū)是滿(mǎn)的。
如果步驟920確定已達(dá)到分組末端,則在步驟922中NIC216斷言一接收完成事件,以覆蓋含有來(lái)自分組的數(shù)據(jù)的所有接收數(shù)據(jù)緩沖區(qū)。注意,在本實(shí)施例中,即使分組數(shù)據(jù)跨過(guò)接收數(shù)據(jù)緩沖區(qū)410中的多個(gè)緩沖區(qū),也只斷言一個(gè)接收完成事件。由接收緩沖區(qū)鏈表412中的多個(gè)連續(xù)條目將多個(gè)緩沖區(qū)鏈接在一起。還要注意,如果分組末端與接收緩沖區(qū)的末端不相一致,則保留緩沖區(qū)中的剩余空間,而不使用它。
主機(jī)(在一個(gè)實(shí)施例中)知道由接收完成事件覆蓋的接收數(shù)據(jù)緩沖區(qū)是由在接收緩沖區(qū)鏈表412中的描述符標(biāo)識(shí)的、以由主機(jī)中心緩沖區(qū)鏈表讀指針416指向的條目為起點(diǎn)并在由主機(jī)中心緩沖區(qū)鏈表寫(xiě)指針414指向的條目之前終止的那些接收數(shù)據(jù)緩沖區(qū)。在另一實(shí)施例中,通過(guò)在接收完成事件描述符格式中包括一附加字段以含有如在步驟914中由NIC216更新的設(shè)備中心緩沖區(qū)鏈表讀指針426的復(fù)制,可以避免競(jìng)爭(zhēng)狀態(tài)。然后主機(jī)可以將由接收完成事件覆蓋的接收數(shù)據(jù)緩沖區(qū)確定為由接收緩沖區(qū)鏈表412中的多個(gè)描述符標(biāo)識(shí)的、在如在接收完成事件中報(bào)告的主機(jī)中心緩沖區(qū)鏈表讀指針416與設(shè)備中心緩沖區(qū)鏈表讀指針之間的那些接收數(shù)據(jù)緩沖區(qū)。
在還一實(shí)施例中,NIC支持一個(gè)以上網(wǎng)絡(luò)端口。該實(shí)施例不對(duì)接收完成事件進(jìn)行批處理。該實(shí)施例支持標(biāo)準(zhǔn)大小數(shù)據(jù)分組(其中數(shù)據(jù)分組具有相對(duì)小的最大長(zhǎng)度并且所述多個(gè)接收數(shù)據(jù)緩沖區(qū)至少與該最大數(shù)據(jù)分組長(zhǎng)度一樣大)和“特大”數(shù)據(jù)分組(其中數(shù)據(jù)分組可以更長(zhǎng)并且可以跨過(guò)一個(gè)以上數(shù)據(jù)緩沖區(qū))。給定的接收隊(duì)列要么是標(biāo)準(zhǔn)模式的要么是特大模式的。如果該隊(duì)列是標(biāo)準(zhǔn)模式的,則不存在錯(cuò)誤,每個(gè)已充滿(mǎn)接收數(shù)據(jù)緩沖區(qū)都將含有一分組末端,因此沒(méi)有接收完成事件會(huì)表示一個(gè)以上數(shù)據(jù)緩沖區(qū)的完成,因而不會(huì)出現(xiàn)問(wèn)題。如果隊(duì)列是特大模式的,則仍然沒(méi)有接收完成事件會(huì)表示一個(gè)以上數(shù)據(jù)緩沖區(qū)的完成,因?yàn)閷?duì)于NIC填充的每個(gè)數(shù)據(jù)緩沖區(qū),它寫(xiě)入一接收完成事件。該接收完成事件格式包括“RX_Jumbo_Cont”位,NIC設(shè)置該位以通知主機(jī)子系統(tǒng)主體數(shù)據(jù)緩沖區(qū)不含有分組末端(即,將存在延續(xù)緩沖區(qū))。接收完成事件還包括NIC的已更新設(shè)備中心緩沖區(qū)鏈表讀指針426的復(fù)本,該指針現(xiàn)在指向來(lái)自通信接收緩沖區(qū)鏈表412的特定描述符,對(duì)于該特定描述符的數(shù)據(jù)緩沖區(qū),所述事件表示填滿(mǎn)。接收完成事件格式還表示從其接收了分組的NIC端口號(hào)。
回到圖9的實(shí)施例,在步驟922之后,一旦NIC已經(jīng)斷言一接收完成事件,NIC接收數(shù)據(jù)模塊900就回到不活動(dòng)狀態(tài)(步驟926)。
在步驟922中,NIC斷言含有特定信息的接收完成事件。圖10是該步驟的流程圖詳情。在步驟1010中,以由設(shè)備中心接收事件隊(duì)列寫(xiě)指針標(biāo)識(shí)的條目為起點(diǎn),NIC216將該接收完成事件寫(xiě)入接收事件隊(duì)列418中。在步驟1012中,NIC216相應(yīng)地更新它自己的接收事件隊(duì)列寫(xiě)指針。
同在發(fā)送端一樣,在步驟1012中對(duì)設(shè)備中心接收事件隊(duì)列寫(xiě)指針432的更新可能會(huì)導(dǎo)致產(chǎn)生一中斷(步驟1014)以激活參照?qǐng)D11討論的主機(jī)接收事件處理器。如可以從圖4中的邏輯看到的,如果設(shè)備中心接收事件隊(duì)列寫(xiě)指針432先前等于設(shè)備中心接收事件隊(duì)列讀指針444,則在步驟634中進(jìn)行的更新會(huì)導(dǎo)致比較器446進(jìn)行輸出以過(guò)渡到活動(dòng)狀態(tài)。如果在出現(xiàn)該情況時(shí)中斷使能位448是有效的,則中斷發(fā)生器452將產(chǎn)生中斷。如果在步驟634中進(jìn)行更新時(shí)所述讀寫(xiě)指針先前不相等,則不會(huì)產(chǎn)生新的中斷,因?yàn)楸容^器446輸出將已經(jīng)處于活動(dòng)狀態(tài)。同發(fā)送端一樣,邏輯450需要處理其中對(duì)寫(xiě)指針432的更新導(dǎo)致比較器446過(guò)渡到不活動(dòng)狀態(tài)的情況,因?yàn)閷⑺惴ㄔO(shè)計(jì)成使得如果出現(xiàn)了該情況則中斷使能位448總是不活動(dòng)的。
圖11是例示了主機(jī)接收事件處理器模塊1100的相關(guān)功能的流程圖。要么在接收到中斷時(shí)(步驟1110)、要么在步驟1014(圖10)中產(chǎn)生中斷時(shí)、要么在通過(guò)輪詢(xún)循環(huán)定期地進(jìn)行選擇時(shí)、要么在定時(shí)器到期時(shí)(步驟1112)激活模塊1100。
在步驟1120中,主機(jī)子系統(tǒng)214在事件隊(duì)列中的由接收事件隊(duì)列讀指針420指定的位置處取出事件描述符。如果該新事件不處于清空狀態(tài)(步驟1122),則接收事件隊(duì)列418此時(shí)含有待處理事件。在步驟1126中,確定該新事件是否為接收完成事件。在一個(gè)實(shí)施例中,接收事件隊(duì)列418不能含有除接收完成事件以外的任何事件,但是在另一實(shí)施例中它可以如此。由此,如果當(dāng)前事件是除接收完成事件以外的事件,如管理事件,則在步驟1128中對(duì)其進(jìn)行處理。
如果當(dāng)前事件是接收完成事件,則在步驟1148中,主機(jī)214對(duì)新接收的分組數(shù)據(jù)進(jìn)行處理。這可能需要將由多個(gè)連續(xù)接收緩沖區(qū)鏈表?xiàng)l目指定的幾個(gè)接收數(shù)據(jù)緩沖區(qū)順序地鏈接起來(lái)。主機(jī)214根據(jù)接收緩沖區(qū)鏈表412中的由主機(jī)中心緩沖區(qū)鏈表讀指針416指向的緩沖區(qū)描述符知道分組的起始緩沖區(qū)和偏移量,并且根據(jù)在接收完成事件中標(biāo)識(shí)的接收分組字節(jié)計(jì)數(shù)或者根據(jù)在接收完成事件中可能包括的設(shè)備中心緩沖區(qū)鏈表讀指針426的復(fù)本,知道分組的終點(diǎn)。在處理了這些緩沖區(qū)中的分組數(shù)據(jù)之后,主機(jī)可以將這些緩沖區(qū)釋放回池中,以最終將它們?cè)賹?xiě)入接收緩沖區(qū)鏈表412中以由不同的來(lái)達(dá)分組數(shù)據(jù)來(lái)再使用。
在步驟1150中,如果更高級(jí)軟件被如此地設(shè)計(jì),則主機(jī)子系統(tǒng)214可以使用新的可用接收數(shù)據(jù)緩沖區(qū)的描述符對(duì)由主機(jī)中心緩沖區(qū)鏈表讀指針416指向的接收緩沖區(qū)鏈表412條目進(jìn)行再編程,并且可以針對(duì)如下條目進(jìn)行同樣的處理所有連續(xù)的后續(xù)接收緩沖區(qū)鏈表?xiàng)l目,直到但不包括指向下一接收分組的數(shù)據(jù)的起點(diǎn)的接收緩沖區(qū)鏈表?xiàng)l目。在步驟1130中,主機(jī)子系統(tǒng)214使接收緩沖區(qū)鏈表412的主機(jī)中心緩沖區(qū)鏈表讀指針416模數(shù)遞增在當(dāng)前接收完成事件中表示的緩沖區(qū)數(shù)量。這是主機(jī)子系統(tǒng)214借以知道NIC216已經(jīng)更新了它自己的設(shè)備中心緩沖區(qū)鏈表讀指針426的機(jī)制。然而,在一實(shí)施例中,NIC可以在接收完成事件中顯式地指定它的已更新設(shè)備中心緩沖區(qū)鏈表讀指針426??梢允褂煤笠粰C(jī)制來(lái)替代前一機(jī)制,或者連同前一機(jī)制一起使用后一機(jī)制。
在步驟1132中,主機(jī)子系統(tǒng)214清除接收事件隊(duì)列418中的由當(dāng)前接收事件隊(duì)列讀指針標(biāo)識(shí)的位置處的事件描述符,在步驟1134中,主機(jī)子系統(tǒng)214使接收事件隊(duì)列讀指針420模數(shù)遞增。然后該模塊返回到步驟1120以取出下一事件描述符,依此類(lèi)推,直到取出一清空的條目然后該模塊變得不活動(dòng)(步驟1124)。
如果在步驟1122中確定所取出的下一事件描述符是清空的,則接收事件隊(duì)列418此時(shí)不再含有其他待處理事件。在步驟1123中,如果主機(jī)中心接收事件隊(duì)列讀指針420已發(fā)生了變化,則主機(jī)將所更新的指針值寫(xiě)入NIC的設(shè)備中心接收事件隊(duì)列讀指針中。然后在步驟1124中主機(jī)接收事件處理器1100變得不活動(dòng)。
中斷管理如上所述,NIC216保持有用于發(fā)送事件隊(duì)列318和接收事件隊(duì)列418中的每一個(gè)的設(shè)備中心事件隊(duì)列讀指針344或444。如下所述,將這些讀指針用于中斷管理。在一個(gè)實(shí)施例中,僅在主機(jī)子系統(tǒng)214的選擇下將它們用于中斷管理。出于下述原因,主機(jī)可以只使用設(shè)備中心接收事件隊(duì)列讀指針444,而使設(shè)備中心發(fā)送事件隊(duì)列讀指針344完全不被使用。在這種實(shí)施例中,主機(jī)永遠(yuǎn)都不將事件隊(duì)列讀指針更新寫(xiě)入設(shè)備中心發(fā)送事件隊(duì)列讀指針344中(即,略去圖7中的步驟723)。
圖15是例示了在主機(jī)子系統(tǒng)214與NIC216之間的交互(用于對(duì)NIC216的中斷生成進(jìn)行管理以激活圖11的主機(jī)接收事件處理器)的流程圖。將該交互設(shè)計(jì)成使所需中斷次數(shù)最少化同時(shí)還避免競(jìng)爭(zhēng)狀況的概率。圖15中的某些步驟重復(fù)了亦為其他流程圖的一部分的多個(gè)步驟,但是將這些步驟集合在圖15中會(huì)有助于例示它們與中斷管理的關(guān)系。
在主機(jī)接收事件處理器1100中,在處理了它已從接收事件隊(duì)列418取出的一個(gè)或更多個(gè)接收事件之后,它可以將一已更新的接收事件隊(duì)列讀指針寫(xiě)入NIC216上的設(shè)備中心接收事件隊(duì)列讀指針444中(步驟1123)。在圖15中將該步驟示為步驟1508。通過(guò)寫(xiě)入這種值,主機(jī)將它的觀點(diǎn)指示給NIC接收事件隊(duì)列418現(xiàn)在是空的。如果NIC216的觀點(diǎn)是真實(shí)的,則設(shè)備中心接收事件隊(duì)列寫(xiě)指針432和讀指針434現(xiàn)在是相等的。在步驟1510中NIC由此(通過(guò)比較器446)將這兩個(gè)值進(jìn)行比較,如果它們相等,則NIC還通過(guò)將中斷使能寄存器位448設(shè)置為它的活動(dòng)狀態(tài)來(lái)再使能用于接收事件隊(duì)列418的中斷(步驟1512)。響應(yīng)于對(duì)設(shè)備中心接收事件隊(duì)列讀指針的更新并且與該更新原子地發(fā)生對(duì)中斷的再使能;對(duì)這種更新值的寫(xiě)入構(gòu)成了單個(gè)組合指令,以使用該新值來(lái)更新設(shè)備中心接收事件隊(duì)列讀指針并再使能中斷。在使能了中斷的情況下,NIC216上的接收事件隊(duì)列中斷管理模塊接著變得不活動(dòng)(步驟1514),直到NIC將新接收完成事件寫(xiě)入接收事件隊(duì)列418中(步驟1010)并相應(yīng)地更新設(shè)備中心接收事件隊(duì)列寫(xiě)指針432(步驟1012)。設(shè)備中心接收事件隊(duì)列讀指針444與寫(xiě)指針432此時(shí)不相等,然后在步驟1516中,由于從步驟1512起一直使能了中斷,因此NIC接收數(shù)據(jù)模塊產(chǎn)生一中斷以激活圖11的主機(jī)接收事件處理器(如在步驟1014中闡述的)。NIC216還通過(guò)對(duì)中斷使能位448進(jìn)行再設(shè)置來(lái)原子地禁用(抑制)其他接收事件隊(duì)列中斷生成,從而在不產(chǎn)生其他中斷的情況下臨時(shí)地允許NIC接收數(shù)據(jù)模塊將其他事件寫(xiě)入接收事件隊(duì)列418中。然后接收事件隊(duì)列中斷管理模塊回到步驟1508,等待由另一已更新接收事件隊(duì)列讀指針的主機(jī)進(jìn)行的下一寫(xiě)入。當(dāng)發(fā)生該下一寫(xiě)入時(shí),如前所述,NIC再次針對(duì)相等性將設(shè)備中心讀指針與寫(xiě)指針進(jìn)行比較(步驟1510),并再次在禁用中斷的情況下進(jìn)行等待,直到NIC將另一事件寫(xiě)入接收事件隊(duì)列418中(步驟1514)。
如果在步驟1510中NIC216確定設(shè)備中心事件隊(duì)列讀指針與寫(xiě)指針不相等,則這表示NIC216未共享主機(jī)的觀點(diǎn)接收事件隊(duì)列418現(xiàn)在是空的。這可能會(huì)在如下情況下發(fā)生例如,如果NIC處于正在將更多接收完成事件寫(xiě)入接收事件隊(duì)列418的過(guò)程中(NIC接收數(shù)據(jù)模塊的步驟1010),同時(shí)在主機(jī)接收事件處理器的步驟1122中主機(jī)確定下一取出的事件描述符是空的。如果出現(xiàn)了該競(jìng)爭(zhēng)狀態(tài),則NIC216通過(guò)在步驟1510中確定所述兩個(gè)指針不相等(即,設(shè)備中心接收事件隊(duì)列寫(xiě)指針432在設(shè)備中心接收事件隊(duì)列讀指針444之前)將檢測(cè)到該競(jìng)爭(zhēng)狀態(tài)。在此情況下NIC將使中斷被禁用,并將立即產(chǎn)生另一中斷以激活主機(jī)接收事件處理器(步驟1518)。這將給予主機(jī)這樣一個(gè)機(jī)會(huì),即,當(dāng)主機(jī)在步驟1122中不正確地確定接收事件隊(duì)列418是空的時(shí),它可以處理正在處理中的事件。
注意,NIC接收數(shù)據(jù)模塊可以繼續(xù)將更多個(gè)的事件寫(xiě)入接收事件隊(duì)列418中,并且如果在步驟1122中主機(jī)接收事件處理器檢測(cè)到它們,則將處理它們。如果在主機(jī)下一次向NIC寫(xiě)入已更新的接收事件隊(duì)列讀指針時(shí)(步驟1123)這些附加事件仍然未被處理,則在步驟1510中將再次檢測(cè)到該新競(jìng)爭(zhēng)狀態(tài),然后產(chǎn)生還一中斷;依此類(lèi)推。
如果在特定實(shí)施例中在發(fā)送端使用事件隊(duì)列中斷管理模塊,則針對(duì)發(fā)送類(lèi)似地實(shí)現(xiàn)以上針對(duì)接收事件隊(duì)列中斷管理模塊(圖15)描述的機(jī)制。然而,如以上指出的,在另一實(shí)施例中,僅在接收端而不在發(fā)送端使用中斷管理模塊。這是因?yàn)樵诮邮斩讼M哂械蜐摲?,而在發(fā)送端潛伏性并不是那么重要。在發(fā)送端,對(duì)中斷的減少可能比發(fā)送完成事件的立即接收更重要。在這種實(shí)施例中用于中斷管理的所有上述硬件可以保留在NIC216上,但是主機(jī)發(fā)送事件處理器700從不更新設(shè)備中心發(fā)送事件隊(duì)列讀指針344。因此中斷使能位348從不變活動(dòng),并且無(wú)論讀/寫(xiě)指針比較器346的輸出如何,中斷發(fā)生器352都不產(chǎn)生中斷。相反,只在定時(shí)器到期時(shí)或在設(shè)備驅(qū)動(dòng)器中通過(guò)輪詢(xún)循環(huán)進(jìn)行選擇時(shí)激活主機(jī)發(fā)送事件處理器700(步驟712)。這允許主機(jī)子系統(tǒng)針對(duì)何時(shí)和以何頻度輪詢(xún)發(fā)送事件隊(duì)列418中的新事件進(jìn)行它自己的軟件型判決,而不是由NIC產(chǎn)生的中斷來(lái)支配。
在許多實(shí)施例中,在步驟1512和1516中對(duì)中斷的使能和禁用不必總體地作為應(yīng)用于整個(gè)外設(shè)216的功能。例如,可以通過(guò)掩蓋機(jī)制實(shí)現(xiàn)該功能。在該意義下,這里使用的術(shù)語(yǔ)禁用和使能與諸如對(duì)中斷的掩蓋和解掩蓋、以及對(duì)中斷的許可和抑制是可互換的。此外,典型地,由于主機(jī)事件處理器在將它自己的已更新事件隊(duì)列讀指針寫(xiě)入NIC216之后通常失活(見(jiàn)圖11,步驟1124),等待再激活新中斷(步驟1110),因此也可以將對(duì)事件隊(duì)列讀指針的寫(xiě)入視為中斷請(qǐng)求。這里在使能中斷與中斷請(qǐng)求之間沒(méi)有區(qū)別。
多重隊(duì)列實(shí)施例本發(fā)明在網(wǎng)絡(luò)接口架構(gòu)中尤其有用,在網(wǎng)絡(luò)接口架構(gòu)中,協(xié)議棧的部分位于操作系統(tǒng)內(nèi)核和傳輸庫(kù)中,以由用戶(hù)級(jí)應(yīng)用直接調(diào)用。在2004年4月21日提交的英國(guó)專(zhuān)利公報(bào)No.GB0408876A0(標(biāo)題為“User-levelStack”)中描述了這樣一種架構(gòu)的示例,通過(guò)引用將其并入于此。在這種架構(gòu)中,可以支持各種協(xié)議棧,每種協(xié)議棧都帶有它自己的發(fā)送和接收數(shù)據(jù)結(jié)構(gòu)組,并且所有協(xié)議棧都由在NIC上的硬件中執(zhí)行的功能來(lái)協(xié)助。
圖12是其中通過(guò)NIC1210上的硬件協(xié)助來(lái)支持多個(gè)協(xié)議棧的系統(tǒng)的簡(jiǎn)化框圖。NIC1210不僅包括常規(guī)硬件NIC部分1212,而且包括多個(gè)“虛”NIC部分(VNIC)1214。對(duì)于操作系統(tǒng)來(lái)說(shuō),NIC1210看起來(lái)是具有兩個(gè)設(shè)備驅(qū)動(dòng)器的雙功能設(shè)備與常規(guī)NIC部分1212相通信的常規(guī)設(shè)備驅(qū)動(dòng)器1216,和與VNIC1214相通信的用戶(hù)設(shè)備驅(qū)動(dòng)器1218。一般來(lái)講,由內(nèi)核1220中的常規(guī)協(xié)議棧(未示出)使用常規(guī)設(shè)備驅(qū)動(dòng)器1216,由多個(gè)用戶(hù)級(jí)協(xié)議棧1222中的每一個(gè)來(lái)使用用戶(hù)設(shè)備驅(qū)動(dòng)器1218。為多個(gè)用戶(hù)級(jí)應(yīng)用(或處理)1224中的每一個(gè)創(chuàng)建獨(dú)立用戶(hù)專(zhuān)用協(xié)議棧1222。用戶(hù)級(jí)應(yīng)用可以通過(guò)呼叫內(nèi)核1220與網(wǎng)絡(luò)212相通信,但是優(yōu)選地它們通過(guò)它們的相應(yīng)用戶(hù)級(jí)協(xié)議棧1222與網(wǎng)絡(luò)212相通信。
圖12的系統(tǒng)比圖3和4的系統(tǒng)更復(fù)雜,但是對(duì)于各單個(gè)發(fā)送或接收隊(duì)列,操作是類(lèi)似的。在這兩個(gè)實(shí)施例之間的主要差別源自圖12實(shí)施例掌握多個(gè)隊(duì)列的特性和狀態(tài)的更大的復(fù)雜性。以下對(duì)這些差異的有關(guān)細(xì)節(jié)進(jìn)行描述。
圖13是圖12的系統(tǒng)為了支持所述多個(gè)VNIC1214中的每一個(gè)的獨(dú)立發(fā)送隊(duì)列而使用的各種數(shù)據(jù)結(jié)構(gòu)的框圖。該圖表示在主機(jī)存儲(chǔ)器222中存在哪些結(jié)構(gòu)并且在NIC216上存在哪些結(jié)構(gòu)。所有發(fā)送隊(duì)列的發(fā)送數(shù)據(jù)緩沖區(qū)310、發(fā)送緩沖區(qū)鏈表312以及發(fā)送事件隊(duì)列318都駐留在主機(jī)存儲(chǔ)器222中,并由一般化的多個(gè)緩沖區(qū)組成,在主機(jī)存儲(chǔ)器222中這些緩沖區(qū)可以是彼此不連續(xù)并散布開(kāi)來(lái)的。在圖13中,將組成發(fā)送數(shù)據(jù)緩沖區(qū)310的緩沖區(qū)標(biāo)識(shí)為“TX DATA BUF#n”,將組成發(fā)送緩沖區(qū)鏈表312的緩沖區(qū)標(biāo)識(shí)為“TX QUEUE BUF#n”。將組成發(fā)送事件隊(duì)列318的緩沖區(qū)標(biāo)識(shí)為“TX EV QUEUE BUF#n”。
在一個(gè)實(shí)施例中單個(gè)緩沖區(qū)可以是4k或8k字節(jié)長(zhǎng)度的,并通過(guò)緩沖區(qū)描述符表1310中的多個(gè)物理上連續(xù)的描述符將這些緩沖區(qū)鏈接在一起,成為邏輯上連續(xù)的序列。例如,一個(gè)發(fā)送隊(duì)列(發(fā)送緩沖區(qū)鏈表312)可能占據(jù)主機(jī)存儲(chǔ)器222中的緩沖區(qū)1312、1314以及1316,這些緩沖區(qū)是不連續(xù)的并且可能是存儲(chǔ)器的多個(gè)無(wú)序區(qū)。通過(guò)緩沖區(qū)描述符表1310中的多個(gè)物理上連續(xù)的條目1318、1320以及1322將這些緩沖區(qū)鏈接在一起,成為單個(gè)邏輯上連續(xù)的空間。由主機(jī)214對(duì)條目1318、1320以及1322進(jìn)行寫(xiě)入和管理,并將它們視為環(huán)繞環(huán)。因此,例如,如果主機(jī)希望定義具有64k個(gè)發(fā)送數(shù)據(jù)緩沖區(qū)描述符的條目的發(fā)送緩沖區(qū)鏈表312,并且每個(gè)緩沖區(qū)的大小為4k,那么主機(jī)將為該發(fā)送緩沖區(qū)鏈表分配緩沖區(qū)描述符表1310中的物理上連續(xù)的16個(gè)條目序列。類(lèi)似地,一個(gè)發(fā)送事件隊(duì)列318可能占據(jù)主機(jī)存儲(chǔ)器222中的緩沖區(qū)1326、1328以及1330。這些緩沖區(qū)是不連續(xù)的并且可能在主機(jī)存儲(chǔ)器中是無(wú)序的,但是通過(guò)緩沖區(qū)描述符表1310中的多個(gè)物理上連續(xù)的條目1332、1334以及1336將這些緩沖區(qū)鏈接在一起,成為單個(gè)邏輯上連續(xù)的環(huán)繞空間。通過(guò)“緩沖區(qū)ID”為緩沖區(qū)描述符表1310編索引,此外,其每個(gè)條目還標(biāo)識(shí)了主機(jī)存儲(chǔ)器222中的相對(duì)應(yīng)的緩沖區(qū)的基地址等。
為了掌握可能同時(shí)與LAN212相通信的許多用戶(hù)級(jí)應(yīng)用的多個(gè)發(fā)送緩沖區(qū)鏈表和發(fā)送事件隊(duì)列中的每一個(gè)的狀態(tài),NIC216包括發(fā)送隊(duì)列描述符表1340和事件隊(duì)列描述符表1342。每個(gè)發(fā)送隊(duì)列(包括其發(fā)送數(shù)據(jù)緩沖區(qū)、其發(fā)送緩沖區(qū)鏈表以及其發(fā)送事件隊(duì)列)都具有相對(duì)應(yīng)的發(fā)送隊(duì)列ID,將該發(fā)送隊(duì)列ID用作發(fā)送隊(duì)列描述符表1340中的索引。發(fā)送隊(duì)列描述符表1340中的指定條目是用于描述該特定發(fā)送隊(duì)列的狀態(tài)和其他特性的起點(diǎn)(如由NIC216觀察到的)。此外,每個(gè)這種條目還標(biāo)識(shí)了*該隊(duì)列是內(nèi)核隊(duì)列、用戶(hù)隊(duì)列還是另一種隊(duì)列;*發(fā)送緩沖區(qū)鏈表312的大小(其可以包含的發(fā)送數(shù)據(jù)緩沖區(qū)描述符的數(shù)量);*與該發(fā)送隊(duì)列相關(guān)聯(lián)的發(fā)送事件隊(duì)列的ID;*待作為發(fā)送完成事件的一部分返回給事件隊(duì)列的隊(duì)列“標(biāo)簽”;*該發(fā)送隊(duì)列的發(fā)送緩沖區(qū)鏈表312中的基緩沖區(qū)的緩沖區(qū)ID;*指向該發(fā)送隊(duì)列的發(fā)送緩沖區(qū)鏈表312中的設(shè)備中心讀指針326和寫(xiě)指針324。
為了從主機(jī)存儲(chǔ)器222中的特定發(fā)送隊(duì)列中取出當(dāng)前發(fā)送數(shù)據(jù),NIC216首先使用該特定發(fā)送隊(duì)列的ID在發(fā)送隊(duì)列描述符表1340中查找含有該特定發(fā)送隊(duì)列的發(fā)送緩沖區(qū)鏈表312的基緩沖區(qū)的緩沖區(qū)ID。NIC216還從同一位置獲得指向到該緩沖區(qū)鏈表312中的當(dāng)前設(shè)備中心緩沖區(qū)鏈表讀指針326。然后它使用該基緩沖區(qū)ID作為基,使用該設(shè)備中心緩沖區(qū)鏈表讀指針高階位作為偏移量,到緩沖區(qū)描述符表1310中獲得主機(jī)存儲(chǔ)器222中的含有所述特定發(fā)送緩沖區(qū)鏈表312的緩沖區(qū)的基地址。然后NIC使用該基地址作為基,使用該設(shè)備中心緩沖區(qū)鏈表讀指針低階位乘以每個(gè)描述符占用的字節(jié)數(shù)作為偏移量,以從主機(jī)存儲(chǔ)器222取出所述特定發(fā)送緩沖區(qū)鏈表312中的當(dāng)前條目。注意,為了減少對(duì)主機(jī)存儲(chǔ)器222的訪(fǎng)問(wèn),在一個(gè)實(shí)施例中NIC216將發(fā)送緩沖區(qū)鏈表312的一部分高速緩存。
此外,所述特定發(fā)送緩沖區(qū)鏈表312的當(dāng)前條目還含有*當(dāng)前發(fā)送數(shù)據(jù)緩沖區(qū)的緩沖區(qū)ID;*到當(dāng)前發(fā)送數(shù)據(jù)緩沖區(qū)中的字節(jié)偏移量;以及*待從當(dāng)前發(fā)送數(shù)據(jù)緩沖區(qū)發(fā)送的字節(jié)數(shù)。
然后NIC216使用當(dāng)前發(fā)送數(shù)據(jù)緩沖區(qū)的緩沖區(qū)ID作為到緩沖區(qū)描述符表1310中的另一索引,以取出含有當(dāng)前發(fā)送數(shù)據(jù)的緩沖區(qū)的緩沖區(qū)描述符。注意,該緩沖區(qū)描述符是緩沖區(qū)描述符表1310中的單個(gè)條目;與含有發(fā)送隊(duì)列或發(fā)送事件隊(duì)列的緩沖區(qū)的描述符不同,該緩沖區(qū)描述符不是環(huán)的一部分。NIC216獲得當(dāng)前發(fā)送數(shù)據(jù)緩沖區(qū)在主機(jī)存儲(chǔ)器222中的物理地址,然后使用該物理地址作為基,并使用與發(fā)送緩沖區(qū)鏈表?xiàng)l目的字節(jié)偏移量作為偏移量,確定待發(fā)送的當(dāng)前數(shù)據(jù)在主機(jī)存儲(chǔ)器222中的物理起始地址。
如前所述,由發(fā)送隊(duì)列ID指定的發(fā)送隊(duì)列描述符表1340條目也含有與所述特定發(fā)送隊(duì)列相關(guān)聯(lián)的發(fā)送事件隊(duì)列的ID。由發(fā)送事件隊(duì)列描述符表1342中的相應(yīng)條目描述所有應(yīng)用1224的所有發(fā)送事件隊(duì)列。在發(fā)送事件隊(duì)列描述符表1342中由來(lái)自發(fā)送隊(duì)列描述符表1340的發(fā)送隊(duì)列ID標(biāo)識(shí)的條目是用于描述該特定發(fā)送事件隊(duì)列318的狀態(tài)和其他特性的起點(diǎn)(如由NIC216觀察到的)。此外,每個(gè)這種條目還都標(biāo)識(shí)了*該特定發(fā)送事件隊(duì)列318的大??;*組成該特定事件隊(duì)列318的基緩沖區(qū)的緩沖區(qū)ID;*與圖3的中斷使能位348相對(duì)應(yīng)的char_ev_enable位;*該特定事件隊(duì)列318的發(fā)送事件隊(duì)列寫(xiě)指針332;以及*該特定事件隊(duì)列318的發(fā)送事件隊(duì)列讀指針。
由此為了將一事件寫(xiě)入與特定發(fā)送隊(duì)列相關(guān)聯(lián)的特定事件隊(duì)列318中,NIC216使用從發(fā)送隊(duì)列描述符表1340中的相應(yīng)條目獲得的發(fā)送事件隊(duì)列ID,在發(fā)送事件隊(duì)列描述符表1342中查找含有所述特定發(fā)送隊(duì)列的發(fā)送事件隊(duì)列318的基緩沖區(qū)的緩沖區(qū)ID。NIC216還從同一位置獲得指向到該發(fā)送事件隊(duì)列318中的當(dāng)前發(fā)送事件隊(duì)列寫(xiě)指針332。然后它使用該基緩沖區(qū)ID作為基,使用發(fā)送事件隊(duì)列寫(xiě)指針高階位乘以每個(gè)描述符占用的字節(jié)數(shù)作為偏移量,到緩沖區(qū)描述符表1310中獲得主機(jī)存儲(chǔ)器222中的含有所述特定發(fā)送事件隊(duì)列318的當(dāng)前條目的緩沖區(qū)的基地址。然后NIC使用該基地址作為基,使用發(fā)送事件隊(duì)列寫(xiě)指針低階位作為偏移量,以將希望的事件描述符寫(xiě)入主機(jī)存儲(chǔ)器222中的所述特定發(fā)送事件隊(duì)列318的當(dāng)前條目中。
注意,如圖13所例示,雖然緩沖區(qū)描述符表1310所示的每個(gè)空隙(例如1332、1334、1318)表示單個(gè)描述符,但是主機(jī)存儲(chǔ)器222中的每個(gè)空隙(例如1326、1328、1314)表示信息存儲(chǔ)器“頁(yè)”。一頁(yè)例如可以是4k或8k字節(jié)長(zhǎng),因此如果發(fā)送隊(duì)列中的發(fā)送數(shù)據(jù)緩沖區(qū)描述符占據(jù)4或8字節(jié),則圖13所示的每個(gè)空隙1312、1314或1316可以保持512、1k或2k個(gè)發(fā)送數(shù)據(jù)緩沖區(qū)描述符。
圖14是圖12的系統(tǒng)為了支持所述多個(gè)VNIC1214中的每一個(gè)的獨(dú)立接收隊(duì)列而使用的各種數(shù)據(jù)結(jié)構(gòu)的框圖。該圖類(lèi)似于發(fā)送端的圖,因此這里不再對(duì)某些類(lèi)似特征進(jìn)行描述。
與發(fā)送端一樣,所有接收隊(duì)列的接收數(shù)據(jù)緩沖區(qū)410、接收緩沖區(qū)鏈表412以及接收事件隊(duì)列418都駐留在主機(jī)存儲(chǔ)器222中,并由一般化的多個(gè)緩沖區(qū)組成,在主機(jī)存儲(chǔ)器222中這些緩沖區(qū)可以是彼此不連續(xù)并散布開(kāi)來(lái)的。在圖14中,將組成接收數(shù)據(jù)緩沖區(qū)410的緩沖區(qū)標(biāo)識(shí)為“RX DATA BUF#n”,將組成接收緩沖區(qū)鏈表412的緩沖區(qū)標(biāo)識(shí)為“RXQUEUE BUF#n”。將組成接收事件隊(duì)列418的緩沖區(qū)標(biāo)識(shí)為“RX EVQUEUE BUF#n”。優(yōu)選地,將所有協(xié)議棧的發(fā)送事件隊(duì)列318與接收事件隊(duì)列418組合成一個(gè)總體事件隊(duì)列池。即,優(yōu)選地,將發(fā)送事件隊(duì)列描述符表1342和接收事件隊(duì)列描述符表1442實(shí)現(xiàn)為僅單個(gè)表。
仍然與發(fā)送端一樣,通過(guò)緩沖區(qū)描述符表1410中的多個(gè)物理上連續(xù)的描述符將單個(gè)緩沖區(qū)鏈接在一起,成為邏輯上連續(xù)的序列。通過(guò)“緩沖區(qū)ID”為緩沖區(qū)描述符表1410編索引,此外,其每個(gè)條目都標(biāo)識(shí)了主機(jī)存儲(chǔ)器222中的相對(duì)應(yīng)的緩沖區(qū)的基地址等。
為了掌握可能同時(shí)與LAN212相通信的許多用戶(hù)級(jí)應(yīng)用的多個(gè)接收緩沖區(qū)鏈表和接收事件隊(duì)列中的每一個(gè)的狀態(tài),與發(fā)送隊(duì)列描述符表1340類(lèi)似,NIC216包括接收隊(duì)列描述符表1440和事件隊(duì)列描述符表1442。每個(gè)接收隊(duì)列(包括其接收數(shù)據(jù)緩沖區(qū)、其接收緩沖區(qū)鏈表以及其接收事件隊(duì)列)都具有相對(duì)應(yīng)的接收隊(duì)列ID,將該接收隊(duì)列ID用作接收隊(duì)列描述符表1440中的索引。接收隊(duì)列描述符表1440中的指定條目是用于描述該特定接收隊(duì)列的狀態(tài)和其他特性的起點(diǎn)(如由NIC216觀察到的)。每個(gè)這種條目都大致標(biāo)識(shí)了與以上針對(duì)發(fā)送隊(duì)列描述符表1340中的條目描述的有關(guān)接收隊(duì)列的相同的信息。
如前所述,由接收隊(duì)列ID指定的接收隊(duì)列描述符表1440條目也含有與所述特定接收隊(duì)列相關(guān)聯(lián)的接收事件隊(duì)列的ID。由接收事件隊(duì)列描述符表1442中的相應(yīng)條目描述所有應(yīng)用1224的所有接收事件隊(duì)列。在接收事件隊(duì)列描述符表1442中由來(lái)自接收隊(duì)列描述符表1440的接收隊(duì)列ID標(biāo)識(shí)的條目是用于描述該特定接收事件隊(duì)列418的狀態(tài)和其他特性的起點(diǎn)(如由NIC216觀察到的)。每個(gè)這種條目都大致標(biāo)識(shí)了與以上針對(duì)發(fā)送事件隊(duì)列描述符表1342中的條目描述的有關(guān)接收事件隊(duì)列的相同的信息。與發(fā)送端一樣,至少對(duì)于事件隊(duì)列深度管理目的,該信息不必包括任何接收事件隊(duì)列418的設(shè)備中心接收事件隊(duì)列讀指針。
除與發(fā)送端的結(jié)構(gòu)相對(duì)應(yīng)的接收端的結(jié)構(gòu)以外,接收端還包括過(guò)濾表和邏輯塊1450。由于NIC216可以支持在用戶(hù)級(jí)應(yīng)用1224與LAN212上的遠(yuǎn)程代理之間的多個(gè)同時(shí)連接,并且由于NIC216支持使用多個(gè)發(fā)送和接收隊(duì)列的這些同時(shí)連接,因此由NIC216執(zhí)行的一個(gè)功能是將每個(gè)來(lái)達(dá)數(shù)據(jù)分組導(dǎo)引到正確的接收隊(duì)列。NIC216用以進(jìn)行該確定的機(jī)制對(duì)于對(duì)本發(fā)明的理解并不重要,但是需要指出的是,過(guò)濾表和邏輯1450保持有在分組首部信息與目的地接收隊(duì)列ID之間的對(duì)應(yīng)關(guān)系。由此過(guò)濾表和邏輯1450使用來(lái)自來(lái)達(dá)分組的首部信息來(lái)確定正確的目的地接收隊(duì)列的ID,并使用該接收隊(duì)列ID作為對(duì)接收隊(duì)列描述符表1440的索引。如以上針對(duì)發(fā)送端說(shuō)明的那樣,接收隊(duì)列ID是NIC216用以獲得與目的地接收隊(duì)列有關(guān)的所有所需信息(以正確地轉(zhuǎn)發(fā)分組數(shù)據(jù))的起點(diǎn)。
管理事件如上所述,在這里描述的實(shí)施例中將事件用作首要的狀態(tài)報(bào)告方法。事件是從NIC216中的各種資源收集的狀態(tài)字。如以上針對(duì)簡(jiǎn)化實(shí)施例描述的,事件可以產(chǎn)生中斷,但是如下所述,在圖12到14的實(shí)施例中對(duì)中斷的產(chǎn)生包括額外的間接級(jí)。使中斷最少化以降低中斷潛伏性和CPU開(kāi)銷(xiāo)。
同樣如上所述,將發(fā)送事件隊(duì)列描述符表1342和接收事件隊(duì)列描述符表1442優(yōu)選地僅實(shí)現(xiàn)為單個(gè)表。在一個(gè)這種實(shí)施例中,統(tǒng)一的事件隊(duì)列支持多達(dá)4k個(gè)事件隊(duì)列。事件隊(duì)列0到3專(zhuān)用于最多4個(gè)隊(duì)列,該最多4個(gè)隊(duì)列用于內(nèi)核網(wǎng)絡(luò)接口驅(qū)動(dòng)器(被公知為NET驅(qū)動(dòng)器)的分組傳送,事件隊(duì)列4專(zhuān)用于第二內(nèi)核驅(qū)動(dòng)器(被公知為CHAR驅(qū)動(dòng)器),該第二內(nèi)核驅(qū)動(dòng)器負(fù)責(zé)總體管理和在所有用戶(hù)隊(duì)列與它們相對(duì)應(yīng)的協(xié)議棧之間的協(xié)調(diào)。
事件具有如由事件描述符中的事件代號(hào)字段標(biāo)識(shí)的不同類(lèi)型。事件描述符的其余字段取決于事件類(lèi)型。已經(jīng)描述的兩種事件類(lèi)型是發(fā)送完成事件和接收完成事件;如前所述,如分別在發(fā)送隊(duì)列描述符表1340或接收隊(duì)列描述符表1440中設(shè)計(jì)的那樣,將這些事件發(fā)送給任何事件隊(duì)列。其他事件類(lèi)型專(zhuān)用于其他非IP LAN協(xié)議。每個(gè)事件隊(duì)列還具有在NIC216中的相關(guān)聯(lián)的定時(shí)器,這些定時(shí)器也可以為它們相應(yīng)的事件隊(duì)列產(chǎn)生事件。某些事件(包括大多數(shù)的管理事件)是嚴(yán)格意義上的CHAR驅(qū)動(dòng)器事件。只將這些事件發(fā)送給CHAR驅(qū)動(dòng)器而不發(fā)送給任何用戶(hù)事件隊(duì)列。還有的事件是全局事件,CHAR驅(qū)動(dòng)器或內(nèi)核驅(qū)動(dòng)器可以負(fù)責(zé)處理該全局事件。也可以由CHAR驅(qū)動(dòng)器或NET驅(qū)動(dòng)器來(lái)產(chǎn)生事件。CHAR和NET驅(qū)動(dòng)器可以為任何事件隊(duì)列產(chǎn)生任何希望的類(lèi)型的事件。
NIC216使用單個(gè)事件FIFO(未示出)來(lái)緩沖等待被寫(xiě)出到存儲(chǔ)器中的事件。事件FIFO的深度很淺,以確保低潛伏遞送。當(dāng)該FIFO已滿(mǎn)時(shí),所有代理都得到了背壓(back-pressured)。
共享事件隊(duì)列實(shí)施例在圖3、4、13以及14的實(shí)施例中,針對(duì)每個(gè)發(fā)送和接收數(shù)據(jù)隊(duì)列示出獨(dú)立的事件隊(duì)列。然而,在一優(yōu)選實(shí)施例中,主機(jī)子系統(tǒng)214可以指定單個(gè)事件隊(duì)列來(lái)接收關(guān)于若干不同數(shù)據(jù)隊(duì)列的事件。分配給單個(gè)事件隊(duì)列的數(shù)據(jù)隊(duì)列可以是發(fā)送隊(duì)列、接收隊(duì)列或這兩者。例如,主機(jī)子系統(tǒng)可能正在運(yùn)行充當(dāng)網(wǎng)絡(luò)212上的若干束TCP連接的端點(diǎn)的程序線(xiàn)程。通常,該線(xiàn)程針對(duì)各連接束具有獨(dú)立發(fā)送隊(duì)列和獨(dú)立接收隊(duì)列,但是通常僅具有用于接收與所有這種發(fā)送和接收隊(duì)列有關(guān)的事件的一個(gè)事件隊(duì)列。作為另一示例,一個(gè)程序線(xiàn)程可能具有一個(gè)以上事件隊(duì)列,或者幾個(gè)程序線(xiàn)程可能共享一個(gè)事件隊(duì)列。支持所有這種變化。此外,在多重隊(duì)列實(shí)施例中,同樣將諸如1342和1442的發(fā)送和接收事件隊(duì)列描述符表優(yōu)選地實(shí)現(xiàn)為僅單個(gè)表。
如上所述,特定數(shù)據(jù)隊(duì)列的隊(duì)列描述符表1340或1440(分別是發(fā)送或接收)中的條目包括這樣的字段該字段標(biāo)識(shí)了應(yīng)當(dāng)將與所述特定隊(duì)列有關(guān)的事件寫(xiě)入其中的事件隊(duì)列ID。當(dāng)NIC216耗用了來(lái)自特定數(shù)據(jù)隊(duì)列的發(fā)送或接收數(shù)據(jù)緩沖區(qū)并希望將一完成事件寫(xiě)入合適的事件隊(duì)列中時(shí),NIC216從隊(duì)列描述符表?xiàng)l目中的用于該特定數(shù)據(jù)隊(duì)列的該字段取出合適的事件隊(duì)列ID。隊(duì)列描述符表中的用于特定數(shù)據(jù)隊(duì)列的條目還包括隊(duì)列“標(biāo)簽”,NIC216會(huì)將該隊(duì)列“標(biāo)簽”包括進(jìn)來(lái),作為完成事件描述符中的數(shù)據(jù)。典型地,負(fù)責(zé)所述特定數(shù)據(jù)隊(duì)列的程序線(xiàn)程將向該標(biāo)簽字段寫(xiě)入該線(xiàn)程可以稍后(當(dāng)接收到完成事件時(shí))使用的代號(hào),以標(biāo)識(shí)該事件所屬的特定數(shù)據(jù)隊(duì)列ID。
多重隊(duì)列實(shí)施例中的中斷管理在多重隊(duì)列實(shí)施例中,如以上針對(duì)簡(jiǎn)化實(shí)施例描述的那樣對(duì)NET內(nèi)核隊(duì)列的中斷進(jìn)行管理。視硬件而定,要么每個(gè)內(nèi)核隊(duì)列都具有它自己的中斷,或者兩個(gè)或更多個(gè)內(nèi)核隊(duì)列共享中斷。在后一情況下,共享的中斷激活所有共享驅(qū)動(dòng)器,這些共享驅(qū)動(dòng)器中的每一個(gè)快速地確定它是否為負(fù)責(zé)處理該中斷的驅(qū)動(dòng)器。CHAR驅(qū)動(dòng)器也可以與一個(gè)或更多個(gè)NET隊(duì)列共享中斷。
然而,用戶(hù)隊(duì)列不是操作系統(tǒng)的一部分并且不能接收中斷。在本發(fā)明的一個(gè)方面中,可以通過(guò)添加一個(gè)間接層來(lái)實(shí)現(xiàn)類(lèi)似的功能。具體來(lái)說(shuō),在步驟636(用于發(fā)送)和1014(用于接收)中,相應(yīng)的NIC發(fā)送和接收數(shù)據(jù)模塊不直接中斷主機(jī)中的相應(yīng)發(fā)送和接收事件處理器。相反,它們向CHAR驅(qū)動(dòng)器的事件隊(duì)列寫(xiě)入“用戶(hù)事件隊(duì)列喚醒事件”,其包括(通過(guò)事件隊(duì)列ID來(lái))標(biāo)識(shí)需要激活的事件隊(duì)列的字段。在簡(jiǎn)化實(shí)施例中,通過(guò)中斷使能位348、448來(lái)許可中斷;在多事件實(shí)施例中,通過(guò)需要激活的用戶(hù)級(jí)事件隊(duì)列的事件隊(duì)列描述符中的char_ev_enable位來(lái)許可將用戶(hù)事件隊(duì)列喚醒事件寫(xiě)入CHAR驅(qū)動(dòng)器的事件隊(duì)列中。
CHAR驅(qū)動(dòng)器隊(duì)列在它忽略它的char_ev_enable位的意義上來(lái)說(shuō)與用戶(hù)級(jí)隊(duì)列不同,并且與簡(jiǎn)化實(shí)施例的不同之處在于其事件隊(duì)列含有引用另一隊(duì)列的驅(qū)動(dòng)器的喚醒事件而非數(shù)據(jù)傳送完成事件(盡管在一實(shí)施例中CHAR驅(qū)動(dòng)器事件隊(duì)列也可以含有數(shù)據(jù)傳送完成事件)。CHAR驅(qū)動(dòng)器隊(duì)列與簡(jiǎn)化實(shí)施例的類(lèi)似之處在于它仍然包括NIC上的中斷使能位。使用該位對(duì)中斷的使能和禁用實(shí)質(zhì)上與以上參照?qǐng)D3和4闡述的相同。
因此,連同向CHAR驅(qū)動(dòng)器事件隊(duì)列寫(xiě)入用戶(hù)事件隊(duì)列喚醒事件,只有接著使能了CHAR驅(qū)動(dòng)器中斷時(shí),NIC216才產(chǎn)生對(duì)運(yùn)行在主機(jī)子系統(tǒng)214上的CHAR驅(qū)動(dòng)器的中斷。然后立即關(guān)閉CHAR驅(qū)動(dòng)器隊(duì)列的中斷使能位,使得被寫(xiě)入CHAR事件隊(duì)列中的其他用戶(hù)事件隊(duì)列喚醒事件不會(huì)產(chǎn)生中斷(被寫(xiě)入CHAR事件隊(duì)列的其他種類(lèi)的事件也不會(huì)產(chǎn)生中斷)。換句話(huà)說(shuō),CHAR事件隊(duì)列不會(huì)產(chǎn)生其他中斷,直到CHAR驅(qū)動(dòng)器請(qǐng)求一個(gè)中斷。然而,NET驅(qū)動(dòng)器隊(duì)列可能仍然能夠產(chǎn)生中斷,因?yàn)樗兄袛嗍录?duì)列都按獨(dú)立的方式進(jìn)行操作。如以上參照?qǐng)D3和4闡述的,當(dāng)主機(jī)中的CHAR驅(qū)動(dòng)器相信它已經(jīng)清空了CHAR驅(qū)動(dòng)器事件隊(duì)列時(shí),它將它的已更新主機(jī)中心CHAR事件隊(duì)列讀指針寫(xiě)回NIC216,NIC216對(duì)它與設(shè)備中心寫(xiě)指針進(jìn)行比較,以確定是否再使能CHAR驅(qū)動(dòng)器中斷(如果這兩個(gè)指針相等)或斷言新的中斷(如果這兩個(gè)指針不相等)。由此避免了在下述情況下可能出現(xiàn)的競(jìng)爭(zhēng)狀態(tài)如果NIC正在將更多用戶(hù)事件隊(duì)列喚醒事件寫(xiě)入CHAR驅(qū)動(dòng)器事件隊(duì)列的過(guò)程中,同時(shí)主機(jī)中的CHAR驅(qū)動(dòng)器確定CHAR驅(qū)動(dòng)器事件隊(duì)列中的下一取出的描述符是空的。
當(dāng)CHAR驅(qū)動(dòng)器事件處理器從CHAR驅(qū)動(dòng)器事件隊(duì)列獲得用戶(hù)事件隊(duì)列喚醒事件時(shí),它進(jìn)行到如下操作激活負(fù)責(zé)在用戶(hù)事件隊(duì)列喚醒事件中標(biāo)識(shí)的事件隊(duì)列的主機(jī)事件處理器。
在用于中斷隊(duì)列(NET驅(qū)動(dòng)器隊(duì)列和CHAR驅(qū)動(dòng)器隊(duì)列)與用于非中斷隊(duì)列(用戶(hù)隊(duì)列)的中斷管理機(jī)制之間存在兩重性。如上所述,用于中斷隊(duì)列的驅(qū)動(dòng)器使能和禁用(抑制)特定隊(duì)列的中斷,而用于非中斷隊(duì)列的驅(qū)動(dòng)器使能和禁用NIC對(duì)特定隊(duì)列的喚醒事件的寫(xiě)入。這兩個(gè)處理的細(xì)微差異在于,對(duì)于中斷隊(duì)列,缺省狀態(tài)是其中將發(fā)生中斷的狀態(tài);在不希望發(fā)生中斷的時(shí)段中必須抑制這些中斷。另一方面,對(duì)于非中斷隊(duì)列,缺省狀態(tài)是其中不寫(xiě)入喚醒事件的狀態(tài)。必須請(qǐng)求喚醒事件以出現(xiàn)一個(gè)喚醒事件。然而,在這兩種情況下,在上述實(shí)施例中使能或禁用中斷的機(jī)制類(lèi)似于用于使能或禁用喚醒事件的機(jī)制連同對(duì)中斷/喚醒事件的發(fā)出一起禁用/抑制/扣留它們,并且通過(guò)向NIC對(duì)已更新事件隊(duì)列讀指針的寫(xiě)入來(lái)再使能/允許/請(qǐng)求它們。由此,這里在短語(yǔ)“對(duì)中斷的使能”、“對(duì)中斷的允許”或“對(duì)中斷的請(qǐng)求”之間沒(méi)有區(qū)別。類(lèi)似地,這里在短語(yǔ)“對(duì)喚醒事件的使能”、“對(duì)喚醒事件的允許”或“對(duì)喚醒事件的請(qǐng)求”之間沒(méi)有區(qū)別。即使在其中用/于中斷隊(duì)列的機(jī)制與用于非中斷隊(duì)列的機(jī)制不相同的實(shí)施例中,這里在這些術(shù)語(yǔ)之中也沒(méi)有區(qū)別。
可以看到,即使用戶(hù)級(jí)驅(qū)動(dòng)器實(shí)際上不能接收中斷,通過(guò)向用于對(duì)中斷進(jìn)行協(xié)調(diào)的CHAR驅(qū)動(dòng)器發(fā)送喚醒事件而提供的附加間接層也允許用戶(hù)級(jí)隊(duì)列及其驅(qū)動(dòng)器按與中斷操作系統(tǒng)隊(duì)列大致相同的方式進(jìn)行操作。即使在可以接收中斷的多個(gè)驅(qū)動(dòng)器的實(shí)施例中,附加間接層也是有益的,因?yàn)樗粌H有助于單個(gè)地使各事件隊(duì)列的中斷最少化,而且有助于整體地使在所有事件隊(duì)列上的中斷最少化。
外設(shè)向中間事件隊(duì)列寫(xiě)入事件(“參考”事件)、調(diào)用中間事件隊(duì)列處理器以針對(duì)不同的(“被參考”)事件隊(duì)列執(zhí)行功能的技術(shù)并不限于用于激活有意阻斷對(duì)喚醒事件的等待的參考隊(duì)列的處理器的喚醒事件。也不限于其中中間隊(duì)列是中斷隊(duì)列而參考隊(duì)列不是中斷隊(duì)列的情況。作為示例,在2004年2月3日提交的英國(guó)專(zhuān)利公報(bào)0404696.7(標(biāo)題為“DualDriver Interface”,通過(guò)應(yīng)用將其并入于此)中描述的一個(gè)實(shí)施例中,支持多個(gè)內(nèi)核事件隊(duì)列。當(dāng)一事件已在隊(duì)列(參考隊(duì)列)上保留了一定延長(zhǎng)時(shí)段時(shí)(這表示參考隊(duì)列停滯住了),外設(shè)能夠檢測(cè)到。例如,如果與隊(duì)列相關(guān)聯(lián)的應(yīng)用、驅(qū)動(dòng)器或傳輸庫(kù)出現(xiàn)了故障,或者已經(jīng)終止或被排除在計(jì)劃以外,該隊(duì)列可能會(huì)變得停滯。響應(yīng)于這種檢測(cè),而不是發(fā)出待由與參考隊(duì)列相關(guān)聯(lián)的實(shí)體來(lái)處理的中斷,網(wǎng)絡(luò)接口驅(qū)動(dòng)器向另一隊(duì)列(優(yōu)選地,控制通道的隊(duì)列)發(fā)出事件(可選地,帶有相關(guān)聯(lián)的中斷)。該“參考”事件表示停滯隊(duì)列的性質(zhì)(即,對(duì)停滯隊(duì)列的表示)和標(biāo)識(shí)。優(yōu)選地,將與控制通道相關(guān)聯(lián)的實(shí)體(優(yōu)選地,其為諸如所述多個(gè)驅(qū)動(dòng)器中的一個(gè)的控制實(shí)體)布置成通過(guò)訪(fǎng)問(wèn)并釋放所表示的隊(duì)列對(duì)這種消息進(jìn)行響應(yīng)??梢燥@見(jiàn)對(duì)中間隊(duì)列技術(shù)的許多其他使用。取決于所表示的隊(duì)列變得停滯的原因,可能存在如下情況當(dāng)前已釋放事件隊(duì)列的處理器接著可以取出并處理隊(duì)列上的一個(gè)或更多個(gè)事件。
避免中斷假警報(bào)某些I/O總線(xiàn)(如PCI2.0和PCI-X)支持電平觸發(fā)中斷,在電平觸發(fā)中斷中,外設(shè)通過(guò)使信號(hào)線(xiàn)進(jìn)入活動(dòng)狀態(tài)來(lái)產(chǎn)生中斷。在使用電平觸發(fā)中斷的系統(tǒng)中,存在可以產(chǎn)生“假警報(bào)”中斷的邊界條件??紤]如下情況外設(shè)通過(guò)使中斷信號(hào)線(xiàn)進(jìn)入其活動(dòng)電平來(lái)產(chǎn)生其中斷,并且只在接收到來(lái)自主機(jī)的中斷確認(rèn)時(shí)才使它返回不活動(dòng)電平。如果在將該中斷確認(rèn)寫(xiě)入外設(shè)之后,在外設(shè)能夠使中斷信號(hào)線(xiàn)失活之前主機(jī)中斷服務(wù)例程退出了,則主機(jī)可以將持續(xù)活動(dòng)的信號(hào)線(xiàn)解釋為新中斷并再次激活事件隊(duì)列處理器。如果此時(shí)事件隊(duì)列仍然是空的,則該新的“假警報(bào)”會(huì)引起不必要的主機(jī)的環(huán)境切換。
因此,在使用電平觸發(fā)中斷的實(shí)施例中,可以如下地使這種假警報(bào)的可能性最小化。響應(yīng)于中斷,主機(jī)子系統(tǒng)讀取NIC上的寄存器,以確定多個(gè)源中的哪個(gè)源發(fā)起了該中斷。響應(yīng)于主機(jī)子系統(tǒng)對(duì)中斷源寄存器的讀取,NIC使中斷線(xiàn)失活。NIC可以產(chǎn)生其他中斷,然后如果在讀取了中斷源寄存器之后產(chǎn)生了更多事件,但是不會(huì)丟失中斷。在主機(jī)子系統(tǒng)寫(xiě)回它的事件隊(duì)列讀指針時(shí),中斷線(xiàn)也不會(huì)活動(dòng),因此也不會(huì)產(chǎn)生假警報(bào)中斷。
在上述多重隊(duì)列實(shí)施例中,在不需要到NIC的通信以解斷言喚醒事件的意義上來(lái)說(shuō),喚醒事件更類(lèi)似于邊沿觸發(fā)中斷,而不是電平觸發(fā)中斷。NIC在主機(jī)事件處理器已使它自己失活之后保持喚醒事件活動(dòng),這是沒(méi)有風(fēng)險(xiǎn)的,因?yàn)橹鳈C(jī)可以撤銷(xiāo)該喚醒事件并按協(xié)調(diào)的方式使它自己失活。因此,根據(jù)它的性質(zhì),假設(shè)正確地設(shè)計(jì)了事件處理器,則在喚醒事件的環(huán)境下不必產(chǎn)生假警報(bào)問(wèn)題。然而,對(duì)于CHAR驅(qū)動(dòng)器中斷,仍然會(huì)產(chǎn)生該問(wèn)題。在這種情況下,一個(gè)實(shí)施例使用以上針對(duì)CHAR驅(qū)動(dòng)器事件隊(duì)列描述的假警報(bào)防止機(jī)制,和以上針對(duì)用戶(hù)事件隊(duì)列描述的競(jìng)爭(zhēng)狀況檢測(cè)和糾正機(jī)制。在使用消息信令中斷(MSI)的實(shí)施例中,如在PCI-Express I/O總線(xiàn)上,所有隊(duì)列只使用上述競(jìng)爭(zhēng)狀況機(jī)制。
如這里使用的,對(duì)信息項(xiàng)的“標(biāo)識(shí)”不一定要求直接指定該信息項(xiàng)。通過(guò)一個(gè)更多個(gè)間接層簡(jiǎn)單地引用實(shí)際信息,或者通過(guò)標(biāo)識(shí)一個(gè)或更多個(gè)不同的信息項(xiàng)(這些信息項(xiàng)一起例如通過(guò)公知的算法足以確定實(shí)際信息項(xiàng)),可以在一字段中“標(biāo)識(shí)”信息。此外,這里使用術(shù)語(yǔ)“表示”來(lái)意指與“標(biāo)識(shí)”相同的意思。
此外,如這里使用的,指向存儲(chǔ)器中的特定位置的“指針”是“標(biāo)識(shí)”存儲(chǔ)器中的特定位置的信息。在一個(gè)實(shí)施例中,該指針包括第一值,其標(biāo)識(shí)緩沖區(qū)描述符表中的條目,而該條目標(biāo)識(shí)主機(jī)存儲(chǔ)器中的緩沖區(qū)的基地址;和第二值,其標(biāo)識(shí)到該緩沖區(qū)的偏移量;以及其他參數(shù),需要這些參數(shù)來(lái)唯一地標(biāo)識(shí)存儲(chǔ)器中的特定位置。注意,由于如上所述地定義了“標(biāo)識(shí)”,因此標(biāo)識(shí)了隊(duì)列中的待讀取或?qū)懭氲摹跋乱弧蔽恢玫娜魏巫x或?qū)懼羔樢矘?biāo)識(shí)了最后一次讀或最后一次寫(xiě)位置,反之亦然。
此外,如這里使用的,如果前任信號(hào)、事件或值影響了給定信號(hào)、事件或值,則給定信號(hào)、事件或值對(duì)該前任信號(hào)(predecessor signal)、事件或值“有響應(yīng)”。如果存在插入處理單元、步驟或時(shí)段,則給定的信號(hào)、事件或值仍然可以對(duì)前任信號(hào)、事件或值“有響應(yīng)”。如果插入處理單元或步驟組合了一個(gè)以上的信號(hào)、事件或值,則將處理單元或步驟的信號(hào)輸出視為對(duì)信號(hào)、事件或值輸入中的每一個(gè)都“有響應(yīng)”。如果給定信號(hào)、事件或值與前任信號(hào)、事件或值相同,則該情況僅僅是其中將給定信號(hào)、事件或值仍然視為對(duì)前任信號(hào)、事件或值“有響應(yīng)”的退化情況。類(lèi)似地定義給定信號(hào)、事件或值對(duì)另一信號(hào)、事件或值的“依賴(lài)性”。
出于示例和說(shuō)明的目的給出了對(duì)本發(fā)明優(yōu)選實(shí)施例的上述說(shuō)明。并不旨在窮舉或者將本發(fā)明限制為公開(kāi)的精確形式。顯然,本領(lǐng)域的技術(shù)人員可以顯見(jiàn)許多變型和修改。具體來(lái)說(shuō),并不是限制,通過(guò)引用將在本專(zhuān)利申請(qǐng)的背景部分中通過(guò)引用描述、建議或并入的任何和所有變型并入本文對(duì)本發(fā)明的多個(gè)實(shí)施例的描述中。對(duì)本文描述的實(shí)施例的選取和描述的目的是為了很好地闡述本發(fā)明的原理及其實(shí)際應(yīng)用,從而使得本領(lǐng)域的技術(shù)人員能夠針對(duì)各種實(shí)施例并以適于所預(yù)期的具體應(yīng)用的各種修改來(lái)理解本發(fā)明。本發(fā)明的范圍由所附權(quán)利要求及其等同物來(lái)限定。
權(quán)利要求
1.一種對(duì)在主機(jī)子系統(tǒng)與通過(guò)外圍總線(xiàn)與所述主機(jī)子系統(tǒng)相通信的外設(shè)之間的交互進(jìn)行管理的方法,該方法包括以下步驟所述外設(shè)將一喚醒事件寫(xiě)入所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的中間事件隊(duì)列中,所述喚醒事件標(biāo)識(shí)了所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的第一事件隊(duì)列;響應(yīng)于對(duì)來(lái)自所述中間事件隊(duì)列的所述喚醒事件的取出,所述主機(jī)子系統(tǒng)激活第一事件處理器;以及第一事件處理器至少耗用來(lái)自第一事件隊(duì)列的第一類(lèi)型的第一事件。
2.根據(jù)權(quán)利要求1所述的方法,該方法還包括所述外設(shè)將第一事件寫(xiě)入第一事件隊(duì)列的步驟,其中,連同所述外設(shè)將第一事件寫(xiě)入第一事件隊(duì)列的步驟執(zhí)行所述外設(shè)將一喚醒事件寫(xiě)入中間事件隊(duì)列的步驟。
3.根據(jù)權(quán)利要求2所述的方法,該方法還包括以下步驟連同所述外設(shè)將第一事件寫(xiě)入第一事件隊(duì)列,所述外設(shè)進(jìn)入喚醒斷言禁用狀態(tài),在該喚醒斷言禁用狀態(tài)中,連同向第一事件隊(duì)列寫(xiě)入其他事件,所述外設(shè)不將任何喚醒事件寫(xiě)入所述中間隊(duì)列中;以及所述外設(shè)向第一事件隊(duì)列寫(xiě)入第二事件,同時(shí)所述外設(shè)處于所述喚醒斷言禁用狀態(tài)。
4.根據(jù)權(quán)利要求2所述的方法,其中,所述第一事件處理器至少耗用來(lái)自第一事件隊(duì)列的第一類(lèi)型的第一事件的步驟包括以下步驟所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件,直到所述主機(jī)子系統(tǒng)確定第一事件隊(duì)列是空的;響應(yīng)于確定第一事件隊(duì)列是空的,所述主機(jī)子系統(tǒng)向所述外設(shè)標(biāo)識(shí)已更新主機(jī)中心第一事件隊(duì)列讀指針;以及響應(yīng)于對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針與所述設(shè)備中心第一事件隊(duì)列寫(xiě)指針不相同的確定,所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入標(biāo)識(shí)第一事件隊(duì)列的第二喚醒事件。
5.根據(jù)權(quán)利要求4所述的方法,該方法還包括以下步驟響應(yīng)于對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針與所述設(shè)備中心第一事件隊(duì)列寫(xiě)指針相匹配的確定,所述外設(shè)進(jìn)入喚醒斷言使能狀態(tài),在該喚醒斷言使能狀態(tài)中,連同向第一事件隊(duì)列寫(xiě)入下一事件,所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入喚醒事件。
6.根據(jù)權(quán)利要求1所述的方法,該方法還包括以下步驟連同所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入所述喚醒事件,所述外設(shè)發(fā)起對(duì)所述主機(jī)子系統(tǒng)的第一中斷;連同所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入所述喚醒事件,所述外設(shè)進(jìn)入中斷禁用狀態(tài),在該中斷禁用狀態(tài)中,連同向所述中間事件隊(duì)列寫(xiě)入其他喚醒事件,所述外設(shè)不發(fā)起對(duì)所述主機(jī)子系統(tǒng)的任何中斷;以及所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入第二喚醒事件,同時(shí)所述外設(shè)處于所述中斷禁用狀態(tài)。
7.根據(jù)權(quán)利要求1所述的方法,該方法還包括以下步驟連同所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入所述喚醒事件,所述外設(shè)發(fā)起對(duì)所述主機(jī)子系統(tǒng)的第一中斷;連同所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入所述喚醒事件,所述外設(shè)進(jìn)入中斷禁用狀態(tài),在該中斷禁用狀態(tài)中,連同向所述中間事件隊(duì)列寫(xiě)入其他喚醒事件,所述外設(shè)不發(fā)起對(duì)所述主機(jī)子系統(tǒng)的任何中斷;以及響應(yīng)于所述第一中斷,所述主機(jī)子系統(tǒng)耗用來(lái)自所述中間事件隊(duì)列的事件,直到所述主機(jī)子系統(tǒng)確定所述中間事件隊(duì)列是空的;響應(yīng)于所述主機(jī)子系統(tǒng)的所述中間事件隊(duì)列為空的確定,所述主機(jī)子系統(tǒng)向所述外設(shè)標(biāo)識(shí)已更新主機(jī)中心中間事件隊(duì)列讀指針;以及響應(yīng)于對(duì)所述已更新主機(jī)中心中間事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)所述已更新主機(jī)中心中間事件隊(duì)列讀指針與設(shè)備中心事件中間隊(duì)列寫(xiě)指針不相同的確定,所述外設(shè)發(fā)起對(duì)所述主機(jī)子系統(tǒng)的附加中斷。
8.根據(jù)權(quán)利要求1所述的方法,其中,所述外設(shè)包括網(wǎng)絡(luò)接口設(shè)備,所述方法還包括在所述網(wǎng)絡(luò)接口設(shè)備與所述主機(jī)子系統(tǒng)的存儲(chǔ)器中的多個(gè)第一數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù)的步驟,并且其中第一類(lèi)型的事件表示完成了與所述多個(gè)第一數(shù)據(jù)緩沖區(qū)中的至少一個(gè)的數(shù)據(jù)傳送。
9.根據(jù)權(quán)利要求8所述的方法,該方法還包括以下步驟所述外設(shè)向第一隊(duì)列寫(xiě)入第一事件;在所述網(wǎng)絡(luò)接口設(shè)備與所述主機(jī)子系統(tǒng)的所述存儲(chǔ)器中的多個(gè)第二數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù);連同在所述網(wǎng)絡(luò)接口設(shè)備與第二數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù),所述外設(shè)向第一事件隊(duì)列寫(xiě)入第二類(lèi)型的第二事件,第二類(lèi)型的事件表示完成了與所述多個(gè)第二數(shù)據(jù)緩沖區(qū)中的至少一個(gè)的數(shù)據(jù)傳送;以及連同向第一事件隊(duì)列寫(xiě)入第二事件,所述外設(shè)更新第一事件隊(duì)列的所述設(shè)備中心事件隊(duì)列寫(xiě)指針。
10.根據(jù)權(quán)利要求9所述的方法,該方法還包括以下步驟連同向第一事件隊(duì)列寫(xiě)入第二事件,所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入第二喚醒事件,第二喚醒事件標(biāo)識(shí)了第一事件隊(duì)列。
11.根據(jù)權(quán)利要求9所述的方法,其中,在所述外設(shè)向第一事件隊(duì)列寫(xiě)入第一事件的步驟之后執(zhí)行所述外設(shè)向第一事件隊(duì)列寫(xiě)入第二類(lèi)型的第二事件的步驟,并且其中,所述第一事件處理器至少耗用來(lái)自第一事件隊(duì)列的第一事件的步驟包括第一事件處理器耗用第一事件和第二事件的步驟。
12.根據(jù)權(quán)利要求9所述的方法,其中,在所述網(wǎng)絡(luò)接口設(shè)備與第一數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù)的步驟包括將發(fā)送數(shù)據(jù)從第一數(shù)據(jù)緩沖區(qū)傳送到所述網(wǎng)絡(luò)接口設(shè)備以發(fā)送到網(wǎng)絡(luò)上的步驟,并且其中所述在所述網(wǎng)絡(luò)接口設(shè)備與第二數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù)的步驟包括將由所述網(wǎng)絡(luò)接口設(shè)備從所述網(wǎng)絡(luò)接收到的數(shù)據(jù)傳送到第二數(shù)據(jù)緩沖區(qū)的步驟。
13.根據(jù)權(quán)利要求1所述的方法,該方法還包括以下步驟所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入第二喚醒事件,第二喚醒事件標(biāo)識(shí)了所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的第二事件隊(duì)列;響應(yīng)于對(duì)來(lái)自所述中間事件隊(duì)列的第二喚醒事件的取出,所述主機(jī)子系統(tǒng)激活第二事件處理器;以及第二事件處理器至少耗用來(lái)自第二事件隊(duì)列的第二類(lèi)型的第二事件。
14.一種對(duì)在主機(jī)子系統(tǒng)與通過(guò)外圍總線(xiàn)與所述主機(jī)子系統(tǒng)相通信的外設(shè)之間的交互進(jìn)行管理的方法,該方法包括以下步驟所述外設(shè)將第一參考事件寫(xiě)入所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的中間事件隊(duì)列中,該第一參考事件標(biāo)識(shí)了所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的第一事件隊(duì)列;所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入第二參考事件,該第二參考事件標(biāo)識(shí)了所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的第二事件隊(duì)列;響應(yīng)于對(duì)來(lái)自所述中間事件隊(duì)列的第一參考事件的取出,所述主機(jī)子系統(tǒng)至少耗用來(lái)自第一事件隊(duì)列的第一類(lèi)型的第一事件;以及響應(yīng)于對(duì)來(lái)自所述中間事件隊(duì)列的第二參考事件的取出,所述主機(jī)子系統(tǒng)至少耗用來(lái)自第二事件隊(duì)列的第二類(lèi)型的第二事件。
15.根據(jù)權(quán)利要求14所述的方法,該方法還包括以下步驟所述外設(shè)向第一事件隊(duì)列寫(xiě)入第一事件,并且所述外設(shè)向第二事件隊(duì)列寫(xiě)入第二事件。
16.根據(jù)權(quán)利要求15所述的方法,還包括以下步驟連同向第一事件隊(duì)列寫(xiě)入第一事件,所述外設(shè)進(jìn)入第一禁用狀態(tài),在該第一禁用狀態(tài)中,連同向第一事件隊(duì)列寫(xiě)入其他事件,所述外設(shè)不向標(biāo)識(shí)了第一事件隊(duì)列的所述中間隊(duì)列寫(xiě)入任何事件,并且其中所述主機(jī)子系統(tǒng)至少耗用來(lái)自第一事件隊(duì)列的第一類(lèi)型的第一事件的步驟包括以下步驟所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件,直到所述主機(jī)子系統(tǒng)確定第一事件隊(duì)列是空的;響應(yīng)于所述主機(jī)子系統(tǒng)的第一事件隊(duì)列為空的所述確定,所述主機(jī)子系統(tǒng)向所述外設(shè)標(biāo)識(shí)已更新主機(jī)中心第一事件隊(duì)列讀指針;以及響應(yīng)于對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針與所述設(shè)備中心第一事件隊(duì)列寫(xiě)指針不相同的確定,所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入標(biāo)識(shí)第一事件隊(duì)列的附加參考事件。
17.根據(jù)權(quán)利要求16所述的方法,該方法還包括以下步驟連同向第二事件隊(duì)列寫(xiě)入第二事件,所述外設(shè)進(jìn)入第二禁用狀態(tài),在該第二禁用狀態(tài)中,連同向第二事件隊(duì)列寫(xiě)入其他事件,所述外設(shè)不向標(biāo)識(shí)了第二事件隊(duì)列的所述中間隊(duì)列寫(xiě)入任何事件,并且其中所述主機(jī)子系統(tǒng)至少耗用來(lái)自第二事件隊(duì)列的第二類(lèi)型的第二事件的步驟包括以下步驟所述主機(jī)子系統(tǒng)耗用來(lái)自第二事件隊(duì)列的事件,直到所述主機(jī)子系統(tǒng)確定第二事件隊(duì)列是空的;響應(yīng)于第二事件隊(duì)列為空的所述確定,所述主機(jī)子系統(tǒng)向所述外設(shè)標(biāo)識(shí)已更新主機(jī)中心第二事件隊(duì)列讀指針;以及響應(yīng)于對(duì)所述已更新主機(jī)中心第二事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)所述已更新主機(jī)中心第二事件隊(duì)列讀指針與所述設(shè)備中心第二事件隊(duì)列寫(xiě)指針不相同的確定,所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入標(biāo)識(shí)第二事件隊(duì)列的附加參考事件。
18.根據(jù)權(quán)利要求17所述的方法,該方法還包括以下步驟響應(yīng)于對(duì)所述已更新主機(jī)中心第二事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)所述已更新主機(jī)中心第二事件隊(duì)列讀指針與所述設(shè)備中心第二事件隊(duì)列寫(xiě)指針相匹配的確定,所述外設(shè)進(jìn)入第二禁用狀態(tài),在該第二禁用狀態(tài)中,連同向第二隊(duì)列寫(xiě)入下一事件,所述外設(shè)向標(biāo)識(shí)第二隊(duì)列的所述中間事件隊(duì)列寫(xiě)入?yún)⒖际录?br>
19.根據(jù)權(quán)利要求15所述的方法,該方法還包括以下步驟響應(yīng)于對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)所述已更新主機(jī)中心第一事件隊(duì)列讀指針與所述設(shè)備中心第一事件隊(duì)列寫(xiě)指針相匹配的確定,所述外設(shè)進(jìn)入第一使能狀態(tài),在該第一禁用狀態(tài)中,連同向第一隊(duì)列寫(xiě)入下一事件,所述外設(shè)向標(biāo)識(shí)第一隊(duì)列的所述中間事件隊(duì)列寫(xiě)入?yún)⒖际录?br>
20.根據(jù)權(quán)利要求14所述的方法,該方法還包括以下步驟連同向所述中間事件隊(duì)列寫(xiě)入第一參考事件,所述外設(shè)發(fā)起對(duì)所述主機(jī)子系統(tǒng)的第一中斷;連同向所述中間事件隊(duì)列寫(xiě)入第一參考事件,所述外設(shè)進(jìn)入中斷禁用狀態(tài),在該中斷禁用狀態(tài)中,連同向所述中間事件隊(duì)列寫(xiě)入其他喚醒事件,所述外設(shè)不發(fā)起對(duì)所述主機(jī)子系統(tǒng)的任何中斷;以及響應(yīng)于第一中斷,所述主機(jī)子系統(tǒng)取出第一和第二參考事件。
21.根據(jù)權(quán)利要求20所述的方法,該方法還包括以下步驟響應(yīng)于第一中斷,所述主機(jī)子系統(tǒng)耗用來(lái)自所述中間事件隊(duì)列的事件,直到所述主機(jī)子系統(tǒng)確定所述中間事件隊(duì)列是空的;響應(yīng)于所述中間事件隊(duì)列為空的所述確定,所述主機(jī)子系統(tǒng)向所述外設(shè)標(biāo)識(shí)已更新主機(jī)中心中間事件隊(duì)列讀指針;以及響應(yīng)于對(duì)所述已更新主機(jī)中心中間事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)所述已更新主機(jī)中心中間事件隊(duì)列讀指針與設(shè)備中心事件中間隊(duì)列寫(xiě)指針不相同的確定,所述外設(shè)發(fā)起對(duì)所述主機(jī)子系統(tǒng)的附加中斷。
22.一種對(duì)多個(gè)事件隊(duì)列進(jìn)行管理的方法,所述方法利用與主機(jī)子系統(tǒng)和通過(guò)外圍總線(xiàn)與所述主機(jī)子系統(tǒng)相通信的外設(shè),該方法包括以下步驟所述外設(shè)將第一類(lèi)型的第一事件寫(xiě)入所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的第一事件隊(duì)列中;連同向第一事件隊(duì)列寫(xiě)入第一事件,所述外設(shè)更新第一事件隊(duì)列的設(shè)備中心事件隊(duì)列寫(xiě)指針;連同向第一事件隊(duì)列寫(xiě)入第一事件,所述外設(shè)向與第一事件隊(duì)列不同的中間事件隊(duì)列寫(xiě)入第一喚醒事件;響應(yīng)于對(duì)第一喚醒事件的讀取,所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件,直到所述主機(jī)子系統(tǒng)確定第一事件隊(duì)列是空的;響應(yīng)于第一事件隊(duì)列為空的確定,所述主機(jī)子系統(tǒng)向所述外設(shè)標(biāo)識(shí)第一事件隊(duì)列的已更新主機(jī)中心事件隊(duì)列讀指針;以及響應(yīng)于對(duì)第一事件隊(duì)列的所述已更新主機(jī)中心事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)第一事件隊(duì)列的所述已更新主機(jī)中心事件隊(duì)列讀指針與第一事件隊(duì)列的所述設(shè)備中心事件隊(duì)列寫(xiě)指針不相同的確定,所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入附加喚醒事件,所述附加喚醒事件標(biāo)識(shí)第一事件隊(duì)列。
23.根據(jù)權(quán)利要求22所述的方法,該方法還包括以下步驟所述外設(shè)向所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的第二事件隊(duì)列寫(xiě)入第二類(lèi)型的第二事件,其中,第一喚醒事件標(biāo)識(shí)第一事件隊(duì)列,第二喚醒事件標(biāo)識(shí)第二事件隊(duì)列。
24.根據(jù)權(quán)利要求23所述的方法,該方法還包括以下步驟響應(yīng)于對(duì)第二喚醒事件的讀取,所述主機(jī)子系統(tǒng)耗用來(lái)自第二事件隊(duì)列的事件,直到所述主機(jī)子系統(tǒng)確定第二事件隊(duì)列是空的。
25.根據(jù)權(quán)利要求24所述的方法,該方法還包括以下步驟響應(yīng)于第二事件隊(duì)列為空的所述確定,所述主機(jī)子系統(tǒng)向所述外設(shè)標(biāo)識(shí)第二事件隊(duì)列的已更新主機(jī)中心事件隊(duì)列讀指針;響應(yīng)于對(duì)第二事件隊(duì)列的所述已更新主機(jī)中心事件隊(duì)列讀指針的接收,還響應(yīng)于所述外設(shè)進(jìn)行的對(duì)第二事件隊(duì)列的所述已更新主機(jī)中心事件隊(duì)列讀指針與第二事件隊(duì)列的所述設(shè)備中心事件隊(duì)列寫(xiě)指針不相同的確定,所述外設(shè)向所述中間事件隊(duì)列寫(xiě)入其他喚醒事件,所述其他喚醒事件標(biāo)識(shí)第二事件隊(duì)列。
26.根據(jù)權(quán)利要求23所述的方法,其中在所述外設(shè)向第一事件隊(duì)列寫(xiě)入第一類(lèi)型的第一事件的步驟之后,并且在所述主機(jī)子系統(tǒng)在所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件的步驟中確定第一事件隊(duì)列是空的之前,執(zhí)行所述外設(shè)向第二事件隊(duì)列寫(xiě)入第二類(lèi)型的第二事件的步驟。
27.根據(jù)權(quán)利要求23所述的方法,其中在所述主機(jī)子系統(tǒng)在所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件的步驟中確定第一事件隊(duì)列是空的之后,執(zhí)行所述外設(shè)向第二事件隊(duì)列寫(xiě)入第二類(lèi)型的第二事件的步驟。
28.根據(jù)權(quán)利要求22所述的方法,該方法還包括以下步驟連同向所述中間事件隊(duì)列寫(xiě)入第一喚醒事件,所述外設(shè)發(fā)起對(duì)所述主機(jī)子系統(tǒng)的第一中斷;和響應(yīng)于第一中斷,所述主機(jī)子系統(tǒng)在所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件的步驟中讀取第一喚醒事件。
29.根據(jù)權(quán)利要求22所述的方法,其中所述外設(shè)包括網(wǎng)絡(luò)接口設(shè)備,所述方法還包括在所述網(wǎng)絡(luò)接口設(shè)備與所述主機(jī)子系統(tǒng)的存儲(chǔ)器中的多個(gè)第一數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù)的步驟,并且其中第一類(lèi)型的事件表示完成了與所述多個(gè)第一數(shù)據(jù)緩沖區(qū)中的至少一個(gè)的數(shù)據(jù)傳送。
30.根據(jù)權(quán)利要求29所述的方法,該方法還包括以下步驟在所述網(wǎng)絡(luò)接口設(shè)備與所述主機(jī)子系統(tǒng)的所述存儲(chǔ)器中的多個(gè)第二數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù);連同在所述網(wǎng)絡(luò)接口設(shè)備與第二數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù),所述外設(shè)向第一事件隊(duì)列寫(xiě)入第二類(lèi)型的第二事件,第二類(lèi)型的事件表示完成了與所述多個(gè)第二數(shù)據(jù)緩沖區(qū)中的至少一個(gè)的數(shù)據(jù)傳送;以及連同向第一事件隊(duì)列寫(xiě)入第二事件,所述外設(shè)更新第一事件隊(duì)列的所述設(shè)備中心事件隊(duì)列寫(xiě)指針。
31.根據(jù)權(quán)利要求30所述的方法,該方法還包括以下步驟連同向第一事件隊(duì)列寫(xiě)入第二事件,所述外設(shè)發(fā)起對(duì)所述主機(jī)子系統(tǒng)的第二中斷。
32.根據(jù)權(quán)利要求30所述的方法,其中,在所述外設(shè)向第一事件隊(duì)列寫(xiě)入第一事件的步驟之后,并且在所述主機(jī)子系統(tǒng)在所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件的步驟中確定第一事件隊(duì)列是空的之前,執(zhí)行所述外設(shè)向第一事件隊(duì)列寫(xiě)入第二類(lèi)型的第二事件的步驟,并且其中所述主機(jī)子系統(tǒng)耗用來(lái)自第一事件隊(duì)列的事件的步驟包括以下步驟在所述主機(jī)子系統(tǒng)確定第一事件隊(duì)列是空的之前,所述主機(jī)子系統(tǒng)耗用第一事件和第二事件。
33.根據(jù)權(quán)利要求30所述的方法,其中,所述在所述網(wǎng)絡(luò)接口設(shè)備與第一數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù)的步驟包括將發(fā)送數(shù)據(jù)從第一數(shù)據(jù)緩沖區(qū)傳送到所述網(wǎng)絡(luò)接口設(shè)備以發(fā)送到網(wǎng)絡(luò)上的步驟,并且其中所述在所述網(wǎng)絡(luò)接口設(shè)備與第二數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù)的步驟包括將由所述網(wǎng)絡(luò)接口設(shè)備從所述網(wǎng)絡(luò)接收到的數(shù)據(jù)傳送到第二數(shù)據(jù)緩沖區(qū)中的步驟。
34.一種對(duì)在主機(jī)子系統(tǒng)與通過(guò)外圍總線(xiàn)與所述主機(jī)子系統(tǒng)相通信的網(wǎng)絡(luò)接口設(shè)備之間的交互進(jìn)行管理的方法,該方法包括以下步驟在所述網(wǎng)絡(luò)接口設(shè)備與所述主機(jī)子系統(tǒng)中的存儲(chǔ)器中的第一數(shù)據(jù)緩沖區(qū)之間傳送數(shù)據(jù);所述網(wǎng)絡(luò)接口設(shè)備將一數(shù)據(jù)傳送完成事件寫(xiě)入所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的第一事件隊(duì)列中,所述數(shù)據(jù)傳送完成事件向所述主機(jī)子系統(tǒng)表示完成了在所述傳送數(shù)據(jù)的步驟中的數(shù)據(jù)傳送;以及連同所述向第一事件隊(duì)列寫(xiě)入數(shù)據(jù)傳送完成事件的步驟,所述網(wǎng)絡(luò)接口設(shè)備將一喚醒事件寫(xiě)入所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的中間事件隊(duì)列,所述喚醒事件標(biāo)識(shí)第一事件隊(duì)列。
35.具有主機(jī)子系統(tǒng)的計(jì)算設(shè)備,用于與經(jīng)由外圍總線(xiàn)與所述主機(jī)子系統(tǒng)相通信的外設(shè)配合使用,所述主機(jī)子系統(tǒng)包括第一用戶(hù)事件隊(duì)列,其包含有由所述外設(shè)來(lái)排入隊(duì)列的多個(gè)事件;和中間隊(duì)列,其包含有通知所述主機(jī)子系統(tǒng)第一用戶(hù)隊(duì)列中的事件可用性的事件。
36.根據(jù)權(quán)利要求35所述的設(shè)備,其中,所述主機(jī)子系統(tǒng)還包括包含有由所述外設(shè)來(lái)排入隊(duì)列的多個(gè)事件的第二用戶(hù)事件隊(duì)列,其中,所述中間隊(duì)列還包含有通知所述主機(jī)子系統(tǒng)第二用戶(hù)隊(duì)列中的事件的可用性的事件。
37.根據(jù)權(quán)利要求35所述的設(shè)備,其中,所述主機(jī)子系統(tǒng)還包括第一組數(shù)據(jù)緩沖區(qū)和第一DMA描述符隊(duì)列,該第一DMA描述符隊(duì)列包含有標(biāo)識(shí)第一組數(shù)據(jù)緩沖區(qū)中的多個(gè)緩沖區(qū)中的相應(yīng)緩沖區(qū)的描述符,并且其中被排入在第一用戶(hù)事件隊(duì)列中的所述多個(gè)事件中的一個(gè)通知所述主機(jī)子系統(tǒng)在所述外設(shè)與第一組數(shù)據(jù)緩沖區(qū)中的所述多個(gè)緩沖區(qū)中的至少一個(gè)之間的數(shù)據(jù)傳送完成了。
38.根據(jù)權(quán)利要求35所述的設(shè)備,其中,所述主機(jī)子系統(tǒng)還包括包含有由所述外設(shè)來(lái)排入隊(duì)列的多個(gè)事件的第二用戶(hù)事件隊(duì)列,其中,所述中間隊(duì)列還包含有通知所述主機(jī)子系統(tǒng)第二用戶(hù)隊(duì)列中的事件的可用性的事件,其中,所述主機(jī)子系統(tǒng)還包括第一、第二以及第三組數(shù)據(jù)緩沖區(qū)和第一、第二以及第三DMA描述符隊(duì)列,該第一、第二以及第三DMA描述符隊(duì)列中的每一個(gè)都分別包含有標(biāo)識(shí)第一、第二以及第三組數(shù)據(jù)緩沖區(qū)中的多個(gè)緩沖區(qū)中的相應(yīng)緩沖區(qū)的描述符,其中被排入在第一用戶(hù)事件隊(duì)列中的所述多個(gè)事件中的一個(gè)通知所述主機(jī)子系統(tǒng)在所述外設(shè)與第一組數(shù)據(jù)緩沖區(qū)中的所述多個(gè)緩沖區(qū)中的至少一個(gè)之間的數(shù)據(jù)傳送完成了,其中被排入在第二用戶(hù)事件隊(duì)列中的所述多個(gè)事件中的一個(gè)通知所述主機(jī)子系統(tǒng)在所述外設(shè)與第二組數(shù)據(jù)緩沖區(qū)中的所述多個(gè)緩沖區(qū)中的至少一個(gè)之間的數(shù)據(jù)傳送完成了,并且其中被排入在第一用戶(hù)事件隊(duì)列中的所述多個(gè)事件中的附加事件通知所述主機(jī)子系統(tǒng)在所述外設(shè)與第三組數(shù)據(jù)緩沖區(qū)中的所述多個(gè)緩沖區(qū)中的至少一個(gè)之間的數(shù)據(jù)傳送完成了。
39.一種對(duì)在主機(jī)子系統(tǒng)與通過(guò)外圍總線(xiàn)與所述主機(jī)子系統(tǒng)相通信外設(shè)之間的交互進(jìn)行管理的方法,該方法包括以下步驟所述外設(shè)將一參考事件寫(xiě)入所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的中間事件隊(duì)列中,所述參考事件標(biāo)識(shí)了所述主機(jī)子系統(tǒng)可訪(fǎng)問(wèn)的參考事件隊(duì)列;響應(yīng)于對(duì)來(lái)自所述中間事件隊(duì)列的所述參考事件的取出,所述主機(jī)子系統(tǒng)激活第一事件處理器;以及所述第一事件處理器耗用來(lái)自所述參考事件隊(duì)列的事件。
40.根據(jù)權(quán)利要求39所述的方法,其中,所述參考事件是喚醒事件,并且其中響應(yīng)于所述第一事件處理器向所述外設(shè)請(qǐng)求喚醒事件的步驟執(zhí)行所述外設(shè)寫(xiě)入?yún)⒖际录牟襟E。
41.根據(jù)權(quán)利要求39所述的方法,其中,所述參考事件表示所述參考事件隊(duì)列停滯了,并且其中,響應(yīng)于所述外設(shè)檢測(cè)到一事件在所述參考事件隊(duì)列上已保留特定時(shí)段以上,執(zhí)行所述外設(shè)寫(xiě)入?yún)⒖际录牟襟E。
42.一種對(duì)在主機(jī)子系統(tǒng)與通過(guò)外圍總線(xiàn)與所述主機(jī)子系統(tǒng)相通信的外設(shè)之間的交互進(jìn)行管理的方法,該方法包括以下步驟所述主機(jī)子系統(tǒng)從所述外設(shè)請(qǐng)求第一事件隊(duì)列的喚醒事件,并且連同所述請(qǐng)求阻斷一應(yīng)用,所述應(yīng)用包括用于第一事件隊(duì)列的事件處理器;所述主機(jī)子系統(tǒng)將第一喚醒事件接收到中間事件隊(duì)列中,該第一喚醒事件標(biāo)識(shí)第一事件隊(duì)列;響應(yīng)于對(duì)來(lái)自所述中間事件隊(duì)列的第一喚醒事件的取出,所述主機(jī)子系統(tǒng)激活所述應(yīng)用;以及響應(yīng)于所述應(yīng)用的被激活,所述應(yīng)用的第一事件處理器耗用來(lái)自第一事件隊(duì)列的至少第一事件。
全文摘要
本發(fā)明提供了用于多事件隊(duì)列的中斷管理。一種用于對(duì)在主機(jī)子系統(tǒng)與外設(shè)之間的交互進(jìn)行管理的方法。粗略地講,外設(shè)向單個(gè)事件隊(duì)列寫(xiě)入事件,結(jié)合該寫(xiě)入,還向中間事件隊(duì)列寫(xiě)入喚醒事件。該喚醒事件標(biāo)識(shí)了該單個(gè)事件隊(duì)列。響應(yīng)于對(duì)來(lái)自中間事件隊(duì)列的喚醒事件的取出,主機(jī)子系統(tǒng)激活單個(gè)事件處理器,以耗用來(lái)自單個(gè)事件隊(duì)列的事件。
文檔編號(hào)G06F13/38GK101014937SQ200580010775
公開(kāi)日2007年8月8日 申請(qǐng)日期2005年2月3日 優(yōu)先權(quán)日2004年3月2日
發(fā)明者史蒂夫·波普, 大衛(wèi)·里多克, 于青, 德里克·羅伯茨 申請(qǐng)人:五級(jí)網(wǎng)絡(luò)公司