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