專利名稱:完成事件中包括描述符隊(duì)列空事件的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)接口,尤其是最佳化性能的基于隊(duì)列的網(wǎng)絡(luò)傳送和接收機(jī)制。
2. 相雜術(shù)的描述
當(dāng)艦繊鵬,例如,網(wǎng)絡(luò),在兩個(gè)設(shè)備之間^tr麵時(shí),齡設(shè)備都必須具有適合的網(wǎng)鄉(xiāng)維
口,以允許其aaait^si信。通常這些網(wǎng)絡(luò)是基于以太網(wǎng)技術(shù)的。為^艘艦網(wǎng)絡(luò)通信的設(shè)備配備 網(wǎng)鄉(xiāng)維口,該網(wǎng)鄉(xiāng)維口倉(cāng)辦支持網(wǎng)絡(luò)協(xié)議的物理和邏輯要求。將網(wǎng)鄉(xiāng)維口的物理石更件部分稱為網(wǎng),口 卡(MC),盡管它們不一定采用卡的形式例如,創(chuàng)門可以釆用直接安裝在主禾肚的集成電路(IC) 和連接器的形式,^是與計(jì)穀幾系統(tǒng)的其他部^^起被裝配在單,成電路芯片上的宏單元的形式。 大多數(shù)計(jì)^in^統(tǒng)包括操作系統(tǒng)(os),用戶級(jí)自aa其與網(wǎng)絡(luò)通信。操作系統(tǒng)的i分,巳知
為內(nèi)核,包f甜議棧,這些協(xié)議棚于翻i雜鵬和指定到MC的設(shè)備驅(qū)動(dòng)器間的命令和M,以及 直掛空制MC的設(shè)備驅(qū)動(dòng)器。通過在操作系統(tǒng)的內(nèi)核中提供這些功能,可以從用戶 用中隱藏網(wǎng)絡(luò)
接口卡的缺性和差異。另外,可以由多個(gè)鵬安射也共享網(wǎng)辦更件和其它系統(tǒng)資源(例如存儲(chǔ)器), 并且傲戶系統(tǒng)錢,預(yù)防故p馘者惡意的鵬。
在典型的內(nèi)核棧系統(tǒng)的操作中,硬件網(wǎng)絡(luò)接口卡是在網(wǎng)絡(luò)和內(nèi)核間的接口。在內(nèi)核中,設(shè)備驅(qū)動(dòng)
器層直接與MC通信,而協(xié)i媳與系統(tǒng)的細(xì)級(jí)通信。
MC存儲(chǔ)指向主機(jī)存儲(chǔ)器中用贈(zèng)俞入lii共給內(nèi)核的數(shù)據(jù)和輸出應(yīng)用于網(wǎng)絡(luò)的數(shù)據(jù)的緩沖區(qū)的指針。 它們稱為RX 環(huán)和TX 環(huán)。MC對(duì)f際RX緩沖區(qū)環(huán)上的內(nèi)核要讀取的下一個(gè)數(shù)據(jù)的緩沖區(qū)指 tHi行更新。!^C環(huán)M3i直接存儲(chǔ)蹄取(DMA)來^i共,并且MCX對(duì)際已鋭的輸出繊的 緩沖區(qū)指^ffl行更新。NIC可以利用中斷向內(nèi)核^J1信號(hào)。
趣i內(nèi)核從RX 環(huán)中摘,入數(shù)據(jù),依次對(duì)其處理。通常由內(nèi)核本身處理帶外數(shù)據(jù)。通過指 向鵬專用端口的專用的緩沖區(qū)隊(duì)列的指針來添加要至lM^ffl專用端口的,,該緩沖區(qū)隊(duì)列駐留在內(nèi) 核的私有iiMlt空間中。
在用于 接收的系纖作時(shí),會(huì)發(fā)生以下步驟
1、 在系統(tǒng)初始化期間,操作系統(tǒng)設(shè)備驅(qū)動(dòng)激犍內(nèi)核緩沖區(qū),并對(duì)MC的RX環(huán),始化,以指向 鵬緩沖區(qū)。OS還接賠睞自配翻本的OS的IP主lnj:魁止的通知。
2、 一自希望接收網(wǎng)絡(luò)包并且典型地創(chuàng)建 (a socket),該套^ 被綁定到一端口,該套
齡是駐留在操作系統(tǒng)內(nèi)的隊(duì)列>^ 結(jié)構(gòu)。對(duì)f^合定的網(wǎng)絡(luò)協(xié)議,該端口具被主機(jī)內(nèi)的唯一 的編號(hào),以這樣的一種方式,使得可以^#址到<主機(jī)端口〉的網(wǎng)絡(luò)包^t5征確的端口的隊(duì)列。
3、 ^S到達(dá)網(wǎng)雜口卡(NIC)。該NICffl3ii機(jī)l/0總線(例如PCI總線),將該包復(fù)制到由下 一個(gè)有效RXDMA環(huán)微值指向的存儲(chǔ)器艦。
4、 要么沒^T用的剩余DMA^fh要么iig顧指定超時(shí),MC斷言I/0總線中斷,以通知主機(jī) 已微了娜。
5、 響應(yīng)于中斷,設(shè)備驅(qū)動(dòng)離SM雜的緩沖區(qū),如果該緩沖區(qū)包含有 :^i止信息,例如有效的 主拋魁止,貝IJ裕旨向該緩沖區(qū)的指針傳避爐當(dāng)?shù)膮f(xié)議棧(例如TCP/IP)。在某些系統(tǒng)中,設(shè)備驅(qū) 動(dòng)器f嫩切,裕UW限的時(shí)段,以試圖M^、中斷7M[。
6、 協(xié)議棧確定是否,有效目的地端口,如果#&貝敝行網(wǎng)絡(luò)協(xié)議處理(例如,^X才所接收 到的 的確認(rèn)),荊吏包在端口的隊(duì)列中排隊(duì)。
7、 os 「'似指示應(yīng)用(例如通過再調(diào)度jHsa "選抒"位掩碼中的位) ,td到i^;ft&端口綁定
到的網(wǎng)絡(luò)端點(diǎn)上(通過將閣i/川標(biāo)記為可運(yùn)行的并調(diào)用-調(diào)度粉-i"。
8、 自從OS請(qǐng)求ifJg,例如Miim行一rccvO系統(tǒng)調(diào)用(掛紫愛沖區(qū)的i魁止和大小),同時(shí)在OS
內(nèi)核中,將im從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用的緩沖區(qū)。在/A^統(tǒng)調(diào)用返回時(shí),應(yīng)用可以販用緩沖 區(qū)訪問ili^。
9、 在復(fù)制后(其通常發(fā)生在軟中斷的環(huán)境下),內(nèi)核將內(nèi)核緩沖區(qū)返回給空閑存儲(chǔ)器的OS庫(kù)。而 且,在中斷過程中,設(shè)備驅(qū)動(dòng)器分配一雜惠中區(qū)并向DMA環(huán)頓加一指針。按此方式,具有一個(gè) 從空閑庫(kù)到細(xì)的端口隊(duì)列的緩沖區(qū)的循環(huán),并且周而復(fù)始。
10、 典型地,內(nèi)核緩沖區(qū)位Ttl理RAM中,并^m不會(huì)M0J以存儲(chǔ)器(VM)系統(tǒng)調(diào)頁(yè)出去。 然而,可以將空閑庫(kù)共享為所有應(yīng)用的公共資源。
對(duì)于繊縦,發(fā)生以下步驟
1、 操作系統(tǒng)設(shè)備驅(qū)動(dòng)激'J翻^i行錢的內(nèi)核緩沖區(qū),^^刀始化MC的TX環(huán)。
2、 要^ti^的自,將i^ig存儲(chǔ)^ffl緩沖區(qū)中,并且請(qǐng)^ffi3ios的m,例如mm行
sendO系統(tǒng)調(diào)用(樹共,緩沖區(qū)的i魁止和大小)。
3、 響應(yīng)于該sendO調(diào)用,OS內(nèi)梭將,^ffl緩沖區(qū)復(fù)制到內(nèi)核緩沖區(qū)中,并細(xì)適當(dāng)?shù)膮f(xié)議棧 (例如TCP/IP)。
4、 樹旨向含有^據(jù)的內(nèi)核緩沖區(qū)的指針,置于1X環(huán)的下一個(gè)空閑空隙中。如果、^可用的空 隙,貝依內(nèi)核中將該緩沖區(qū)排隊(duì),直到MC例如艦中斷J際一空隙已變得可用。
5、當(dāng)由NIC要艦該空隙時(shí),MCi!3ii機(jī)I/0總線,利用DMA循環(huán)訪問由該空隙的內(nèi)對(duì)際 的內(nèi)核緩沖區(qū),然后錢M^。
過去已經(jīng)認(rèn)識(shí)到,縦和接 作均會(huì)包^1多的 運(yùn)動(dòng)。已經(jīng)提出一離決方^^,由這 種娜運(yùn)動(dòng)而導(dǎo)致的性倉(cāng)戰(zhàn)化。例如,參見美國(guó)鍋i」No.6246683, fflil引用將其并入于此。在PCT國(guó) 際公報(bào)No.WO2004/025477A2中,M31引用將其并入于此,進(jìn)一^i人i頓J;^t和接TO作均會(huì)包^1 多的環(huán)^t刀換,這也會(huì)引^ 的開銷。在那里描述了用于M^所需環(huán)境切換次數(shù)的技術(shù)。
翻P些描述的機(jī)制中,4頓割牛隊(duì)列來在主縣辦卩MC之間對(duì)控制信iiffiSl信。當(dāng)艦I/O 總劍各網(wǎng)纟娥口設(shè)備連接到主in^統(tǒng)時(shí),例如M3iPCI總線,需要在處理器與MC間對(duì)控制言IJ4行 步賺的通信。典型地,由MC發(fā)出的中斷來啟動(dòng)控帝嗵信,這導(dǎo)致了環(huán)^t刀換。另外,i^l信往往要 求主in^^3iPCI總線從NIC讀^e制言息或向MC寫入控制信息,這樣會(huì)導(dǎo)致總線瓶頸。該問題
在繊包往往很短的網(wǎng)絡(luò)連接的環(huán)境下尤其嚴(yán)重,使得所需控制工作占總網(wǎng)絡(luò)處虹作的百分比很大。
在該P(yáng)CT公報(bào)中描述的實(shí)施例中,"端口"被認(rèn)為激定至U鵬的操作系統(tǒng)指定實(shí)體,具有地址碼,
并且可以接收消息。尋址到一端口的一個(gè)或多^^入消息,形成一消息隊(duì)列,aa^作系棘處理該消
息隊(duì)列。操作系統(tǒng)先前E^存儲(chǔ)一個(gè)在該端口和運(yùn)行在該操作系fLt的自之間的綁定M。 ffiM作 系 處理用于一端口的消息隊(duì)列中的消息,并MB作系統(tǒng)將3^消息掛幾^端口戶,定的應(yīng)用。 操作系統(tǒng)可以存儲(chǔ)端口到細(xì)的多樣的綁定絲,以至于鵬旨定適當(dāng)?shù)亩丝?,可將輸入繊施加?huì)維 當(dāng)?shù)募?xì)。端口雜于操作系統(tǒng)內(nèi),以便無論相應(yīng)的應(yīng)用的狀態(tài)如何,W以接收并安射也處理鵬消 息。
在操作系統(tǒng)的操作開始時(shí),操作系統(tǒng)創(chuàng)建一隊(duì)列用來鵬帶外消息。艦MC可以寫入該隊(duì)列, 并且該隊(duì)歹何以具有一個(gè)與期目關(guān)聯(lián)的中斷。當(dāng)一頓綁定于一端口時(shí),操作系統(tǒng)創(chuàng)建該端口,并將其 與iMffl相關(guān)聯(lián)。操作系^3^創(chuàng)建了一隊(duì)列(一事件隊(duì)列),以處理僅針對(duì)該端口的帶外消息。然后將 用于該端口的帶外消息隊(duì)列存儲(chǔ)鵬到i^Zffl的lfeftU魁止空間,以便不需要內(nèi)核環(huán)Jtt刀瓶就可以使事件 退出隊(duì)列。
事件隊(duì)列與NIC—起注冊(cè),并且在NIC上存在與各隊(duì)列相關(guān)聯(lián)的一個(gè)控制塊(并映射 到OS和應(yīng)用中的任一個(gè)或這兩者的地址空間中)。
圖1例示了如在PCT公報(bào)中描述的帶有控制塊的隊(duì)列。在所描述的實(shí)現(xiàn)中,NIC161 經(jīng)由PCI總線110連接到主機(jī)系統(tǒng)中。事件隊(duì)列159存儲(chǔ)在主機(jī)存儲(chǔ)器160中,NIC161具 有到主機(jī)存儲(chǔ)器160的訪問權(quán)。與事件隊(duì)列159相關(guān)聯(lián)的是讀指針(RDPTR) 162a和寫指 針(WRPTR) 163a,其指出在該隊(duì)列中接下來將要讀取和寫入的數(shù)據(jù)的在隊(duì)列中的點(diǎn)。指 針162a存儲(chǔ)在主機(jī)存儲(chǔ)器160中。指針163a存儲(chǔ)在NIC161中。在NIC和存儲(chǔ)器中的與原 始指針不同的另一個(gè)中存儲(chǔ)有指針的映射副本RDPTR'162b和WRPTR'163b。在該系統(tǒng)的 操作中
1、 NIC161可以通過比較存儲(chǔ)在本地的RDPTR'與WRPTR,來確定用于寫入事件隊(duì)列 159中的可用空間。
2、 NIC161生成帶外數(shù)據(jù)并將其寫入隊(duì)列159。
3、 當(dāng)已寫入數(shù)據(jù)時(shí),NIC161更新WRPTR和WRTER,,使得在一個(gè)數(shù)據(jù)之后將寫入 下一個(gè)數(shù)據(jù)。
4、 應(yīng)用通過對(duì)如從存儲(chǔ)器160訪問的RDPTR與WRPTR'進(jìn)行比較,來確定用于讀取 的可用空間。
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))對(duì)控制塊164的IRQ165a 和IRQ165b'位進(jìn)行置位。將控制塊存儲(chǔ)在主機(jī)存儲(chǔ)器160中并將其映射到NIC中的相 對(duì)應(yīng)的存儲(chǔ)器上。如果進(jìn)行了了置位,則NIC還將在以上步驟3中生成中斷。 事件隊(duì)列機(jī)制通過只有新的事件具有環(huán)境,應(yīng)用和OS就不斷允許它們對(duì)新事件進(jìn)行輪
詢來幫助改善性能;通過只在需要時(shí)產(chǎn)生中斷減少了環(huán)境切換。還減少了總線瓶頸,因?yàn)?主機(jī)系統(tǒng)現(xiàn)在可以從主機(jī)存儲(chǔ)器中的事件中更頻繁地取出控制信息,而不是直接通過PCI 總線從NIC取出控制信息。
然而,對(duì)事件隊(duì)列的使用并沒有完全消除在I/0總線上的控制通訊。尤其是,NIC仍需 要生成用于通知主機(jī)系統(tǒng)NIC已經(jīng)完成了其對(duì)發(fā)送數(shù)據(jù)緩沖區(qū)的處理,并且現(xiàn)在該數(shù)據(jù)緩 沖區(qū)可以被釋放而重新使用的事件。它還需要生成用于通知主機(jī)系統(tǒng)的事件,該事件是NIC 已經(jīng)完成了對(duì)接收數(shù)據(jù)緩沖區(qū)的填充,且現(xiàn)在可以通過主機(jī)處理該接收數(shù)據(jù)緩沖區(qū)。
在某些系統(tǒng)中,NIC還可以生成用于通知其它狀況條件的主機(jī)的其它事件。在某些類 型的系統(tǒng)中,例如,可以長(zhǎng)時(shí)間不加維護(hù)地放置隊(duì)列。這可以是在系統(tǒng)中管理大數(shù)量隊(duì)列 的情況。在這樣的系統(tǒng)中,還能夠生成指示描述符隊(duì)列空條件的事件對(duì)于NIC來說也是希 望的。只要當(dāng)NIC從相應(yīng)的隊(duì)列嘗試取出新的發(fā)送或接收描述符,但發(fā)現(xiàn)隊(duì)列為空時(shí),NIC 都可以斷言描述符隊(duì)列空事件。主機(jī)的相應(yīng)可以是通過采取非常措施而以使附加描述符排 隊(duì)。
每個(gè)事件描述符不希望在I/0總線上占用時(shí)間。另外,通過主機(jī)系統(tǒng)的事件的處理繼續(xù) 需要一些處理時(shí)間,該處理時(shí)間隨著事件數(shù)量的增長(zhǎng)而增長(zhǎng)。大量的事件可能導(dǎo)致大量的 中斷,該大量的中斷進(jìn)一步使主機(jī)性能劣化。
依照本發(fā)明的一個(gè)方面,概略地講,已經(jīng)公認(rèn)的是,在發(fā)送上,發(fā)送DMA描述符隊(duì)列 的清空總是與發(fā)送操作的完成相符(盡管相反過程不必要是真的)。取代向事件隊(duì)列中輸入 完成通知和發(fā)送DMA描述符隊(duì)列空通知這兩者,因此,NIC只輸入一個(gè)事件,在發(fā)送操作 完成事件中嵌入隊(duì)列空通知。
同樣地在接收上,在一個(gè)實(shí)施例中,如果在接收DMA描述符隊(duì)列中沒有識(shí)別足夠數(shù)量 的接收數(shù)據(jù)緩沖區(qū),則輸入包數(shù)據(jù)丟失,只要接收DMA描述符隊(duì)列已被清空,都可以發(fā)布 接收包完成通知。即,即便在接收數(shù)據(jù)緩沖區(qū)中沒有提供足夠空間用來保存所有包的數(shù)據(jù), 如果接收DMA描述符隊(duì)列是空的,則NIC通知主機(jī)包接收完成。同發(fā)送一樣,因此,取 代在事件隊(duì)列中輸入完成通知和接收DMA描述符隊(duì)列空通知這兩者,NIC只輸入一個(gè)事 件,在接收操作完成事件中嵌入隊(duì)列空通知。
通過將單一事件里的描述符隊(duì)列空通知和發(fā)送或接收完成事件的組合,最優(yōu)化I/O總 線的使用。
這種結(jié)合還有附加的好處,因?yàn)樗试SNIC在最后的描述符正在被使用時(shí),而非在隊(duì) 列清空后,通知主機(jī)隊(duì)列清空的情況。這種好處在接收上尤其明顯,因?yàn)樗鼫p少了丟失輸 入包數(shù)據(jù)的可能性。
在具有多重描述符隊(duì)列或具有特大描述符隊(duì)列的實(shí)施例中,描述符隊(duì)列最好保持于主 機(jī)存儲(chǔ)器中而非NIC中,在NIC中存儲(chǔ)器相對(duì)昂貴。在這樣一個(gè)系統(tǒng)中,盡管應(yīng)用響應(yīng)于 從NIC接收到的完成事件,可以在描述符隊(duì)列上寫入附加描述符,它可以通過不將主機(jī)的 已更新的描述符隊(duì)列寫指針通知NIC直到其接收到隊(duì)列清空通知,來減少在總線上的控制 通訊。但是由于隊(duì)列空通知按慣例會(huì)在總線上占用它的自己的時(shí)間,因此,最佳的總線使 用將要求主機(jī)設(shè)法猜測(cè)NIC將在何時(shí)發(fā)現(xiàn)隊(duì)列空,并且此后在那時(shí)刻以前寫入已更新的描 述符隊(duì)列寫指針。這樣的猜測(cè)永遠(yuǎn)不是理想的,因此在一些情況下,主機(jī)會(huì)在要求寫入的 時(shí)刻早的寫入已更新的描述符隊(duì)列寫指針(也就是比它要求的更頻繁地寫入這樣的指針), 而在其它情況下,主機(jī)可能會(huì)延遲太長(zhǎng)時(shí)間,因而導(dǎo)致不理想的NIC的隊(duì)列空通知的總線 使用時(shí)間。另一方面,通過在接收操作完成事件中嵌入隊(duì)列空通知,它們基本在總線不占 用附加時(shí)間。主機(jī)因而能夠總是在將已更新的描述符隊(duì)列寫指針寫入NIC之前等候隊(duì)列空
通知,而不用承擔(dān)不需要的隊(duì)列空通知的總線使用時(shí)間的風(fēng)險(xiǎn)。在另一個(gè)實(shí)施例中,通過 在描述符隊(duì)列中,將主機(jī)的已更新的描述符隊(duì)列寫指針或者顯式或者隱式地嵌入到描述符 中,或者至少在許多這樣的描述符中,可以得到類似的結(jié)果。然后NIC在每一個(gè)描述符中,
或者至少在許多描述符中,接收已更新的指針,因而減少其發(fā)送信號(hào)的隊(duì)列空事件的數(shù)量。 較后的機(jī)制的能夠包含于與較前的機(jī)制的實(shí)施例相同的實(shí)施例中。
附圖的簡(jiǎn)要描述
針對(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è)方面的另一個(gè)系統(tǒng)的簡(jiǎn)化框圖。
圖13是由圖12的系統(tǒng)使用的用以支持發(fā)送隊(duì)列的特定數(shù)據(jù)結(jié)構(gòu)的框圖。
圖14是由圖12的系統(tǒng)使用的用以支持接收隊(duì)列的特定數(shù)據(jù)結(jié)構(gòu)的框圖。
詳細(xì)地描述
為了使得本領(lǐng)域的任何技術(shù)人員能夠?qū)崿F(xiàn)并使用本發(fā)明,給出了以下描述,并且以下 描述是在特定應(yīng)用及其要求的情況下提供的。本領(lǐng)域的技術(shù)人員容易想到對(duì)所公開的實(shí)施 例的各種修改,并且在不脫離本發(fā)明的精神和范圍的情況下可以將這里限定的普遍原理應(yīng) 用于其它實(shí)施例和應(yīng)用。由此,本發(fā)明并不限于所示出的多個(gè)實(shí)施例,而是包括與這里所 公開的原理和特征相一致的最寬的范圍。
圖2是一種可以通過網(wǎng)絡(luò)212與諸如230、 232以及234的其它計(jì)算機(jī)系統(tǒng)相通信的典 型計(jì)算機(jī)系統(tǒng)210的簡(jiǎn)化框圖。計(jì)算機(jī)系統(tǒng)210包括通過通信通道218與主機(jī)子系統(tǒng)214 相通信的網(wǎng)絡(luò)接口卡(NIC) 216。主機(jī)子系統(tǒng)214包括處理器子系統(tǒng)220,處理器子系統(tǒng) 包括至少一個(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的接口,并通過網(wǎng)絡(luò)212耦合到其它計(jì)算機(jī)系統(tǒng)中的對(duì)應(yīng)接口設(shè)備。網(wǎng)絡(luò)218可以包括許多互連的計(jì)算機(jī)系統(tǒng)和通信 鏈路。這些通信鏈路可以是有線鏈路、光學(xué)鏈路、無線鏈路或用于對(duì)信息進(jìn)行通信的任何 其它機(jī)制。雖然在一個(gè)實(shí)施例中網(wǎng)絡(luò)218是因特網(wǎng),但是在其它實(shí)施例中,網(wǎng)絡(luò)218可以 是任何合適的計(jì)算機(jī)網(wǎng)絡(luò)或多個(gè)網(wǎng)絡(luò)的組合。在這里描述的實(shí)施例中,網(wǎng)絡(luò)218支持以太 網(wǎng)協(xié)議。
主機(jī)存儲(chǔ)器子系統(tǒng)222典型地包括多個(gè)存儲(chǔ)器,這些存儲(chǔ)器包括用于在程序執(zhí)行過程 中存儲(chǔ)指令和數(shù)據(jù)的主隨機(jī)存取存儲(chǔ)器(RAM),和其中存儲(chǔ)有固定指令和數(shù)據(jù)的只讀存儲(chǔ) 器(ROM)。在主機(jī)存儲(chǔ)器子系統(tǒng)222中還可以包括一級(jí)或多級(jí)的高速緩沖存儲(chǔ)器。為了簡(jiǎn) 化討論,這里有時(shí)將主機(jī)存儲(chǔ)器子系統(tǒng)222簡(jiǎn)稱為"主機(jī)存儲(chǔ)器"。
通信通道218提供了用于允許計(jì)算機(jī)系統(tǒng)210的各種組件和子系統(tǒng)相互進(jìn)行通信的機(jī) 制。在一個(gè)實(shí)施例中,通信通道218包括PCI總線。其它實(shí)施例可以包括其它總線,還可 以包括多重總線。
計(jì)算機(jī)系統(tǒng)210本身可以是變化的類型,包括個(gè)人計(jì)算機(jī)、便攜式計(jì)算機(jī)、工作站、 計(jì)算機(jī)終端、網(wǎng)絡(luò)計(jì)算機(jī)、電視、大型機(jī)、服務(wù)器或任何其它數(shù)據(jù)處理系統(tǒng)或用戶設(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)類似或不同的配置。
數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)化實(shí)施例
圖3和圖4例示了被并入于圖2的計(jì)算機(jī)系統(tǒng)210中的本發(fā)明的簡(jiǎn)化實(shí)施例。在圖3 的實(shí)施例中,僅示出了單個(gè)發(fā)送隊(duì)列及其相關(guān)結(jié)構(gòu),在圖4的實(shí)施例中,僅示出了單個(gè)接 收隊(duì)列及其相關(guān)結(jié)構(gòu)。在典型實(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ù)的,并且通過發(fā)送緩沖區(qū)鏈表312 將這些發(fā)送數(shù)據(jù)緩沖區(qū)鏈接起來。主機(jī)子系統(tǒng)214將發(fā)送數(shù)據(jù)緩沖區(qū)描述符寫入發(fā)送緩沖 區(qū)鏈表312中的由主機(jī)存儲(chǔ)器222中的緩沖區(qū)鏈表寫指針314指向的位置處,并且NIC216 在由NIC216上的,與主機(jī)存儲(chǔ)器222中的緩沖區(qū)鏈表讀指針316相對(duì)應(yīng)的緩沖區(qū)鏈表讀指 針326所指向的位置處從發(fā)送緩沖區(qū)鏈表312中讀取發(fā)送緩沖區(qū)描述符。發(fā)送緩沖區(qū)鏈表
312是"環(huán)繞"鏈表,意思是在鏈表的末端連續(xù)地遞增的指針按環(huán)狀方式自動(dòng)環(huán)繞到起始。 如果鏈表具有N個(gè)條目,例如,可以說讀和寫指針遞增"模N"。還可以說指針"模數(shù)遞增", 這暗含了鏈表的長(zhǎng)度。
與發(fā)送緩沖區(qū)鏈表312和發(fā)送數(shù)據(jù)緩沖區(qū)310相關(guān)聯(lián)的還有發(fā)送事件隊(duì)列318,它也 是個(gè)環(huán)繞結(jié)構(gòu)。將事件寫入到發(fā)送事件隊(duì)列318中的由NIC216上的發(fā)送事件隊(duì)列寫指針 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)事件遞送延遲和整體總線效率,由NIC216將事件寫出 到主機(jī)存儲(chǔ)器222中,而不是由主機(jī)子系統(tǒng)214從NIC216中的位置讀取事件。
這里將指向發(fā)送緩沖區(qū)鏈表312中的寫指針314和讀指針316稱為是"主機(jī)中心"的, 因?yàn)樗鼈儽硎居芍鳈C(jī)子系統(tǒng)214所觀察到的隊(duì)列狀態(tài)。在各種實(shí)施例中,主機(jī)子系統(tǒng)214 可以將這些指針進(jìn)行比較,以根據(jù)在實(shí)施中對(duì)于隊(duì)列深度管理需要什么,來檢測(cè)隊(duì)列溢出 狀況、隊(duì)列充滿狀況、或者隊(duì)列高或低水位標(biāo)狀況。如下所述,NIC216還保持發(fā)送數(shù)據(jù)隊(duì) 列310的寫指針324和讀指針326。將NIC上的寫指針324和讀指針326稱為"設(shè)備中心" 指針,因?yàn)樗鼈儽硎居蒒IC設(shè)備216觀察到的隊(duì)列狀態(tài)。按常規(guī)方式,主機(jī)子系統(tǒng)使用它 的主機(jī)中心緩沖區(qū)鏈表寫指針314向發(fā)送緩沖區(qū)鏈表312進(jìn)行寫入,在進(jìn)行了寫入之后使 主機(jī)中心緩沖區(qū)鏈表寫指針314模數(shù)遞增,并通知NIC更新它的設(shè)備中心緩沖區(qū)鏈表寫指 針324。類似地,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ū)鏈表寫指針與設(shè)備中心緩沖區(qū)寫指針相同 步,但是可能存在其中各對(duì)中的兩個(gè)指針并不完全匹配的某個(gè)時(shí)間點(diǎn)。重要的是,在該簡(jiǎn) 化實(shí)施例中,主機(jī)子系統(tǒng)214不保持發(fā)送事件隊(duì)列寫指針332的主機(jī)中心復(fù)本。NIC216確 實(shí)保持有發(fā)送事件隊(duì)列讀指針320的設(shè)備中心復(fù)本344,但是它并不是用于事件隊(duì)列深度管 理的。相反地,如下更詳細(xì)地描述的,它是用于管理對(duì)主機(jī)子系統(tǒng)的中斷的生成以激活發(fā) 送事件處理器。
NIC216進(jìn)一步包括將設(shè)備中心發(fā)送事件隊(duì)列寫指針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ù)寫入發(fā)送FIFO340中。由物理網(wǎng)絡(luò)接口 (PHY) 342將從發(fā)送 FIFO340輸出的數(shù)據(jù)驅(qū)動(dòng)到網(wǎng)絡(luò)212上。
網(wǎng)絡(luò)接口卡216通過I/0總線218 (及其它手段)與主機(jī)存儲(chǔ)器222相通信。優(yōu)選地, I/O總線218是PCI總線,更優(yōu)選地PCI的版本是PCI express。在PCI Special Interest Group 的"PCI Express Base Specification 1.0a" (April 15,2003)中描述了 PCI express,通過引用將 其并入于此。通過核心邏輯子系統(tǒng)224使用直接存儲(chǔ)器存取(DMA)協(xié)議、經(jīng)由I/0總線 218對(duì)大部分?jǐn)?shù)據(jù)(包括來自發(fā)送數(shù)據(jù)緩沖區(qū)310的發(fā)送數(shù)據(jù))進(jìn)行通信,盡管在主機(jī)子系 統(tǒng)214與NIC216之間的某些通信可以涉及處理器子系統(tǒng)220。
現(xiàn)在參照?qǐng)D4,類似于發(fā)送隊(duì)列,將接收隊(duì)列存儲(chǔ)在主機(jī)存儲(chǔ)器222中的一系列接收 數(shù)據(jù)緩沖區(qū)410中。通過環(huán)繞接收緩沖區(qū)鏈表412將這些接收數(shù)據(jù)緩沖區(qū)鏈接起來。當(dāng)主 機(jī)子系統(tǒng)214希望使得附加緩沖區(qū)可用于接受接收數(shù)據(jù)時(shí),它將新接收數(shù)據(jù)緩沖區(qū)的標(biāo)識(shí) 寫入接收緩沖區(qū)鏈表412中的由主機(jī)存儲(chǔ)器222中的主機(jī)中心緩沖區(qū)鏈表寫指針414指向 的位置處。NIC216從由NIC216上的,與主機(jī)存儲(chǔ)器222中的主機(jī)中心緩沖區(qū)鏈表讀指針 416相對(duì)應(yīng)的設(shè)備中心緩沖區(qū)鏈表讀指針426所指向的位置的接收緩沖區(qū)鏈表412讀取接收 緩沖區(qū)描述符。
與接收緩沖區(qū)鏈表412和接收緩沖區(qū)410相關(guān)聯(lián)的還有環(huán)繞接收事件隊(duì)列418。將事 件寫入到接收事件隊(duì)列418中的由NIC216上的接收事件隊(duì)列寫指針432標(biāo)識(shí)的位置處,并 從該接收事件隊(duì)列418中的由主機(jī)存儲(chǔ)器222中的接收事件隊(duì)列讀指針420標(biāo)識(shí)的位置處 讀取事件。對(duì)于發(fā)送事件隊(duì)列讀指針和寫指針,按常規(guī)的方式,主機(jī)子系統(tǒng)使用它的主機(jī) 中心緩沖區(qū)鏈表寫指針414向接收緩沖區(qū)鏈表412進(jìn)行寫入,在進(jìn)行了寫入之后使主機(jī)中 心緩沖區(qū)鏈表寫指針414模數(shù)遞增,并通知NIC更新它的設(shè)備中心緩沖區(qū)鏈表寫指針424。 類似地,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ì)列寫指針432的主機(jī)中心復(fù)本。如在發(fā)送端那樣,NIC216確實(shí)保持有接收 事件隊(duì)列讀指針420的設(shè)備中心復(fù)本444,但是它是用于管理對(duì)主機(jī)子系統(tǒng)的中斷的生成以
激活接收事件處理器,而不是用于事件隊(duì)列深度管理。
NIC216進(jìn)一步包括將設(shè)備中心接收事件隊(duì)列寫指針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ā)送裝置和上述接收端組件之外,還保持有接收FIF0440, NIC216 將它從PHY342接收的數(shù)據(jù)寫入接收FIFO440中。NIC216根據(jù)接收緩沖區(qū)鏈表412的當(dāng)前 條目將從接收FIFO440輸出的數(shù)據(jù)寫入接收數(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)的功能的情況下按不同的次序來 執(zhí)行這些步驟。此外,盡管這里將這些功能描述為按不同的"模塊"來執(zhí)行,但是應(yīng)當(dāng)理 解,如果確要模塊化的話,實(shí)際實(shí)現(xiàn)并不一定要按相同的方式來"模塊化"。
在圖5中,主機(jī)發(fā)送事件管理模塊從更高級(jí)軟件接收到一指示發(fā)送數(shù)據(jù)緩沖區(qū)310 中的一個(gè)或更多個(gè)新緩沖區(qū)等待發(fā)送(步驟510)。還可以在輪詢循環(huán)或定時(shí)器到期時(shí)定期 地激活該模塊(步驟512)。典型地,什么時(shí)候去推發(fā)送緩沖區(qū)的時(shí)間和同時(shí)推多少發(fā)送緩 沖區(qū)屬于以對(duì)于本發(fā)明的理解來說不是重要的外界因素為基礎(chǔ)做出的決定。僅僅只要更高 級(jí)軟件已經(jīng)填滿發(fā)送緩沖區(qū),就不再推發(fā)送緩沖區(qū)。
在步驟514,為了保證發(fā)送事件隊(duì)列318不溢出,主機(jī)子系統(tǒng)214確定在發(fā)送事件隊(duì) 列318中的當(dāng)前可用空間。主機(jī)子系統(tǒng)214將不會(huì)對(duì)比按照將要生成的發(fā)送完成事件的最 大量提供到發(fā)送事件隊(duì)列318中的數(shù)據(jù)緩沖區(qū)多的用于發(fā)送的數(shù)據(jù)緩沖區(qū)進(jìn)行排隊(duì)。通常, 通過B、x-z)-y得出主機(jī)子系統(tǒng)排隊(duì)用來發(fā)送的數(shù)據(jù)緩沖區(qū)的最大量,其中x是發(fā)送事件隊(duì) 列318中的條目的總數(shù);z是可能寫入事件隊(duì)列318的其它類型的事件的預(yù)定最大量,例如 管理事件;y是先前排隊(duì)的并且仍然未被處理的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量;以及B是在發(fā)送 事件隊(duì)列318中可以由每個(gè)發(fā)送完成事件所描述的發(fā)送數(shù)據(jù)緩沖區(qū)的最小量。
x的值,即在發(fā)送事件隊(duì)列318中的條目的總數(shù),在一個(gè)實(shí)施例中是被預(yù)定和固定的。 在另一個(gè)實(shí)施例中,主機(jī)子系統(tǒng)214可以確定并且更改發(fā)送事件隊(duì)列大小x,依靠諸如多快 能在網(wǎng)絡(luò)212上產(chǎn)生給定的數(shù)據(jù)速率的事件這些因素,并且基于多快主機(jī)子系統(tǒng)能夠處理
接收到的事件。
在一個(gè)實(shí)施例中,z的值是允許NIC216向發(fā)送事件隊(duì)列318寫入而不需要被清除時(shí)管 理事件的預(yù)定最大量。假定每個(gè)資源可以斷言不多于一個(gè)事件而不被清除,則優(yōu)選通過在 NIC216中的管理事件資源的總數(shù)而得出z;可以丟棄或者保存來自上述資源的附加事件。 更一般地,z是Ei (i=l..s, s是管理事件資源的數(shù)量)的和,并且Ei (i=l..s)是事件的最 大量,每個(gè)第i個(gè)這樣的資源可以在任何給定的點(diǎn)及時(shí)地具有未被處理的事件。
B,發(fā)送數(shù)據(jù)緩沖區(qū)的可以通過在發(fā)送事件隊(duì)列318中的每個(gè)發(fā)送完成事件進(jìn)行描述 的最小量,在一個(gè)實(shí)施例中B是一 (B=l)。也就是,每個(gè)被發(fā)送到NIC216的發(fā)送數(shù)據(jù)緩 沖區(qū)生成單個(gè)相應(yīng)的發(fā)送完成事件。在另一個(gè)實(shí)施例中,每個(gè)發(fā)送完成事件總是暗含地描 述大于1的的固定數(shù)量的發(fā)送數(shù)據(jù)緩沖區(qū),例如64;在這種情況下,B是上述固定的數(shù)量。 在這樣一個(gè)實(shí)施例中,被發(fā)送到NIC216的每組B個(gè)發(fā)送數(shù)據(jù)緩沖區(qū)生成一個(gè)相應(yīng)的發(fā)送 完成事件。然而在第三實(shí)施例中,每個(gè)發(fā)送完成事件描述一個(gè)已完成的發(fā)送數(shù)據(jù)緩沖區(qū)的 變量,但不大于預(yù)定的最大值,也不小于預(yù)定的最小值;在這種情況下,B就是那個(gè)最小 值。由發(fā)送完成事件自身指示描述的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量。即使在第三實(shí)施例中,B也 可以與l一樣小。
在一優(yōu)選實(shí)施例中,通過主機(jī)子系統(tǒng)214, B是可編程的,并且其后是固定的。該實(shí) 施例,與像變量實(shí)施例相比,更像"固定"實(shí)施例,因?yàn)橥ㄟ^發(fā)送完成事件所描述的發(fā)送 數(shù)據(jù)緩沖區(qū)的數(shù)量是不變的,并且主機(jī)和NIC都知道這是什么。決不會(huì)出現(xiàn)變量實(shí)施例的 復(fù)雜性。
y的值,先前排隊(duì)的并且仍然未被處理的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量,不是基于發(fā)送事件 隊(duì)列讀指針和寫指針的任何比較來確定,而是基于主機(jī)子系統(tǒng)先前己經(jīng)"許可的"NIC216 進(jìn)行寫入的發(fā)送事件隊(duì)列條目的數(shù)量的主機(jī)子系統(tǒng)214的歷史消息,以及依據(jù)主機(jī)子系統(tǒng) 已經(jīng)"耗用的"的這些發(fā)送事件隊(duì)列條目的數(shù)量的主機(jī)子系統(tǒng)214的歷史消息來確定。主 機(jī)通過通知NIC216發(fā)送數(shù)據(jù)的行為來"許可"NIC216寫發(fā)送事件隊(duì)列條目。主機(jī)通過將 發(fā)送數(shù)據(jù)描述符(也可以被認(rèn)為是DMA命令)推入到發(fā)送緩沖區(qū)鏈表312來發(fā)布這些指示。 這樣,先前"許可的"NIC216進(jìn)行寫入的發(fā)送事件隊(duì)列條目的數(shù)量的主機(jī)歷史消息,是可 以通過先前排隊(duì)用來發(fā)送的數(shù)據(jù)緩沖區(qū)的數(shù)量來確定。特別地,先前已許可的發(fā)送事件隊(duì) 列條目的數(shù)量等于1/B乘以先前排隊(duì)用來發(fā)送的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量。主機(jī)子系統(tǒng)己經(jīng) "耗用的"的發(fā)送事件隊(duì)列條目的數(shù)量的主機(jī)歷史消息只是1/B乘以將通過在發(fā)送事件隊(duì)列318中實(shí)際接收到的發(fā)送完成事件所描述的發(fā)送數(shù)據(jù)緩沖區(qū)傳輸?shù)臄?shù)量——但是只限于 通過每個(gè)發(fā)送完成事件所描述的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量是固定的這樣的實(shí)施例中。在這種 情況下,主機(jī)子系統(tǒng)214確定y作為先前排隊(duì)用來發(fā)送的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量,小于B 與在發(fā)送事件隊(duì)列318中實(shí)際接收到的發(fā)送完成事件的數(shù)量的乘積。在一個(gè)實(shí)施例中,通 過從主機(jī)中心發(fā)送緩沖區(qū)鏈表寫指針314模數(shù)遞減主機(jī)中心發(fā)送緩沖區(qū)鏈表讀指針316來 確定y。
在一個(gè)實(shí)施例中,由每個(gè)發(fā)送完成事件來描述的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量是變量,無法 由通過實(shí)際接收到發(fā)送事件隊(duì)列318中的發(fā)送完成事件所描述的任何固定的發(fā)送數(shù)據(jù)緩沖 區(qū)傳輸?shù)臄?shù)量來確定主機(jī)的主機(jī)子系統(tǒng)已經(jīng)耗用的發(fā)送事件隊(duì)列條目的數(shù)量的歷史消息。 在那樣的情況下,使用另一個(gè)機(jī)制來作出這個(gè)確定。
在確定了在發(fā)送事件隊(duì)列318中的當(dāng)前可用空間的數(shù)量后,在步驟516中,主機(jī)子系 統(tǒng)214確定數(shù)量"M",其是待發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)量和,可以通過如在步驟514確定的發(fā) 送事件隊(duì)列318中的可用空間的發(fā)送完成事件來進(jìn)行描述的發(fā)送數(shù)據(jù)緩沖區(qū)的最小值,兩 者中的較小者。
在步驟518中,確定M大于還是等于某個(gè)最小閾值。在一個(gè)實(shí)施例中,該閾值為l, 這意味著只要新發(fā)送數(shù)據(jù)緩沖區(qū)準(zhǔn)備好進(jìn)行發(fā)送并且在發(fā)送事件隊(duì)列318中存在任何可用 空間就許可發(fā)送事件隊(duì)列318的事件。然而,逐個(gè)地許可事件會(huì)對(duì)I/O總線218增加顯著的 額外開銷,因此在更優(yōu)選的實(shí)施例中,選擇較大的數(shù)作為閾值。如果M小于該閾值,則主 機(jī)發(fā)送事件隊(duì)列管理模塊500僅僅變得不活動(dòng),以等待下一激活事件(步驟530)。 (2007 年9月23日)
如果M大于或等于該最小閾值,那么在步驟520中,主機(jī)子系統(tǒng)214 "許可"NIC寫 入M/B個(gè)新發(fā)送事件到發(fā)送事件隊(duì)列318中。這個(gè)許可通過在發(fā)送緩沖區(qū)鏈表312中的待 發(fā)送數(shù)據(jù)緩沖區(qū)描述符的寫入而暗含地執(zhí)行,因而要求在I/O總線218上僅有較少或者沒有 額外開銷。特別地,步驟520包括步驟522,在步驟522中主機(jī)子系統(tǒng)214將其主機(jī)中心緩 沖區(qū)鏈表寫指針314更新(模數(shù)遞增)M個(gè)條目。在步驟524中,以先前(在步驟522之 前)由主機(jī)中心緩沖區(qū)鏈表寫指針314指定的條目為起點(diǎn),主機(jī)子系統(tǒng)214將M個(gè)待發(fā)送 數(shù)據(jù)緩沖區(qū)描述符寫入發(fā)送數(shù)據(jù)緩沖區(qū)鏈表312中。主機(jī)中心緩沖區(qū)鏈表寫指針的更新先 于M個(gè)發(fā)送數(shù)據(jù)緩沖區(qū)描述符的隊(duì)列是為了避免產(chǎn)生一種競(jìng)爭(zhēng)狀況,籍由這種競(jìng)爭(zhēng)狀況, 主機(jī)子系統(tǒng)214在新發(fā)送數(shù)據(jù)緩沖區(qū)描述符排隊(duì)后變成隱藏,并且NIC在主機(jī)214返回更新讀指針前取出發(fā)送數(shù)據(jù)緩沖區(qū)內(nèi)容。在步驟526中,主機(jī)子系統(tǒng)214將所更新的寫指針 通知給NIC216,在步驟528中,NIC216更新它自己的設(shè)備中心緩沖區(qū)鏈表寫指針324。在 一個(gè)實(shí)施例中,將步驟526與528組合成單個(gè)步驟,在該步驟中,主機(jī)子系統(tǒng)214將所更 新的寫指針寫入設(shè)備中心發(fā)送緩沖區(qū)鏈表寫指針324的存儲(chǔ)器映射位置中。
在步驟530中,主機(jī)發(fā)送事件隊(duì)列管理模塊變得不活動(dòng),以等待下一激活事件??梢?看出,NIC216從備中心發(fā)送緩沖區(qū)鏈表讀指針326和寫指針324間的模數(shù)差異暗含地知道 發(fā)送事件隊(duì)列318中的可用空間的大小。因?yàn)槌前l(fā)送事件隊(duì)列318中的已經(jīng)有可用的空 間用來提供給任何作為結(jié)果的發(fā)送完成事件,否則主機(jī)子系統(tǒng)214是不會(huì)將緩沖區(qū)描述符 寫入發(fā)送緩沖區(qū)鏈表312中的,所以NIC知道能夠?qū)⒛敲炊嗟陌l(fā)送事件寫入發(fā)送事件隊(duì)列 318中而不溢出。
圖6是例示了在NIC216上發(fā)起的用于將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)212上的功能的流程圖。在 TXFIFO低水位標(biāo)(LWM)狀況610上激活NIC發(fā)送數(shù)據(jù)模塊600。在通過輪詢循環(huán)進(jìn)行 選擇時(shí)或定時(shí)器到期時(shí)也定期地激活該模塊(步驟612)。
在步驟620中,NIC216首先確定在發(fā)送緩沖區(qū)鏈表312中并且待取出的發(fā)送數(shù)據(jù)緩沖 區(qū)描述符的數(shù)量。通過從設(shè)備中心緩沖區(qū)鏈表寫指針324模數(shù)減去設(shè)備中心緩沖區(qū)鏈表讀 指針326,來進(jìn)行該確定。NIC還根據(jù)它自己的指向TXFIFO340中的讀和寫指針知道在它 自己的TXFIF0340中的可用空間。在步驟622中,NIC確定M,待發(fā)送緩沖區(qū)描述符的數(shù) 量和TX FIFO340中的可用空間中的較小者。因此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ù)。由于通過DMA經(jīng)由I/O 總線218執(zhí)行從發(fā)送數(shù)據(jù)緩沖區(qū)310的數(shù)據(jù)取出,因此這里有時(shí)將發(fā)送緩沖區(qū)描述符稱為 DMA描述符或DMA命令。對(duì)M個(gè)緩沖區(qū)描述符本身的取出也是通過DMA經(jīng)由I/O總線 218來執(zhí)行。
注意,在不同的實(shí)施例中,對(duì)M個(gè)緩沖區(qū)描述符地讀取可以與對(duì)發(fā)送數(shù)據(jù)的讀取相交 織或按流水線式進(jìn)行,而不是作為獨(dú)立的原子步驟(atomic step)來執(zhí)行。還要注意的是, 從由已存在于FIFO340中的緩沖區(qū)描述符標(biāo)識(shí)的發(fā)送數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù)不是等到低水 位標(biāo)或閾值數(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)橛捎谕瓿墒录?遞送的結(jié)果,隱式或顯式地進(jìn)行通知。
在圖6的實(shí)施例中,每個(gè)發(fā)送完成事件都可以表示多個(gè)數(shù)據(jù)緩沖區(qū)完成。除了在某些 下述更不常見的情況下以外,由每個(gè)發(fā)送完成事件表示的數(shù)據(jù)緩沖區(qū)完成的數(shù)量是一個(gè)可 編程的但繼而是固定的數(shù)量B。因而NIC216 "批處理"發(fā)送完成事件到一,從而使I/0總 線218的使用最優(yōu)化。另外,在某些常規(guī)DMA命令隊(duì)列實(shí)現(xiàn)中,隊(duì)列空警報(bào)的發(fā)現(xiàn)和報(bào)告 不會(huì)發(fā)生直到控制器嘗試取出下一 DMA命令和發(fā)現(xiàn)隊(duì)列空,當(dāng)NIC216認(rèn)為在發(fā)送隊(duì)列中 它已經(jīng)使用最后的緩沖區(qū)描述符時(shí),改為由NIC216檢測(cè)和報(bào)告一個(gè)警報(bào)。這個(gè)"取出的最 后的緩沖區(qū)"狀況與最后的批處理發(fā)送完成事件組合成單個(gè)事件描述符,從而進(jìn)一步使I/0 總線218的使用最優(yōu)化。圖6的接下來的步驟例示了這兩個(gè)最優(yōu)化。
特別地,NIC在步驟640中確定它是否認(rèn)為由發(fā)送緩沖區(qū)鏈標(biāo)312中的描述符所標(biāo)識(shí) 的最后的發(fā)送數(shù)據(jù)緩沖區(qū)已經(jīng)在步驟628中取出。如果由NIC216在步驟626中從發(fā)送緩沖 區(qū)鏈表讀取的緩沖區(qū)描述符的數(shù)量M,等于在步驟620中在發(fā)送緩沖區(qū)鏈表中的發(fā)送緩沖 區(qū)描述符的數(shù)量,則這種狀況是正確的。如果不是,也就是NIC知道在發(fā)送緩沖區(qū)鏈表312 中有更多的發(fā)送緩沖區(qū)描述符,則在此點(diǎn)的,由NIC寫入發(fā)送事件隊(duì)列318的任何發(fā)送完 成事件均不對(duì)tx—desc—q_empty旗標(biāo)置位。
在步驟642中,NIC對(duì)N與B進(jìn)行比較,N是表示除在先前寫入發(fā)送事件隊(duì)列318中 的批處理發(fā)送完成事件中己報(bào)告的那些發(fā)送緩沖區(qū)以外的已從主機(jī)存儲(chǔ)器中取出的發(fā)送緩 沖區(qū)的數(shù)量的值。如果N〈B,則NIC發(fā)送數(shù)據(jù)模塊600僅僅變得不活動(dòng),以等待下一激活 事件(步驟644)。僅對(duì)未被處理的發(fā)送緩沖區(qū)完成進(jìn)行累積,并且直到下一次寫入發(fā)送完 成事件時(shí)才不報(bào)告給主機(jī)子系統(tǒng)214。另一方面,如果在步驟642中N〉:B,則在步驟646 中,以由設(shè)備中心發(fā)送事件隊(duì)列寫指針標(biāo)識(shí)的條目為起點(diǎn),NIC216將表示B個(gè)發(fā)送數(shù)據(jù)緩 沖區(qū)的整數(shù)倍(總共)的批處理發(fā)送完成事件寫入發(fā)送事件隊(duì)列318中。因此在步驟646 中寫入的批處理發(fā)送完成事件的數(shù)量是N/B的整數(shù)部分,并且直到下一次寫入這種完成事 件時(shí)才將任何余數(shù)報(bào)告給主機(jī)子系統(tǒng)214。該發(fā)送完成事件描述符格式包括一個(gè)旗標(biāo) "tX_desc_q_empty"旗標(biāo),但是在步驟646中寫入的發(fā)送完成事件中,這個(gè)旗標(biāo)不被置位,
因?yàn)镹IC已經(jīng)確定(在步驟640中)在發(fā)送緩沖區(qū)鏈表312中保留有附加發(fā)送緩沖區(qū)描述 符。
在一實(shí)施例中,NIC確定N二B,并且只要NIC的設(shè)備中心緩沖區(qū)鏈表寫指針324是B 的整數(shù)倍,就寫入批處理發(fā)送完成事件。
注意,當(dāng)完成了將數(shù)據(jù)從主機(jī)存儲(chǔ)器222傳送到發(fā)送FIF0340中時(shí),NIC216將發(fā)送 完成事件寫入發(fā)送事件隊(duì)列318中。它不進(jìn)行等待,直到將數(shù)據(jù)實(shí)際發(fā)送到網(wǎng)絡(luò)212上, 這是因?yàn)楦呒?jí)應(yīng)用軟件典型地對(duì)發(fā)送錯(cuò)誤不感興趣。另一實(shí)施例直到在將數(shù)據(jù)發(fā)送到網(wǎng) 絡(luò)上的處理中發(fā)生了隨后步驟,例如網(wǎng)絡(luò)接口設(shè)備完成了將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上,才會(huì)將"發(fā) 送完成"通知給主機(jī)子系統(tǒng)。在這里使用的,如果在特定實(shí)施例中,對(duì)這種下游步驟的通 知意味著NIC己經(jīng)完成了從發(fā)送數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù),則將這種通知視為"包括",由網(wǎng) 絡(luò)接口設(shè)備向主機(jī)子系統(tǒng)通知完成了從發(fā)送數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù),這一步驟。
返回到步驟640,如果NIC216認(rèn)為在步驟628中已經(jīng)提取了由發(fā)送緩沖區(qū)鏈表312 中的描述符標(biāo)識(shí)的最后的發(fā)送數(shù)據(jù)緩沖區(qū),則NIC在報(bào)告發(fā)送完成事件之前不用等待,直 到N>=B。取而代之,以設(shè)備中心發(fā)送事件隊(duì)列寫指針332為起點(diǎn),NIC向發(fā)送事件隊(duì)列 318寫入充足的批處理發(fā)送完成事件,以覆蓋所有的N個(gè)未被處理的緩沖區(qū)完成。從而如 果N是B的整數(shù)倍,則在步驟648中寫入N/B個(gè)發(fā)送完成事件,如果N不是B的整數(shù)倍, 則在步驟648中寫入INT(N/B)+1個(gè)發(fā)送完成事件。無論在步驟648中寫入的發(fā)送完成事件 的數(shù)量是多少,最后的發(fā)送完成事件都將具有它自己的tx—deSC—q_empty旗標(biāo)置位。
應(yīng)當(dāng)理解,N不是B的整數(shù)倍時(shí),在步驟648中寫入的最后的發(fā)送完成事件將表示少 于B個(gè)發(fā)送緩沖區(qū)完成。注意,在一個(gè)實(shí)施例中,由于主機(jī)已經(jīng)知道發(fā)送緩沖區(qū)鏈表它自 己的深度,所以無需專門的通知用于主機(jī)知道這些。主機(jī)知道每個(gè)發(fā)送完成事件均表示B 與保留在發(fā)送緩沖區(qū)鏈表中的描述符的數(shù)量的較小者。然而,在另一個(gè)實(shí)施例中,只依靠 保留在發(fā)送緩沖區(qū)鏈表中的描述符的數(shù)量來確定由最后的完成事件描述的緩沖區(qū)完成的數(shù) 量,可能創(chuàng)建競(jìng)爭(zhēng)狀況,例如,如果在步驟626中,在NIC216從鏈表最后提取緩沖區(qū)描述 符之后,主機(jī)將更多的緩沖區(qū)描述符在發(fā)送緩沖區(qū)鏈表312中排隊(duì)。為了避免這樣的競(jìng)爭(zhēng) 狀況,發(fā)送完成事件格式還包括字段(tx—desc』tr), NIC216復(fù)制其設(shè)備中心緩沖區(qū)鏈表讀 指針326于其中。主機(jī)可以通過由1/B的小數(shù)部分乘以,在發(fā)送完成事件中報(bào)告的設(shè)備中 心緩沖區(qū)鏈表讀指針與主機(jī)中心緩沖區(qū)鏈表讀指針316之間的差,來確定最后的完成事件 所描述的緩沖區(qū)完成的數(shù)量。二者擇一地,主機(jī)可以僅通過在發(fā)送完成事件中報(bào)告的設(shè)備
中心緩沖區(qū)鏈表讀指針更新它的主機(jī)中心緩沖區(qū)鏈表讀指針316,無需對(duì)由接收的發(fā)送完成
事件所描述的緩沖區(qū)完成的數(shù)量進(jìn)行單獨(dú)計(jì)算。
在多個(gè)實(shí)施例中,除發(fā)送描述符隊(duì)列空狀況之外的其它狀況還可以導(dǎo)致NIC寫入覆蓋 少于B個(gè)發(fā)送緩沖區(qū)的發(fā)送完成事件。 一個(gè)這樣的其它狀況,可能是發(fā)送隊(duì)列清空操作的 完成。對(duì)于每個(gè)這樣的狀況,提供一種機(jī)制,使主機(jī)子系統(tǒng)能夠知道在發(fā)送緩沖區(qū)鏈表312 中由批處理發(fā)送完成事件覆蓋哪些描述符。同樣在多個(gè)實(shí)施例中,還可以批處理除了數(shù)據(jù) 發(fā)送完成事件以外的其它重復(fù)事件。候選例子包括(不限于)通知主機(jī)子系統(tǒng)多個(gè)結(jié)構(gòu)完 成操作的事件,這樣的主機(jī)命令對(duì)緩沖區(qū)描述符表1310中條目進(jìn)行更新,在以下將描述。
如果在步驟646或648中將任何發(fā)送完成事件寫入發(fā)送事件隊(duì)列318中,則在步驟634 中NIC216相應(yīng)地更新它自己的發(fā)送事件隊(duì)列寫指針。在步驟634中對(duì)設(shè)備中心發(fā)送事件隊(duì) 列寫指針332的更新可能會(huì)導(dǎo)致產(chǎn)生一中斷(步驟636)以激活參照?qǐng)D7討論的主機(jī)發(fā)送事 件處理器。如可以從圖3中的邏輯看到的,如果設(shè)備中心發(fā)送事件隊(duì)列寫指針332先前等 于設(shè)備中心發(fā)送事件隊(duì)列讀指針344,則在步驟634中進(jìn)行的更新會(huì)導(dǎo)致比較器346的輸出 過渡到活動(dòng)狀態(tài)。如果在出現(xiàn)該情況時(shí)中斷使能位348是有效的,則中斷發(fā)生器352將產(chǎn) 生中斷。如果在步驟634中進(jìn)行更新時(shí)所述讀指針和寫指針先前不相等,則不會(huì)產(chǎn)生新的 中斷,因?yàn)楸容^器346輸出將己經(jīng)處于活動(dòng)狀態(tài)。注意,在某些情況下對(duì)寫指針332的更 新會(huì)導(dǎo)致比較器346過渡到不活動(dòng)狀態(tài),尤其是如果該寫指針已繞回并且就要追上讀指針。 但是這不是邏輯350需要處理的情況,因?yàn)?,如下所述,將算法設(shè)計(jì)成使得如果出現(xiàn)了該 情況則中斷使能位348總是不活動(dòng)的。
在步驟636之后,NIC發(fā)送數(shù)據(jù)模塊600失活(步驟644)。
如上所述,NIC216知道在步驟632的循環(huán)中可以向發(fā)送事件隊(duì)列318寫入表示M個(gè) 發(fā)送數(shù)據(jù)緩沖區(qū)的完成所需的無論多少個(gè)發(fā)送完成事件,即使無需參照設(shè)備中心發(fā)送事件 隊(duì)列讀指針344。 NIC216知道這是因?yàn)橹鳈C(jī)子系統(tǒng)214不再向發(fā)送緩沖區(qū)鏈表312寫入緩 沖區(qū)描述符,除非在發(fā)送事件隊(duì)列318中用于發(fā)送完成事件的充足數(shù)量的空間已經(jīng)是可用 的,以表示所有未被處理的發(fā)送數(shù)據(jù)緩沖區(qū)的完成。
同樣如上所述,NIC不顯式地通知主機(jī)子系統(tǒng)214已更新的發(fā)送事件隊(duì)列讀指針值, 因?yàn)橹鳈C(jī)不再保持有發(fā)送事件隊(duì)列寫指針的當(dāng)前樣式。主機(jī)不是通過比較在發(fā)送事件隊(duì)列 318中的當(dāng)前讀指針和寫指針,而是通過比較如先前所述的在發(fā)送緩沖區(qū)鏈表312中的主機(jī) 中心讀指針316和寫指針314,來確定在發(fā)送事件隊(duì)列318中的可用空間。
圖7是例示了主機(jī)發(fā)送事件處理器模塊700的相關(guān)功能的流程圖。要么在接收到中斷 時(shí)(步驟710)、要么在步驟636 (圖6)中產(chǎn)生中斷時(shí)、要么在通過輪詢循環(huán)定期地進(jìn)行選 擇時(shí)或者在定時(shí)器到期時(shí)(步驟712)激活模塊700。
初步地,主機(jī)發(fā)送事件處理器執(zhí)行一個(gè)破損安全機(jī)制用來保證主機(jī)子系統(tǒng)214和 NIC216相對(duì)于發(fā)送事件隊(duì)列318的情況正常地運(yùn)行。特別地,在創(chuàng)建時(shí)間,在發(fā)送事件隊(duì) 列318中的所有的條目初始化到"清空狀態(tài)"值。在一個(gè)實(shí)施例中,該清空狀態(tài)是O,而在 另一個(gè)實(shí)施例中,可以使用清空狀態(tài)的不同表示。寫入事件隊(duì)列318的時(shí)間描述符不同于 該清空狀態(tài)。只要從事件隊(duì)列318取出事件并且已處理,主機(jī)子系統(tǒng)214就向事件隊(duì)列的 那些條目中寫入清空狀態(tài)值。隨后,在處理后續(xù)事件之前,主機(jī)子系統(tǒng)214從剛才處理的 條目中重新取出清空狀態(tài)值,并且檢査它是否仍然處于清空狀態(tài)。如果不是,則NIC216已 經(jīng)或者將要使發(fā)送事件隊(duì)列318溢出。如果主機(jī)子系統(tǒng)214和NIC是SW,并且都精確地 遵循這里所述的協(xié)議,這種溢出將永遠(yuǎn)不會(huì)發(fā)生,但是在某些實(shí)施例中,這種破損安全機(jī) 制是需要的。
因此,在步驟714中,主機(jī)子系統(tǒng)214首先在事件隊(duì)列318中的由事件隊(duì)列讀指針320 指定的一個(gè)當(dāng)前位置之前的位置處取出事件描述符。這個(gè)位置是在發(fā)送事件隊(duì)列318中取 出最后的處理事件的位置。在步驟716中,確定事件描述符是否保持在它的清空狀態(tài)。如 果不是,則報(bào)告隊(duì)列溢出狀態(tài)(步驟718)。
如果重新取出的事件描述符保持在它的清空狀態(tài),則在步驟720中,主機(jī)子系統(tǒng)214 在事件隊(duì)列中的由發(fā)送事件隊(duì)列讀指針320指定的位置處取出事件描述符。如果該新事件 處于清空狀態(tài)(步驟722),則發(fā)送事件隊(duì)列318還不是空的。在步驟726中,確定新事件 是否為發(fā)送完成事件。在一個(gè)實(shí)施例中,發(fā)送事件隊(duì)列318不能含有除發(fā)送完成事件以外 的任何事件,但是在另一個(gè)實(shí)施例中它可以如此。由此,如果當(dāng)前事件是除發(fā)送完成事件 以外的事件,如管理事件,則在步驟728中對(duì)其進(jìn)行處理。
如果當(dāng)前事件是發(fā)送完成事件,則依據(jù)該實(shí)施例,它可以指示固定數(shù)量或者可變數(shù)量 的發(fā)送數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)遞送的完成。在任意一種情況中,在步驟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??梢允褂煤笠粰C(jī)制來替代前一機(jī)制,或者連 同前一機(jī)制一起使用后一機(jī)制。
而且,在步驟730中, 一旦主機(jī)已經(jīng)使主機(jī)中心緩沖區(qū)鏈表讀指針316遞增得超過了 特定發(fā)送數(shù)據(jù)緩沖區(qū)描述符,它還將所標(biāo)識(shí)的發(fā)送緩沖區(qū)釋放回庫(kù)中。最終,在更高級(jí)軟 件使用新數(shù)據(jù)重新填充了該緩沖區(qū)之后,主機(jī)會(huì)將數(shù)據(jù)緩沖區(qū)描述符再寫入發(fā)送緩沖區(qū)鏈 表312中以再次使其入隊(duì),以通過NIC216進(jìn)行發(fā)送。
在步驟732中,主機(jī)子系統(tǒng)214清除發(fā)送事件隊(duì)列318中的由當(dāng)前發(fā)送事件隊(duì)列讀指 針標(biāo)識(shí)的位置處的事件描述符,因?yàn)橄惹敖忉尩睦碛?,在步驟734中,主機(jī)子系統(tǒng)214使 發(fā)送事件隊(duì)列讀指針320模數(shù)遞增。然后該模塊返回到步驟720以取出下一事件描述符, 以此類推,直到取出一清空的條目然后該模塊變得不活動(dòng)(步驟724)。
如果在步驟722中確定所取出的下一事件描述符是清空的,則發(fā)送事件隊(duì)列318此時(shí) 不再含有其它待處理事件。在一個(gè)實(shí)施例中,則主機(jī)發(fā)送事件處理器700將變得不活動(dòng), 以等待下一激活觸發(fā)(步驟724)。至少為了隊(duì)列深度管理的目的,不需要主機(jī)子系統(tǒng)214 通知NIC216己更新的主機(jī)中心發(fā)送事件隊(duì)列讀指針,因?yàn)镹IC不是通過將本地的讀、寫 指針與發(fā)送事件隊(duì)列318中的作比較,而是通過主機(jī)不再許可向發(fā)送事件隊(duì)列318寫入比 先前所述的由可用空間積累的發(fā)送描述符更多的發(fā)送事件描述符,來避免發(fā)送隊(duì)列事件318 的溢出。
然而,在一個(gè)優(yōu)選實(shí)施例中,主機(jī)存儲(chǔ)器子系統(tǒng)確實(shí)如此通知NIC216作為如以下更 詳細(xì)地描述的一種管理事件隊(duì)列中斷的手段。因而,在步驟723中,如果主機(jī)中心發(fā)送事 件隊(duì)列讀指針320已發(fā)生了變化,則主機(jī)將所更新的指針值寫入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ì)列操作是類似的,因此這里將略去已經(jīng)描述的操作的某 些方面。在圖8中,主機(jī)接收事件管理模塊從更高級(jí)軟件接收如下指示接收數(shù)據(jù)緩沖區(qū) 410中的新數(shù)據(jù)緩沖區(qū)是空的并且可用于接收數(shù)據(jù)(步驟811)。還響應(yīng)于主機(jī)對(duì)以下描述 的接收緩沖區(qū)鏈表空事件的接收而激活該模塊(步驟810)。還可以在輪詢循環(huán)或定時(shí)器到 期時(shí)定期地激活該模塊(步驟812)。在步驟814中,主機(jī)子系統(tǒng)214確定接收事件隊(duì)列418 中的當(dāng)前可用空間的數(shù)量。與發(fā)送事件隊(duì)列318 —樣,什么時(shí)候去推接收緩沖區(qū)根本地基 于對(duì)于理解本發(fā)明來說不是重要的外界因素。主機(jī)子系統(tǒng)214會(huì)將依據(jù)這些因素所請(qǐng)求的
接收緩沖區(qū)推送到接收緩沖區(qū)鏈表上,但是是有限制的,在這里所述的方式中,保證接收 事件隊(duì)列418不會(huì)溢出。因而,主機(jī)子系統(tǒng)214將不會(huì)讓比在接收事件隊(duì)列418中的由將 要生成的接收完成事件所容納的數(shù)據(jù)緩沖區(qū)數(shù)量多的用來接收數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)排隊(duì)。通 常,通過B、x-z)-y得出用來接收數(shù)據(jù)的,由主機(jī)子系統(tǒng)214排隊(duì)的數(shù)據(jù)緩沖區(qū)的最大量, 其中x是在接收事件隊(duì)列418中的條目的總數(shù),z是可能寫入事件隊(duì)列418的其它類型的事 件的預(yù)定最大量,y是先前排隊(duì)的并且仍然未被處理的接收數(shù)據(jù)緩沖區(qū)的數(shù)量;以及B是 在接收事件隊(duì)列418中由每個(gè)接收完成事件所表示的接收數(shù)據(jù)緩沖區(qū)的最小量。
可以以與關(guān)于上述發(fā)送隊(duì)列的操作的那些描述相似的多種實(shí)施方式那樣構(gòu)建x、 y、 z 和B的值。它們不需要具有相同的值。特別的對(duì)于y,即先前排隊(duì)的并且仍然未被處理的 接收數(shù)據(jù)緩沖區(qū)的數(shù)量,該值不是基于對(duì)接收事件隊(duì)列讀指針和寫指針的任何比較來確定, 而是基于依據(jù)主機(jī)子系統(tǒng)先前已經(jīng)許可的NIC216進(jìn)行寫入的接收事件隊(duì)列條目的數(shù)量的 主機(jī)子系統(tǒng)214的歷史消息,以及依據(jù)主機(jī)子系統(tǒng)己經(jīng)使用的這些接收事件隊(duì)列條目的數(shù) 量的主機(jī)子系統(tǒng)的歷史消息來確定。先前已許可的NIC216進(jìn)行寫入的接收事件隊(duì)列條目的 數(shù)量的主機(jī)歷史消息,可以通過先前排隊(duì)用來接收的接收數(shù)據(jù)緩沖區(qū)的數(shù)量來確定。這樣, 主機(jī)子系統(tǒng)214確定y作為先前排隊(duì)用來接收的數(shù)據(jù)緩沖區(qū)的數(shù)量,小于由接收事件隊(duì)列 418中實(shí)際接收到的接收完成事件所表示的數(shù)據(jù)緩沖區(qū)的數(shù)量。在一個(gè)實(shí)施例中,通過從主 機(jī)中心緩沖區(qū)鏈表寫指針414模數(shù)遞減主機(jī)中心緩沖區(qū)鏈表讀指針416來確定y。
在確定了在接收事件隊(duì)列418中的當(dāng)前可用空間的數(shù)量后,在步驟816,主機(jī)子系統(tǒng) 214確定一個(gè)數(shù)量"M",其為用于排隊(duì)的接收數(shù)據(jù)的可用數(shù)據(jù)緩沖區(qū)的數(shù)量與在步驟814 確定的,可以通過接收事件隊(duì)列418中的可用空間中的接收完成事件來表示的接收數(shù)據(jù)緩 沖區(qū)的最小值,兩者的較小者。
在步驟818中,確定M大于還是等于某個(gè)最小閾值。優(yōu)選地,該最小閾值為l,但是 在其它實(shí)施例中可以選擇較大的數(shù)量作為該閾值。如果M小于該閾值,則主機(jī)接收事件隊(duì) 列管理模塊800僅僅變得不活動(dòng),以等待下一激活事件(步驟830)。
如果M大于或等于最小閾值,則在步驟820中,主機(jī)子系統(tǒng)214 "許可"NIC寫入 M/B個(gè)新接收事件到接收事件隊(duì)列418中。這個(gè)許可通過在接收緩沖區(qū)鏈表412中的待接 收數(shù)據(jù)緩沖區(qū)描述符的寫入而暗含地執(zhí)行,因而要求在I/O總線218上較少或者沒有額外開 銷。特別地,步驟820包括步驟822,在步驟822中主機(jī)子系統(tǒng)214將其主機(jī)中心緩沖區(qū)鏈 表寫指針414更新(模數(shù)遞增)M個(gè)條目。在步驟824中,以先前(在步驟822之前)由
主機(jī)中心緩沖區(qū)鏈表寫指針414指定的條目為起點(diǎn),主機(jī)子系統(tǒng)214將M個(gè)可用接收數(shù)據(jù) 緩沖區(qū)描述符寫入接收緩沖區(qū)鏈表412中。同在發(fā)送端一樣,主機(jī)中心緩沖區(qū)鏈表寫指針 的更新先于M個(gè)接收數(shù)據(jù)緩沖區(qū)描述符的隊(duì)列,為了避免產(chǎn)生一種競(jìng)爭(zhēng)狀況,因?yàn)檫@種競(jìng) 爭(zhēng)狀況,主機(jī)子系統(tǒng)214在對(duì)新接收數(shù)據(jù)緩沖區(qū)描述符排隊(duì)后會(huì)變成隱藏的,并且NIC在 主機(jī)214返回更新讀指針前將接收數(shù)據(jù)寫入這些緩沖區(qū)。在步驟826中,主機(jī)子系統(tǒng)214 將更新后的寫指針通知給NIC216,并且在步驟828中,NIC216更新它自己的設(shè)備中心緩 沖區(qū)鏈表寫指針424。在一個(gè)實(shí)施例中,將步驟826與828組合成單個(gè)步驟,在該步驟中, 主機(jī)子系統(tǒng)214將更新后的寫指針寫入設(shè)備中心接收緩沖區(qū)鏈表寫指針424的一個(gè)存儲(chǔ)器 映射位置中。
在步驟830中,主機(jī)接收事件隊(duì)列管理模塊變得不活動(dòng),以等待下一激活事件??梢?看出,NIC216,通過到接收緩沖區(qū)鏈表412的設(shè)備中心讀指針426和寫指針424間的模數(shù) 差異暗含地知道接收事件隊(duì)列418中的空間的可用性。NIC知道可以將那么多接收事件寫 入接收事件隊(duì)列418中而不會(huì)溢出,因?yàn)橹鳈C(jī)子系統(tǒng)214不將緩沖區(qū)描述符寫入接收緩沖 區(qū)鏈表412中,除非在接收事件隊(duì)列418中的已經(jīng)有可用的空間來提供任何作為結(jié)果的接 收完成事件。
圖9是例示了當(dāng)從網(wǎng)絡(luò)212接收到數(shù)據(jù)時(shí)在NIC216上發(fā)起的功能的流程圖。將輸入 數(shù)據(jù)置于RX FIFO440中,當(dāng)達(dá)到高水位標(biāo)時(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取出下一接收數(shù)據(jù)緩沖區(qū)的描述符,并從由設(shè)備中心緩沖區(qū)鏈 表讀指針426指定的接收緩沖區(qū)鏈表412的條目起進(jìn)行偏移。在步驟914中,NIC216對(duì)它 的設(shè)備中心緩沖區(qū)鏈表讀指針進(jìn)行更新(模數(shù)遞增)。此時(shí)NIC不將新的讀指針通知給主機(jī) 214,因?yàn)槿缦滤鰧⑼ㄟ^事件遞送隱式或顯式地進(jìn)行該通知。
在步驟916中,以所指定的偏移量為起點(diǎn),NIC216將輸入包的數(shù)據(jù)寫入由取出的描述 符所指定的接收數(shù)據(jù)緩沖區(qū)中。通過DMA繼續(xù)進(jìn)行寫入,直到達(dá)到當(dāng)前數(shù)據(jù)緩沖區(qū)的末端 或達(dá)到輸入數(shù)據(jù)包的末端,或這兩者。
同在發(fā)送端一樣,當(dāng)NIC216認(rèn)為它已經(jīng)取回并且已經(jīng)使用接收隊(duì)列中的最后的描述 符時(shí),NIC216檢測(cè)并且報(bào)告隊(duì)列空警報(bào)。該警報(bào)與接收完成事件組合成單一事件描述符,
從而進(jìn)一步使I/O總線218的使用得到優(yōu)化。
特別地,NIC216確定在步驟918中它是否認(rèn)為是通過在步驟628己經(jīng)使用的在接收緩 沖區(qū)鏈表412中的一個(gè)描述符所標(biāo)識(shí)的最后的接收緩沖區(qū)。NIC216可以通過將其設(shè)備中心 緩沖區(qū)鏈表讀指針426與其設(shè)備中心緩沖區(qū)鏈表寫指針424進(jìn)行對(duì)比來對(duì)此進(jìn)行確定。若 否,即NIC知道在接收緩沖區(qū)鏈表中有更多的接收緩沖區(qū)描述符,則不需要警報(bào),并且在 步驟920中,NIC確定是否到達(dá)了包末端。若否,則NIC接收數(shù)據(jù)模塊900返回到步驟912, 以取出下一接收數(shù)據(jù)緩沖區(qū)的描述符。在本實(shí)施例中不斷言任何事件以表示"接收數(shù)據(jù)緩 沖區(qū)己滿"?;谠诮邮站彌_區(qū)鏈表412中以主機(jī)中心RX隊(duì)列讀指針為起點(diǎn)的連續(xù)標(biāo)識(shí)的 多個(gè)接收數(shù)據(jù)緩沖區(qū),主機(jī)214將獲知哪個(gè)接收數(shù)據(jù)緩沖區(qū)是滿的。
如果步驟920確定已到達(dá)包末端,則在步驟922中NIC216斷言一接收完成事件,以 覆蓋含有來自包的數(shù)據(jù)的所有接收數(shù)據(jù)緩沖區(qū)。同在發(fā)送一樣,接收完成事件描述符格式 包括接收描述符隊(duì)列空旗標(biāo)("rx—desc—q_empty"),但是在步驟922中寫入的接收完成事件 中,該旗標(biāo)不被置位,因?yàn)镹IC已經(jīng)確定(在步驟918中)附加接收緩沖區(qū)描述符保存在 接收緩沖區(qū)鏈表412中。注意,在本實(shí)施例中,即使包數(shù)據(jù)跨過接收數(shù)據(jù)緩沖區(qū)410中的 多個(gè)緩沖區(qū),也只斷言一個(gè)接收完成事件。由接收緩沖區(qū)鏈表412中的多個(gè)連續(xù)條目將多 個(gè)緩沖區(qū)鏈接在一起。還要注意,如果包末端與接收緩沖區(qū)的末端不相一致,則保留緩沖 區(qū)中的剩余空間,而不使用它。
返回到步驟918,如果NIC216認(rèn)為已經(jīng)在步驟912中提取了由接收緩沖區(qū)鏈表412 中的描述符所標(biāo)識(shí)的最后的接收數(shù)據(jù)緩沖區(qū),則NIC在報(bào)告接收完成事件之前不再等候到 包末端。取而代之,在步驟924中,NIC斷言一接收完成事件,以覆蓋含有來自包的數(shù)據(jù) 的所有接收數(shù)據(jù)緩沖區(qū)。在該接收完成事件中,rx_deSC—CLempty旗標(biāo)被置位。如果當(dāng)這個(gè) 發(fā)生時(shí),包數(shù)據(jù)仍在NIC的RX FIFO440中,則該包數(shù)據(jù)丟失。主機(jī)子系統(tǒng)214可以通過 將在接收完成事件描述符中(總是含有全包的字節(jié)計(jì)數(shù))的接收包字節(jié)計(jì)數(shù)字段與由接收 完成事件覆蓋的接收數(shù)據(jù)緩沖區(qū)中的字節(jié)的數(shù)量進(jìn)行比較,來檢測(cè)包數(shù)據(jù)的丟失。同在發(fā) 送端一樣,主機(jī)(在一個(gè)實(shí)施例中)知道由接收完成事件覆蓋的接收數(shù)據(jù)緩沖區(qū)是由在接 收緩沖區(qū)鏈表412中的描述符標(biāo)識(shí)的、以由主機(jī)中心緩沖區(qū)鏈表讀指針416指向的條目為 起點(diǎn)并在由主機(jī)中心緩沖區(qū)鏈表寫指針414指向的條目之前終止的那些接收數(shù)據(jù)緩沖區(qū)。 在另一實(shí)施例中,類似于如上所述的關(guān)于發(fā)送端一樣,通過在接收完成事件描述符格式中 包括一附加字段以含有如在步驟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ì)接收完成事件批處理是 更加困難的,因?yàn)镹IC可以相對(duì)于接收緩沖區(qū)在接收緩沖區(qū)鏈表412中放置的次序,不連 續(xù)地填充接收緩沖區(qū)。也就是,NIC可以用來自網(wǎng)絡(luò)端口 1的部分包來填充由接收緩沖區(qū)N 標(biāo)識(shí)的緩沖區(qū),接著用來自網(wǎng)絡(luò)端口 2的完整包來填充由接收緩沖區(qū)N+1標(biāo)識(shí)的緩沖區(qū)。 來自網(wǎng)絡(luò)1包的進(jìn)一步的數(shù)據(jù)將進(jìn)入后續(xù)數(shù)據(jù)緩沖區(qū)。如果在該實(shí)施例中將要批處理接收 完成事件,則NIC可以在斷言針對(duì)用于來自網(wǎng)絡(luò)端口 1的包的完成事件之前斷言針對(duì)來自 網(wǎng)絡(luò)端口 2的包的完成事件。如果NIC的針對(duì)來自網(wǎng)絡(luò)端口 2的包的接收完成事件要包括 它的已更新的接收緩沖區(qū)鏈表讀指針以指示已使用的最后的描述符,并且如果接收完成事 件是表示由接收緩沖區(qū)鏈表412中的多個(gè)描述符標(biāo)識(shí)的、以由主機(jī)中心緩沖區(qū)鏈表讀指針 416指向的條目為起點(diǎn)并在由接收完成事件描述符中的設(shè)備中心接收緩沖區(qū)鏈表讀指針指 向的條目終止的所有的數(shù)據(jù)緩沖區(qū)的完成,則主機(jī)可能錯(cuò)誤地認(rèn)為由接收描述符N標(biāo)識(shí)的 緩沖區(qū)和由接收描述符N+1標(biāo)識(shí)的緩沖區(qū)含有來自相同包的數(shù)據(jù)。
為了避免這種情形,該實(shí)施例并不批處理接收完成事件。接收完成事件不表示一個(gè)以 上接收數(shù)據(jù)緩沖區(qū)的完成。該實(shí)施例支持標(biāo)準(zhǔn)大小數(shù)據(jù)包(其中數(shù)據(jù)包具有相對(duì)小的最長(zhǎng) 長(zhǎng)度并且所述多個(gè)接收數(shù)據(jù)緩沖區(qū)至少與該最大數(shù)據(jù)包長(zhǎng)度一樣大)和"特大"數(shù)據(jù)包(其 中數(shù)據(jù)包可以更長(zhǎng)并且可以跨過一個(gè)以上數(shù)據(jù)緩沖區(qū))。給定的接收隊(duì)列要么是標(biāo)準(zhǔn)模式的 要么是特大模式的。如果該隊(duì)列是標(biāo)準(zhǔn)模式的,則不存在錯(cuò)誤,每個(gè)已充滿接收數(shù)據(jù)緩沖 區(qū)都將含有一包末端,因此沒有接收完成事件會(huì)表示一個(gè)以上數(shù)據(jù)緩沖區(qū)的完成,因而不 會(huì)出現(xiàn)問題。如果隊(duì)列是特大模式的,則還是該情況,即沒有接收完成事件會(huì)表示一個(gè)以 上數(shù)據(jù)緩沖區(qū)的完成,因?yàn)閷?duì)于NIC填充的每個(gè)數(shù)據(jù)緩沖區(qū),它寫入一接收完成事件。該 接收完成事件格式包括"RX—Jumbo_Cont"位,NIC對(duì)該位置位以通知主機(jī)子系統(tǒng)主體 數(shù)據(jù)緩沖區(qū)不含有包末端(即,將存在延續(xù)緩沖區(qū))。因而該實(shí)施例不對(duì)接收完成事件進(jìn)行 批處理。接收完成事件還包括NIC的已更新設(shè)備中心接收緩沖區(qū)鏈表讀指針426的復(fù)本, 該指針現(xiàn)在指向來自接收緩沖區(qū)鏈表412的特定描述符,對(duì)于該特定描述符的數(shù)據(jù)緩沖區(qū), 所述事件表示完成。接收完成事件格式還表示從其接收了包的NIC端口號(hào)。
回到圖9的實(shí)施例,在步驟924和922之后, 一旦NIC已經(jīng)斷言一接收完成事件,NIC接收數(shù)據(jù)模塊900就回到不活動(dòng)狀態(tài)(步驟926)。
在步驟924和922中,NIC斷言含有特定信息的接收完成事件。圖10是該步驟的流程 圖詳情。在步驟1010中,以由設(shè)備中心接收事件隊(duì)列寫指針標(biāo)識(shí)的條目為起點(diǎn),NIC216 將該接收完成事件寫入接收事件隊(duì)列418中。在步驟1012中,NIC216相應(yīng)地更新它自己 的接收事件隊(duì)列寫指針。如上所述,NIC216知道可以向接收事件隊(duì)列418寫入,能夠表示 M個(gè)接收數(shù)據(jù)緩沖區(qū)的完成所需的任意數(shù)量的接收完成事件,甚至無需參照設(shè)備中心接收 事件隊(duì)列讀指針444。 NIC216知道這是因?yàn)橹鳈C(jī)子系統(tǒng)214不再向接收緩沖區(qū)鏈表412寫 入緩沖區(qū)描述符,除非在發(fā)送事件隊(duì)列418中用于接收完成事件的充足數(shù)量的空間已經(jīng)是 可用的,以表示所有未被處理的接收數(shù)據(jù)緩沖區(qū)的完成。
同樣如上所述,NIC不顯式地通知主機(jī)子系統(tǒng)214己更新的接收事件隊(duì)列讀指針值, 因?yàn)橹鳈C(jī)不再保持有接收事件隊(duì)列寫指針的本地版本。主機(jī)不是通過比較在接收事件隊(duì)列 418中的當(dāng)前讀指針和寫指針,而是通過比較如先前所述的在接收緩沖區(qū)鏈表412中的主機(jī) 中心讀指針416和寫指針414,來確定在接收事件隊(duì)列418中的可用空間。然而,同在發(fā)送端一樣,在步驟1012中對(duì)設(shè)備中心接收事件隊(duì)列寫指針432的 更新可能會(huì)導(dǎo)致產(chǎn)生一中斷(步驟1014)以激活參照?qǐng)D11討論的主機(jī)接收事件處理器。如 可以從圖4中的邏輯看到的。如果設(shè)備中心接收事件隊(duì)列寫指針432先前等于設(shè)備中心接 收事件隊(duì)列讀指針444,則在步驟634中進(jìn)行的更新會(huì)導(dǎo)致比較器446進(jìn)行輸出以過渡到活 動(dòng)狀態(tài)。如果在出現(xiàn)該情況時(shí)中斷使能位448是有效的,則中斷發(fā)生器452將產(chǎn)生中斷。 如果在步驟634中進(jìn)行更新時(shí)所述讀指針和寫指針先前不相等,則不會(huì)產(chǎn)生新的中斷,因 為比較器446輸出將已經(jīng)處于活動(dòng)狀態(tài)。同發(fā)送端一樣,邏輯450需要處理其中對(duì)寫指針 432的更新導(dǎo)致比較器446過渡到不活動(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í)、要么在通過輪詢循環(huán)定期地 進(jìn)行選擇時(shí)或者在定時(shí)器到期時(shí)(步驟1112)激活模塊IIOO。
最初,主機(jī)接收事件處理器執(zhí)行一個(gè)與在發(fā)送端執(zhí)行的相同的破損安全機(jī)制,用來保 證主機(jī)子系統(tǒng)214和NIC216相對(duì)于接收事件隊(duì)列418的情況正常地運(yùn)行。從而在創(chuàng)建時(shí)間, 在接收事件隊(duì)列418中的所有的條目初始化到清空狀態(tài)值。在步驟1114中,主機(jī)子系統(tǒng)214 首先在接收事件隊(duì)列418中的由事件隊(duì)列讀指針420指定的一個(gè)當(dāng)前位置之前的位置處取
出事件描述符,并且在步驟1116中,確定事件描述符是否保持在它的清空狀態(tài)。若否,則 報(bào)告隊(duì)列溢出狀態(tài)(步驟1118)。
如果重新取出的事件描述符保持在它的清空狀態(tài),則在步驟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)前事件是接收完成事件,則在步驟1140中,主機(jī)214確定是否對(duì)"接收緩沖區(qū) 鏈表空"旗標(biāo)置位。如果是,則該模塊(在步驟1142中)觸發(fā)主機(jī)接收事件隊(duì)列管理模塊 800,以用附加接收數(shù)據(jù)緩沖區(qū)補(bǔ)充接收緩沖區(qū)鏈表412。在步驟1144中,主機(jī)214進(jìn)一步 確定是否有任何的多種錯(cuò)誤類型由接收完成事件描述符表示。如果有,則在步驟1146中, 主機(jī)214對(duì)錯(cuò)誤進(jìn)行處理。注意,事實(shí)上可以在步驟1140的接收緩沖區(qū)鏈表空測(cè)試前后檢 測(cè)在步驟1144中所包括的某些錯(cuò)誤類型,某些可能準(zhǔn)備暫時(shí)繞開接收緩沖區(qū)鏈表412中的 接收緩沖區(qū)描述符的補(bǔ)充(由步驟1142觸發(fā)的),并且某些可能繞開在歩驟1148中對(duì)數(shù)據(jù) 包的處理。對(duì)于本發(fā)明的理解來說這些錯(cuò)誤處理的詳情是不重要的。
在步驟1148中,假如沒有檢測(cè)出嚴(yán)重的錯(cuò)誤,則主機(jī)214對(duì)新接收的包數(shù)據(jù)進(jìn)行處理。 這可能需要將由多個(gè)連續(xù)接收緩沖區(qū)鏈表?xiàng)l目指定的幾個(gè)接收數(shù)據(jù)緩沖區(qū)順序地鏈接起 來。主機(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ū)釋放回庫(kù)中,以最 終將它們?cè)賹懭虢邮站彌_區(qū)鏈表412中以由不同的輸入包數(shù)據(jù)來再使用。
在步驟1150中,如果更高級(jí)軟件被如此地設(shè)計(jì),則主機(jī)子系統(tǒng)214可以使用新的可用 接收數(shù)據(jù)緩沖區(qū)的描述符對(duì)由主機(jī)中心緩沖區(qū)鏈表讀指針416指向的接收緩沖區(qū)鏈表412 條目進(jìn)行再編程,并且可以對(duì)于直到但不包括指向下一接收包的數(shù)據(jù)的起點(diǎn)的所有連續(xù)的 后續(xù)接收緩沖區(qū)鏈表?xiàng)l目進(jìn)行同樣的處理。在步驟1130中,主機(jī)子系統(tǒng)214使接收緩沖區(qū) 鏈表412的主機(jī)中心緩沖區(qū)鏈表讀指針416模數(shù)遞增在當(dāng)前接收完成事件中表示的緩沖區(qū) 數(shù)量。同在發(fā)送端一樣,這是主機(jī)子系統(tǒng)214借以知道NIC216已經(jīng)更新了它自己的設(shè)備中心緩沖區(qū)鏈表讀指針426的機(jī)制。然而,在一實(shí)施例中,NIC可以在接收完成事件中顯式 地指定它的已更新設(shè)備中心緩沖區(qū)鏈表讀指針426。可以使用后一機(jī)制來替代前一機(jī)制,或 者連同前一機(jī)制一起使用后一機(jī)制。
在步驟1132中,因?yàn)橄惹敖忉尩拿枋銎茡p安全的理由,主機(jī)子系統(tǒng)214清除接收事件 隊(duì)列418中的由當(dāng)前接收事件隊(duì)列讀指針標(biāo)識(shí)的位置處的事件描述符,并且在步驟1134中, 主機(jī)子系統(tǒng)214使接收事件隊(duì)列讀指針420模數(shù)遞增。然后該模塊返回到步驟1120以取出 下一事件描述符,以此類推,直到取出一清空的條目然后該模塊變得不活動(dòng)(步驟1124)。
如果在步驟1122中確定所取出的下一事件描述符是清空的,則接收事件隊(duì)列418此時(shí) 不再含有其它待處理事件。在一個(gè)實(shí)施例中,則主機(jī)接收事件處理器1100將只變得不活動(dòng), 以等待下一激活觸發(fā)(步驟1124)。至少為了隊(duì)列深度管理的目的,不需要主機(jī)子系統(tǒng)214 通知NIC216已更新的主機(jī)中心接收事件隊(duì)列讀指針,因?yàn)镹IC避免接收隊(duì)列事件418的 溢出,不是通過比較在接收事件隊(duì)列418中的當(dāng)前讀指針和寫指針,而是通過主機(jī)不許可 向接收事件隊(duì)列418寫入比先前所述的可用空間可容納的接收事件描述符更多的接收事件 描述符。
然而,在一個(gè)優(yōu)選實(shí)施例中,主機(jī)存儲(chǔ)器子系統(tǒng)確實(shí)如此通知NIC216作為如以下更 詳細(xì)地描述的一種管理事件隊(duì)列中斷的手段。因而,在步驟1123中,如果主機(jī)中心接收事 件隊(duì)列讀指針420已發(fā)生了變化,則主機(jī)將所更新的指針值寫入NIC的設(shè)備中心接收事件 隊(duì)列讀指針中。然后在步驟1124中主機(jī)接收事件處理器IIOO變得不活動(dòng)。
中斷管理
如上所述,盡管在一個(gè)實(shí)施例中可以利用本發(fā)明的通過永遠(yuǎn)不更新在主機(jī)存儲(chǔ)器子系 統(tǒng)222中或在NIC設(shè)備216上的事件隊(duì)列讀指針或?qū)懼羔樀挠跋駨?fù)本的方面,根據(jù)具體情 況而定,在另一個(gè)實(shí)施例中,NIC216事實(shí)上確實(shí)保持有針對(duì)發(fā)送事件隊(duì)列318和接收事件 隊(duì)列418中的每一個(gè)的設(shè)備中心事件隊(duì)列讀指針344或444。然而,如下所述,將這些讀指 針只用于中斷管理;NIC216確實(shí)不應(yīng)用它們用于事件隊(duì)列深度管理。而且,在一個(gè)實(shí)施例 中,僅在主機(jī)子系統(tǒng)214的選擇下將它們用于中斷管理。出于下述原因,主機(jī)可以只使用 設(shè)備中心接收事件隊(duì)列讀指針444,而設(shè)備中心發(fā)送事件隊(duì)列讀指針344完全不被使用。在 這種實(shí)施例中,主機(jī)永遠(yuǎn)將都不將事件隊(duì)列讀指針更新寫入設(shè)備中心發(fā)送事件隊(duì)列讀指針 344中(g卩,略去圖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ì)列讀指針寫入NIC216上的設(shè)備中心接收 事件隊(duì)列讀指針444中(步驟1123)。在圖15中將該步驟示為步驟1508。通過寫入這種值, 主機(jī)將它的觀點(diǎn)指示給NIC:接收事件隊(duì)列418現(xiàn)在是空的。如果NIC216的觀點(diǎn)是真實(shí)的, 則設(shè)備中心接收事件隊(duì)列讀指針434和寫指針432現(xiàn)在是相等的。在步驟1510中NIC由此 (通過比較器446)將這兩個(gè)值進(jìn)行比較,如果它們相等,則NIC還通過將中斷使能位418 設(shè)置為它的活動(dòng)狀態(tài)來再使能用于接收事件隊(duì)列418的中斷(步驟1512)。響應(yīng)于對(duì)設(shè)備中 心接收事件隊(duì)列讀指針的更新并且與該更新原子地發(fā)生對(duì)中斷的再使能;對(duì)這種更新值的 寫入構(gòu)成了單個(gè)組合指令,以使用該新值來更新設(shè)備中心接收事件隊(duì)列讀指針并再使能中
斷。在使能了中斷的情況下,NIC216上的接收事件隊(duì)列中斷管理模塊接著變得不活動(dòng)(步 驟1514),直到NIC將新接收完成事件寫入接收事件隊(duì)列418中(步驟1010)并相應(yīng)地更 新設(shè)備中心接收事件隊(duì)列寫指針432 (步驟1012)。設(shè)備中心接收事件隊(duì)列讀指針444與寫 指針432此時(shí)不相等,然后在步驟1516中,由于從步驟1512起一直使能了中斷,因此NIC 接收數(shù)據(jù)模塊產(chǎn)生一中斷以激活圖11的主機(jī)接收事件處理器(如在步驟1014中闡述的)。 NIC216還通過對(duì)中斷使能位448進(jìn)行再設(shè)置來原子地禁用(抑制)其它接收事件隊(duì)列中斷 生成,從而在不產(chǎn)生其它中斷的情況下臨時(shí)地允許NIC接收數(shù)據(jù)模塊將附加事件寫入接收 事件隊(duì)列418中。然后接收事件隊(duì)列中斷管理模塊回到步驟1508,等待由主機(jī)進(jìn)行地對(duì)另 一已更新接收事件隊(duì)列讀指針的下一寫入。當(dāng)發(fā)生該下一寫入時(shí),如前所述,NIC再次針 對(duì)相等性將設(shè)備中心讀指針與寫指針進(jìn)行比較(步驟1510),并再次在禁用中斷的情況下進(jìn) 行等待,直到NIC將另一事件寫入接收事件隊(duì)列418中(步驟1514)。
如果在步驟1510中NIC216確定設(shè)備中心事件隊(duì)列讀指針與寫指針不相等,則這表示 NIC216未共享主機(jī)的接收事件隊(duì)列418現(xiàn)在是空的這一觀點(diǎn)。這可能會(huì)在如下情況下發(fā)生 例如,如果NIC處于正在將更多接收完成事件寫入接收事件隊(duì)列418的過程中(NIC接收 數(shù)據(jù)模塊的步驟1010),同時(shí)在主機(jī)接收事件處理器的步驟1122中主機(jī)確定下一取出的事 件描述符是空的。如果出現(xiàn)了該競(jìng)爭(zhēng)狀態(tài),則NIC216通過在步驟1510中確定所述兩個(gè)指
針不相等(B卩,設(shè)備中心接收事件隊(duì)列寫指針432在設(shè)備中心接收事件隊(duì)列讀指針444之 前)將檢測(cè)到該競(jìng)爭(zhēng)狀態(tài)。在此情況下NIC將使中斷被禁用,并將立即產(chǎn)生另一個(gè)中斷以 激活主機(jī)接收事件處理器(步驟1518)。這將給予主機(jī)這樣一個(gè)機(jī)會(huì),g卩,當(dāng)主機(jī)在步驟 1122中不正確地確定接收事件隊(duì)列418是空的時(shí),它可以處理正在處理中的事件。
注意,NIC接收數(shù)據(jù)模塊可以繼續(xù)將更多個(gè)事件寫入接收事件隊(duì)列418中,并且如果 在步驟1122中主機(jī)接收事件處理器檢測(cè)它們,則將處理它們。如果在主機(jī)下一次向NIC寫 入已更新的接收事件隊(duì)列讀指針時(shí)(步驟1123)這些附加事件的任何一個(gè)仍然未被處理, 則在步驟1510中將再次檢測(cè)到該新競(jìng)爭(zhēng)狀態(tài),還產(chǎn)生另一中斷;以此類推。
如果在特定實(shí)施例中在發(fā)送端使用事件隊(duì)列中斷管理模塊,則針對(duì)發(fā)送類似地實(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),并且無論寫/讀指針比較器346的輸出如何,中斷發(fā)生器352都不產(chǎn)生中 斷。取而代之,只在定時(shí)器到期時(shí)或在設(shè)備驅(qū)動(dòng)器中通過輪詢循環(huán)進(jìn)行選擇時(shí)激活主機(jī)發(fā) 送事件處理器700 (步驟712)。這允許主機(jī)子系統(tǒng)針對(duì)何時(shí)和以何頻度輪詢發(fā)送事件隊(duì)列 418中的新事件進(jìn)行它自己的軟件型判決,而不是由NIC產(chǎn)生的中斷來支配。
在許多實(shí)施例中,在步驟1512和1516中對(duì)中斷的使能和禁用不必總體地作為應(yīng)用于 整個(gè)外設(shè)216的功能。例如,可以通過掩蓋機(jī)制實(shí)現(xiàn)該功能。在該意義下,這里使用的術(shù) 語禁用和使能與諸如對(duì)中斷的掩蓋和解掩蓋、以及對(duì)中斷的許可和抑制是可互換的。此外, 典型地,由于主機(jī)事件處理器在將它自己的已更新事件隊(duì)列讀指針寫入NIC216之后通常失 活(見圖ll,步驟1124),等待再激活新中斷(步驟1110),因此也可以將對(duì)事件隊(duì)列讀指 針的寫入視為中斷請(qǐng)求。這里在使能中斷與中斷請(qǐng)求之間沒有區(qū)別。
多重隊(duì)列實(shí)施例
本發(fā)明在網(wǎng)絡(luò)接口架構(gòu)中尤其有用,在網(wǎng)絡(luò)接口架構(gòu)中,協(xié)議棧的部分位于操作系統(tǒng) 內(nèi)核和傳輸庫(kù)中,以由用戶級(jí)應(yīng)用直接調(diào)用。在2004年4月12日提交的英國(guó)專利公報(bào) No.GB0408876A0 (標(biāo)題為"User-level Stack")中描述了這樣一種架構(gòu)的示例,通過引用將其并入于此。在這種架構(gòu)中,可以支持各種協(xié)議棧,每種協(xié)議棧都帶有它自己的發(fā)送和接 收數(shù)據(jù)結(jié)構(gòu)組,并且所有協(xié)議棧都由在NIC上的硬件中執(zhí)行的功能來協(xié)助。
圖12是其中通過NIC1210上的硬件協(xié)助來支持多個(gè)協(xié)議棧的系統(tǒng)的簡(jiǎn)化框圖。 NIC1210不僅包括常規(guī)硬件NIC部分1212,而且包括多個(gè)"虛擬"NIC部分(VNIC) 1214。 對(duì)于操作系統(tǒng)來說,NIC1210看起來是具有兩個(gè)設(shè)備驅(qū)動(dòng)器的雙功能設(shè)備與常規(guī)NIC部 分1212相通信的常規(guī)設(shè)備驅(qū)動(dòng)器1216,和與VNIC1214相通信的用戶設(shè)備驅(qū)動(dòng)器1218。 一般來講,由內(nèi)核1220中的常規(guī)協(xié)議棧(未示出)使用常規(guī)設(shè)備驅(qū)動(dòng)器1216,由多個(gè)用戶 級(jí)協(xié)議棧1222中的每一個(gè)來使用用戶設(shè)備驅(qū)動(dòng)器1218。為多個(gè)用戶級(jí)應(yīng)用(或處理)1224 中的每一個(gè)創(chuàng)建獨(dú)立用戶專用協(xié)議棧1222。用戶級(jí)應(yīng)用可以通過呼叫內(nèi)核1220與網(wǎng)絡(luò)212 相通信,但是優(yōu)選地它們通過它們的相應(yīng)用戶級(jí)協(xié)議棧1222與網(wǎng)絡(luò)212相通信。
圖12的系統(tǒng)比圖3和4的系統(tǒng)更復(fù)雜,但是對(duì)于各單個(gè)發(fā)送或接收隊(duì)列,操作是類似 的。在這兩個(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ù)并散布開來的。在圖13中,將組成發(fā)送數(shù)據(jù)緩沖區(qū)310的緩沖區(qū) 標(biāo)識(shí)為"TX DATABUF #n",將組成發(fā)送緩沖區(qū)鏈表312的緩沖區(qū)標(biāo)識(shí)為"TX QUEUE BUF #n"。將組成發(fā)送事件隊(duì)列318的緩沖區(qū)標(biāo)識(shí)為"TXEV QUEUE BUF #n"。
在一個(gè)實(shí)施例中單個(gè)緩沖區(qū)可以是4k或8k字節(jié)長(zhǎng)度的,并通過緩沖區(qū)描述符表1310 中的多個(gè)物理上連續(xù)的描述符將這些緩沖區(qū)鏈接在一起,成為邏輯上連續(xù)的序列。例如, 一個(gè)發(fā)送隊(duì)列(發(fā)送緩沖區(qū)鏈表312)可能占據(jù)主機(jī)存儲(chǔ)器222中的緩沖區(qū)1312、 1314以 及1316,這些緩沖區(qū)是不連續(xù)的并且可能是存儲(chǔ)器的多個(gè)無序區(qū)。通過緩沖區(qū)描述符表1310 中的多個(gè)物理上連續(xù)的條目1318、 1320以及1322將這些緩沖區(qū)鏈接在一起,成為單個(gè)邏 輯上連續(xù)的空間。由主機(jī)214對(duì)條目1318、 1320以及1322進(jìn)行寫入和管理,并將它們視 為環(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è)條目序列。類似地, 一個(gè)發(fā)送事件隊(duì)列318可能占據(jù)主機(jī)存儲(chǔ)器222中的緩沖區(qū)1326、 1328以及1330。這些緩沖區(qū)是不連續(xù)地并且可能 在主機(jī)存儲(chǔ)器中是無序的,但是通過緩沖區(qū)描述附表1310中的多個(gè)物理上連續(xù)的條目1332、 1334以及1336將這些緩沖區(qū)鏈接在一起,成為單個(gè)邏輯上連續(xù)的環(huán)繞空間。通過"緩沖區(qū) ID"為緩沖區(qū)描述符表1310編索引,此外,其每個(gè)條目還標(biāo)識(shí)了主機(jī)存儲(chǔ)器222中的相對(duì) 應(yīng)的緩沖區(qū)的基地址等。
為了掌握可能同時(shí)與LAN212相通信的許多用戶級(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ì)列、用戶隊(duì)列還是另一種隊(duì)列;
*發(fā)送緩沖區(qū)鏈表312的大小(其可以包含的發(fā)送數(shù)據(jù)緩沖區(qū)描述符的數(shù)量);
*與該發(fā)送隊(duì)列相關(guān)聯(lián)的發(fā)送事件隊(duì)列的ID;
*待作為發(fā)送完成事件的一部分返回給事件隊(duì)列的隊(duì)列"標(biāo)簽";
H亥發(fā)送隊(duì)列的發(fā)送緩沖區(qū)鏈表312中的基緩沖區(qū)的緩沖區(qū)ID;
*指向該發(fā)送隊(duì)列的發(fā)送緩沖區(qū)鏈表312中的設(shè)備中心讀指針326和寫指針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還從同一位置獲得指向到該發(fā)送緩沖區(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的訪問,在一個(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ì)列。如由NIC216觀察到的,在發(fā)送事件隊(duì)列描述符表1342中由 來自發(fā)送隊(duì)列描述附表1340的發(fā)送隊(duì)列ID標(biāo)識(shí)的條目是用于描述該特定發(fā)送事件隊(duì)列318 的狀態(tài)和其它特性的起點(diǎn)。此外,每個(gè)這種條目還都標(biāo)識(shí)了
*該特定發(fā)送事件隊(duì)列318的大小(這就是在主機(jī)的在發(fā)送事件隊(duì)列318中可用空間的 數(shù)量的計(jì)算中使用的x的值);
*組成該特定事件隊(duì)列318的基緩沖區(qū)的緩沖區(qū)ID;
*與圖3的中斷使能位348相對(duì)應(yīng)的char—ev_enable位;
H亥特定事件隊(duì)列318的發(fā)送事件隊(duì)列寫指針332;以及
*該特定事件隊(duì)列318的發(fā)送事件隊(duì)列讀指針。
由此為了將一事件寫入與特定發(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ì)列寫指針332。然后它使 用該基緩沖區(qū)ID作為基,使用發(fā)送事件隊(duì)列寫指針高階位乘以每個(gè)描述符占用的字節(jié)數(shù)作 為偏移量,到緩沖區(qū)描述符表1310中獲得主機(jī)存儲(chǔ)器222中的含有所述特定發(fā)送事件隊(duì)列 318的當(dāng)前條目的緩沖區(qū)的基地址。然后NIC使用該基地址作為基,使用發(fā)送事件隊(duì)列寫 指針低階位作為偏移量,以將希望的事件描述符寫入主機(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、 lk或2k個(gè)發(fā)送數(shù)據(jù)緩沖區(qū)描述符。
圖14是圖12的系統(tǒng)為了支持所述多個(gè)VNIC1214中的每一個(gè)的獨(dú)立接收隊(duì)列而使用 的各種數(shù)據(jù)結(jié)構(gòu)的框圖。該圖類似于發(fā)送端的圖,因此這里不再對(duì)某些類似特征進(jìn)行描述。
與發(fā)送端一樣,所有接收隊(duì)列的接收數(shù)據(jù)緩沖區(qū)410、接收緩沖區(qū)鏈表412以及接收 事件隊(duì)列418都駐留在主機(jī)存儲(chǔ)器222中,并由一般化的多個(gè)緩沖區(qū)組成,在主機(jī)存儲(chǔ)器 222中這些緩沖區(qū)可以是彼此不連續(xù)并散布開來的。在圖14中,將組成接收數(shù)據(jù)緩沖區(qū)410 的緩沖區(qū)標(biāo)識(shí)為"RX DATA BUF #n",將組成接收緩沖區(qū)鏈表412的緩沖區(qū)標(biāo)識(shí)為"TX QUEUE BUF #n"。將組成接收事件隊(duì)列418的緩沖區(qū)標(biāo)識(shí)為"TX EV QUEUE BUF #n"。優(yōu) 選地,將所有協(xié)議棧的發(fā)送事件隊(duì)列318與接收事件隊(duì)列418組合成一個(gè)事件隊(duì)列的總庫(kù)。 即,優(yōu)選地,將發(fā)送事件隊(duì)列描述符表1342和接收事件描述符表1442實(shí)現(xiàn)為僅單個(gè)表。
仍然與發(fā)送端一樣,通過緩沖區(qū)描述符表1410中的多個(gè)物理上連續(xù)的描述符表將單個(gè) 緩沖區(qū)鏈接在一起,成為邏輯上連續(xù)的序列。通過"緩沖區(qū)ID"為緩沖區(qū)描述符表1410 編索引,此外,其每個(gè)條目都標(biāo)識(shí)了主機(jī)存儲(chǔ)器222中的相對(duì)應(yīng)的緩沖區(qū)的基地址。
為了掌握可能同時(shí)與LAN212相通信的許多用戶級(jí)應(yīng)用的多個(gè)接收緩沖區(qū)鏈表和接收 事件隊(duì)列中的每一個(gè)的狀態(tài),與發(fā)送隊(duì)列描述符表1340類似,NIC216包括接收隊(duì)列描述 符表1440和事件隊(duì)列描述符表1442。每個(gè)接收隊(duì)列(包括其接收數(shù)據(jù)緩沖區(qū)、其接收緩沖 區(qū)鏈表以及其接收事件隊(duì)列)都具有相對(duì)應(yīng)的接收隊(duì)列ID,將該接收隊(duì)列ID用作接收隊(duì)列 描述符表1440中的索引。如由NIC216觀察到的,接收隊(duì)列描述符表1440中的指定條目是 用于描述該特定接收隊(duì)列的狀態(tài)和其它特性的起點(diǎn)。每個(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ì)列。如在NIC216觀察到的,在接收事件隊(duì)列描述符表1442中由 來自接收隊(duì)列描述附表1440的接收隊(duì)列ID標(biāo)識(shí)的條目是用于描述該特定接收事件隊(duì)列418 的狀態(tài)和其它特性的起點(diǎn)。每個(gè)這種條目都大致標(biāo)識(shí)了與以上針對(duì)發(fā)送隊(duì)列描述符表1342 中的條目描述的有關(guān)接收隊(duì)列的相同的信息。與發(fā)送端一樣,至少出于事件隊(duì)列深度管理 目的,該信息不必包括任何接收事件隊(duì)列418的設(shè)備中心接收事件隊(duì)列讀指針。
除與發(fā)送端的結(jié)構(gòu)相對(duì)應(yīng)的接收端的結(jié)構(gòu)外,接收端還包括過濾表和邏輯塊1450。由 于NIC216可以支持在用戶級(jí)應(yīng)用1224與LAN212上的遠(yuǎn)程代理之間的多個(gè)同時(shí)連接,并 且由于NIC216支持使用多個(gè)發(fā)送和接收隊(duì)列的這些同時(shí)連接,因此由NIC216執(zhí)行的一個(gè) 功能是將每個(gè)輸入數(shù)據(jù)包導(dǎo)引到正確的接收隊(duì)列。NIC216用以進(jìn)行該確定的機(jī)制對(duì)于本發(fā) 明的理解并不重要,但是需要注意的是,過濾表和邏輯1450保持有在包報(bào)頭信息與目的地 接收隊(duì)列ID之間的對(duì)應(yīng)關(guān)系。由此過濾表和邏輯1450使用輸入包的報(bào)頭信息來確定正確 的目的地接收隊(duì)列的ID,并使用該接收隊(duì)列ID作為對(duì)接收隊(duì)列描述符表1440的索引。如 以上針對(duì)發(fā)送端說明的那樣,接收隊(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開銷。
同樣如上所述,將發(fā)送事件隊(duì)列描述符表1342和接收事件隊(duì)列描述符表1442優(yōu)選地 僅實(shí)現(xiàn)為單個(gè)表。在一個(gè)這種實(shí)施例中,統(tǒng)一的事件隊(duì)列支持多達(dá)4k個(gè)事件隊(duì)列。事件隊(duì) 列0到3專用于最多4個(gè)隊(duì)列,該最多4個(gè)隊(duì)列用于內(nèi)核網(wǎng)絡(luò)接口驅(qū)動(dòng)器(被公知為NET 驅(qū)動(dòng)器)的包傳送,事件隊(duì)列4專用于第二內(nèi)核驅(qū)動(dòng)器(被公知為CHAR驅(qū)動(dòng)器),該第二 內(nèi)核驅(qū)動(dòng)器負(fù)責(zé)總體管理和在所有用戶隊(duì)列與它們相對(duì)應(yīng)的協(xié)議棧之間的協(xié)調(diào)。
事件具有如由事件描述符中的事件代號(hào)字段標(biāo)識(shí)的不同類型。事件描述符的其余字段 取決于事件類型。已經(jīng)描述的兩種事件類型是發(fā)送完成事件和接收完成事件;如前所述, 如分別在發(fā)送隊(duì)列描述符表1340或接收隊(duì)列描述符表1440中設(shè)計(jì)的那樣,將這些事件發(fā) 送給任何事件隊(duì)列。其它事件類型專用于其它非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ā)送給任何用戶事件隊(duì)列。還有的事件是全局事件,CHAR驅(qū)動(dòng)器或內(nèi) 核驅(qū)動(dòng)器可以負(fù)責(zé)處理該全局事件。也可以由CHAR驅(qū)動(dòng)器或NET驅(qū)動(dòng)器來產(chǎn)生事件。 CHAR和NET驅(qū)動(dòng)器可以為任何事件隊(duì)列產(chǎn)生任何希望的類型的事件。
NIC216使用單個(gè)事件FIFO(未示出)來緩沖等待被寫出到存儲(chǔ)器中的事件。事件FIFO 的深度很淺,以確保低潛伏遞送。當(dāng)該FIFO已滿時(shí),所有代理都得到了背壓。另外,由于 從不同資源收集事件,在某些情況下,NIC216能夠積累比在單個(gè)事件描述符中的更多的事 件。如果這樣將出現(xiàn)這種情況,例如,由在單個(gè)事件描述符格式中不同的旗標(biāo)描述的兩個(gè) 不同的事件。這里提及的事件"接合"的步驟,可以幫助減少待寫入主機(jī)存儲(chǔ)器222中的 事件隊(duì)列的事件描述符的數(shù)量。然而,接合的可能性確實(shí)不能減少用于提供發(fā)送或接收完 成事件的事件隊(duì)列的可用空間數(shù)量的主機(jī)子系統(tǒng)的計(jì)算中的值"z",因?yàn)橹鳈C(jī)不能基于任
何接合而執(zhí)行。如上所述,主機(jī)仍然需要確定z,在依靠基于管理事件資源的數(shù)量和每個(gè)這 樣資源可能最后在任何給定點(diǎn)還未被處理的事件的最大量。在另一個(gè)實(shí)施例中,可能會(huì)采 用某一數(shù)量的接合,從而減少z的值。 共享事件隊(duì)列實(shí)施例
在圖3、 4、 13以及14的實(shí)施例中,針對(duì)每個(gè)發(fā)送和接收數(shù)據(jù)隊(duì)列示出獨(dú)立的事件隊(duì) 列。然而,在一優(yōu)選實(shí)施例中,主機(jī)子系統(tǒng)214可以指定單個(gè)事件隊(duì)列來接收關(guān)于若干不 同數(shù)據(jù)隊(duì)列的事件。分配給單個(gè)事件隊(duì)列的數(shù)據(jù)隊(duì)列可以是發(fā)送隊(duì)列、接收隊(duì)列或這兩者。 例如,主機(jī)子系統(tǒng)可能正在進(jìn)行充當(dāng)網(wǎng)絡(luò)212上的若干束TCP連接的端點(diǎn)的程序線程。通 常,該線程針對(duì)各連接束具有獨(dú)立發(fā)送隊(duì)列和獨(dú)立接收隊(duì)列,但是通常僅具有用于接收與 所有這種發(fā)送和接收隊(duì)列有關(guān)的事件的一個(gè)事件隊(duì)列。作為另一示例, 一個(gè)程序線程可能 具有一個(gè)以上事件隊(duì)列,或者幾個(gè)程序線程可能共享一個(gè)事件隊(duì)列。支持所以這些變化。 此外,在多重隊(duì)列實(shí)施例中,同樣將諸如1342和1442的發(fā)送和接收事件隊(duì)列描述符表優(yōu) 選地表現(xiàn)為僅單個(gè)表。
如上所述,特定數(shù)據(jù)隊(duì)列的隊(duì)列描述符表1340或1440 (分別是發(fā)送或接收)中的條 目包括這樣的字段該字段標(biāo)識(shí)了應(yīng)當(dāng)將與所述特定隊(duì)列有關(guān)的事件寫入其中的事件隊(duì)列 ID。當(dāng)NIC216耗用了來自特定數(shù)據(jù)隊(duì)列的發(fā)送或接收數(shù)據(jù)緩沖區(qū)并希望將一完成事件寫入 合適的事件隊(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)來,作為完成事件描述符中的數(shù)據(jù)。典型地,負(fù)責(zé)所述 特定數(shù)據(jù)隊(duì)列的程序線程將向該標(biāo)簽字段寫入該線程可以稍后(當(dāng)接收到完成事件時(shí))使 用的代號(hào),以標(biāo)識(shí)該事件所屬的特定數(shù)據(jù)隊(duì)列ID。
在一共享事件隊(duì)列實(shí)施例中,當(dāng)主機(jī)發(fā)送事件管理模塊確定相關(guān)事件隊(duì)列中的用于接
收引用特定發(fā)送隊(duì)列的完成事件的當(dāng)前有效空間的數(shù)量時(shí),z的值是可以從其他資源寫入到 相關(guān)事件隊(duì)列的事件的最大數(shù)量,其中其他資源包括引用可以被寫入相同相關(guān)事件隊(duì)列的 其他數(shù)據(jù)隊(duì)列的完成事件。同樣地,當(dāng)接收事件管理模塊確定相關(guān)事件隊(duì)列中的用于接收 引用特定接收隊(duì)列的完成事件的當(dāng)前有效空間的數(shù)量時(shí),z的值是可以從其他資源寫入到相 關(guān)事件隊(duì)列的事件的最大數(shù)量,其中其他資源包括引用可以被寫入相同相關(guān)事件隊(duì)列的其 他數(shù)據(jù)隊(duì)列的完成事件。
規(guī)定的另一種方式,如果z被認(rèn)為限制到不是完成事件的事件,則通過B氣x-z)-y得出(如 上闡述)主機(jī)子系統(tǒng)在任何給定時(shí)間排隊(duì)用來發(fā)送或接收的數(shù)據(jù)緩沖區(qū)的最大量,其中,x 在相關(guān)聯(lián)的事件隊(duì)列中的條目的總量,B是可以由在相關(guān)聯(lián)的事件隊(duì)列中的每個(gè)完成事件描 述的數(shù)據(jù)緩沖區(qū)的最小量。然而,z的值是現(xiàn)在將要寫入事件隊(duì)列的未完成事件的最大量,y 是先前排隊(duì)并且仍未被處理的數(shù)據(jù)緩沖區(qū)的總量。7的值是71,^,...^的和,其中每個(gè)yi表示 在與特定事件隊(duì)列相關(guān)聯(lián)的分別不同的數(shù)據(jù)隊(duì)列中先前排隊(duì)的,并且仍然未被處理的數(shù)據(jù)緩 沖區(qū)的數(shù)量。
多重隊(duì)列實(shí)施例中的中斷管理
在多重隊(duì)列實(shí)施例中,如以上針對(duì)簡(jiǎn)化實(shí)施例描述的那樣對(duì)NET內(nèi)核隊(duì)列的中斷進(jìn)行
管理。按硬件而定,要么每個(gè)內(nèi)核隊(duì)列都具有它自己的中斷,要么兩個(gè)或更多個(gè)內(nèi)核隊(duì)列 共享一個(gè)中斷。在后一情況下,共享的中斷激活所有的共享驅(qū)動(dòng)器,這些共享驅(qū)動(dòng)器中的
每一個(gè)快速地確定它是否為負(fù)責(zé)處理該中斷的驅(qū)動(dòng)器。CHAR驅(qū)動(dòng)器也可以與一個(gè)或更多 個(gè)NET隊(duì)列共享中斷。
然而,用戶隊(duì)列不是操作系統(tǒng)的一部分并且不能接收中斷。在本發(fā)明的一個(gè)方面中, 可以通過添加一個(gè)間接層來實(shí)現(xiàn)類似的功能。具體來說,在步驟636 (用于發(fā)送)和1014
(用于接收)中,相應(yīng)的NIC發(fā)送和接收數(shù)據(jù)模塊不直接中斷主機(jī)中的相應(yīng)發(fā)送和接收事 件處理器。相反,它們向CHAR驅(qū)動(dòng)器的事件隊(duì)列寫入"用戶事件隊(duì)列喚醒事件",其包括
(通過事件隊(duì)列ID來)標(biāo)識(shí)需要激活的事件隊(duì)列的字段。在簡(jiǎn)化實(shí)施例中,通過中斷使能 位348、 448來許可中斷;在多事件實(shí)施例中,通過需要激活的用戶級(jí)事件隊(duì)列描述符中的 char_ev—enable位來許可將用戶事件隊(duì)列喚醒事件寫入CHAR驅(qū)動(dòng)器的事件隊(duì)列中。
就CHAR驅(qū)動(dòng)器隊(duì)列忽略它的char一ev—enable位的意義上來說其與用戶級(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í)施例地類似之處在于它仍然包括NIC上的中斷使能位。 使用該位對(duì)中斷的使能和禁用實(shí)質(zhì)上與以上參照?qǐng)D3和4闡述的相同。
因此,連同向CHAR驅(qū)動(dòng)器事件隊(duì)列寫入用戶事件隊(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ì)列的中斷使能位,使得被寫入CHAR事件隊(duì)列中的其它用戶 事件隊(duì)列喚醒事件不會(huì)產(chǎn)生中斷(被寫入CHAR事件隊(duì)列中的其它種類的事件也不會(huì)產(chǎn)生 中斷)。換句話說,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ì)列讀指針寫回NIC216, NIC216 對(duì)它與設(shè)備中心寫指針進(jìn)行比較,以確定是否再使能CHAR驅(qū)動(dòng)器中斷(如果這兩個(gè)指針 相等)或斷言新的中斷(如果這兩個(gè)指針不相等)。由此避免了在下述情況下可能出現(xiàn)的競(jìng) 爭(zhēng)狀態(tài):如果NIC正在將更多用戶事件隊(duì)列喚醒事件寫入CHAR驅(qū)動(dòng)器事件隊(duì)列的過程中, 同時(shí)主機(jī)中的CHAR驅(qū)動(dòng)器確定CHAR驅(qū)動(dòng)器事件隊(duì)列中的下一取出的描述符是空的。
當(dāng)CHAR驅(qū)動(dòng)器事件處理器從CHAR驅(qū)動(dòng)器事件隊(duì)列獲取用戶事件隊(duì)列喚醒事件時(shí), 它進(jìn)行如下操作激活負(fù)責(zé)在用戶事件隊(duì)列喚醒事件中標(biāo)識(shí)的事件隊(duì)列的主機(jī)事件處理器。
在用于中斷隊(duì)列(NET驅(qū)動(dòng)器隊(duì)列和CHAR驅(qū)動(dòng)器隊(duì)列)與用于非中斷隊(duì)列(用戶隊(duì) 列)的中斷管理機(jī)制之間存在兩重性。如上所述,用于中斷隊(duì)列的驅(qū)動(dòng)器使能和禁用(抑 制)特定隊(duì)列的中斷,而用于非中斷隊(duì)列的驅(qū)動(dòng)器使能和禁用NIC對(duì)特定隊(duì)列的喚醒事件 的寫入。這兩個(gè)處理的細(xì)微差異在于,對(duì)于中斷隊(duì)列,缺省狀態(tài)是其中將發(fā)生中斷的狀態(tài); 在不希望發(fā)生中斷的時(shí)段中必須抑制這些中斷。另一方面,對(duì)于非中斷隊(duì)列,缺省狀態(tài)是 其中不寫入喚醒事件的狀態(tài)。必須請(qǐng)求喚醒事件以出現(xiàn)一個(gè)喚醒事件。然而,在這兩種情 況下,在上述實(shí)施例中,使能或禁用中斷的機(jī)制類似于用于使能或禁用喚醒事件的機(jī)制 連同對(duì)中斷/喚醒事件的發(fā)出一起禁用/抑制/扣留它們,并且通過向NIC對(duì)已更新事件隊(duì)列 讀指針的寫入來再使能/允許/請(qǐng)求它們。由此,這里在短語"對(duì)中斷的使能"、"對(duì)中斷的允 許"或"對(duì)中斷的請(qǐng)求"之間沒有區(qū)別。類似地,這里在短語"對(duì)喚醒事件的使能"、"對(duì) 喚醒事件的允許"或"對(duì)喚醒事件的請(qǐng)求"之間沒有區(qū)別。即使在其中用于中斷隊(duì)列的機(jī) 制與用于非中斷隊(duì)列的機(jī)制不相同的實(shí)施例中,這里在這些術(shù)語之中也沒有區(qū)別。
可以看到,即使用戶級(jí)驅(qū)動(dòng)器實(shí)際上不能接收中斷,通過向用于對(duì)中斷進(jìn)行協(xié)調(diào)的 CHAR驅(qū)動(dòng)器發(fā)送喚醒事件而提供的附加間接層也允許用戶級(jí)隊(duì)列及其驅(qū)動(dòng)器按與中斷操 作系統(tǒng)隊(duì)列大致相同的方式進(jìn)行操作。即使在可以接收中斷的多個(gè)驅(qū)動(dòng)器的實(shí)施例中,附 加間接層也是有益的,因?yàn)樗粌H有助于單個(gè)地使各事件隊(duì)列的中斷最小化,而且有助于 整體地使在所有事件隊(duì)列上的中斷最小化。
外設(shè)向中間事件隊(duì)列寫入事件("參考"事件)、調(diào)用中間事件隊(duì)列處理器以針對(duì)不同 的("被參考")事件隊(duì)列執(zhí)行功能的技術(shù)并不限于用于激活有意阻斷對(duì)喚醒事件的等待的 參考隊(duì)列的處理器的喚醒事件。也不限于其中中間隊(duì)列是中斷隊(duì)列而參考隊(duì)列不是中斷隊(duì) 列的情況。作為示例,在2004年2月3日提交的英國(guó)專利公報(bào)No.0404696.7 (標(biāo)題為"Dual Driver Interface",通過應(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í)體來處理的中斷,網(wǎng)絡(luò)接口驅(qū)動(dòng)器向另一隊(duì)列(優(yōu)選地,控制通道 的隊(duì)列)發(fā)出事件(可優(yōu)選地,帶有相關(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í)體)布置成通過訪問并釋放所表示的隊(duì)列對(duì)這種消 息進(jìn)行響應(yīng)。可以顯見對(duì)中間隊(duì)列技術(shù)的許多其它使用。取決于所表示的隊(duì)列變得停滯的 原因,可能存在如下情況當(dāng)前己釋放事件隊(duì)列的處理器接著可以取出并處理隊(duì)列上的一 個(gè)或更多個(gè)事件。
避免中斷假警報(bào)
某些I/0總線(如PCI2.0和PCI-X)支持電平觸發(fā)中斷,在電平觸發(fā)中斷中,外設(shè)通 過使信號(hào)線進(jìn)入活動(dòng)狀態(tài)來產(chǎn)生中斷。在使用電平觸發(fā)中斷的系統(tǒng)中,存在可以產(chǎn)生"假 警報(bào)"中斷的邊界條件。考慮如下情況外設(shè)通過使中斷信號(hào)線進(jìn)入其活動(dòng)電平來產(chǎn)生其 中斷,并且只在接收到來自主機(jī)的中斷確認(rèn)時(shí)才使它返回不活動(dòng)電平。如果在將該中斷確 認(rèn)寫入外設(shè)之后,在外設(shè)能夠使中斷信號(hào)線失活之前主機(jī)中斷服務(wù)例程退出了,則主機(jī)可 以將持續(xù)活動(dòng)的信號(hào)線解釋為新中斷并再次激活事件隊(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使中斷線失活。NIC可以產(chǎn)生其它中斷, 然后如果在讀取了中斷源寄存器之后產(chǎn)生了更多事件,但是不會(huì)丟失中斷。在主機(jī)子系統(tǒng) 寫回它的事件隊(duì)列讀指針時(shí),中斷線也不會(huì)活動(dòng),因此也不會(huì)產(chǎn)生假警報(bào)中斷。
在上述多重隊(duì)列實(shí)施例中,在不需要到NIC的通信以解斷言喚醒事件的意義上來說, 喚醒事件更類似于邊沿觸發(fā)中斷,而不是電平觸發(fā)中斷。NIC在主機(jī)事件處理器已使它自 己失活之后保持喚醒事件活動(dòng),這是沒有風(fēng)險(xiǎn)的,因?yàn)橹鳈C(jī)可以撤銷該喚醒事件并按協(xié)調(diào) 的方式使它自己失活。因此,根據(jù)它的性質(zhì),假設(shè)正確地設(shè)計(jì)了事件處理器,則在喚醒事 件的環(huán)境下不必產(chǎn)生假警報(bào)問題。然而,對(duì)于CHAR驅(qū)動(dòng)器中斷,仍然會(huì)產(chǎn)生該問題。在 這種情況下, 一個(gè)實(shí)施例使用以上針對(duì)CHAR驅(qū)動(dòng)器事件隊(duì)列描述的假警報(bào)防止機(jī)制,和 以上針對(duì)用戶事件隊(duì)列描述的競(jìng)爭(zhēng)狀況檢測(cè)和糾正機(jī)制。在使用消息信令中斷(MSI)的實(shí) 施例中,如在PCI-ExpressI/0總線上,所有隊(duì)列只使用上述競(jìng)爭(zhēng)狀況機(jī)制。
在這里使用的,對(duì)信息項(xiàng)的"標(biāo)識(shí)"不一定要求直接指定該信息項(xiàng)。通過一個(gè)或更多 個(gè)間接層簡(jiǎn)單地引用實(shí)際信息,或者通過標(biāo)識(shí)一個(gè)或更多個(gè)不同的信息項(xiàng)(這些信息項(xiàng)一 起例如通過公知的算法足以確定實(shí)際信息項(xiàng)),可以在一字段中"標(biāo)識(shí)"信息。此外,這里 使用術(shù)語"表示"來意指與"標(biāo)識(shí)"相同的意思。
此外,在這里使用的,指向存儲(chǔ)器中的特定位置的"指針"是"標(biāo)識(shí)"存儲(chǔ)器中的特 定位置的信息。在一個(gè)實(shí)施例中,該指針包括第一值,其標(biāo)識(shí)緩沖區(qū)描述符表中的條目, 而該條目標(biāo)識(shí)主機(jī)存儲(chǔ)器中的緩沖區(qū)的基地址;和第二值,其標(biāo)識(shí)到該緩沖區(qū)的偏移量; 以及還可以包括需要用來唯一地標(biāo)識(shí)存儲(chǔ)器中的特定位置的其它參數(shù)。注意,由于如上所 述地定義了 "標(biāo)識(shí)",因此標(biāo)識(shí)了隊(duì)列中的待讀取或?qū)懭胧录?下一"位置的任何讀或?qū)?指針,也標(biāo)識(shí)了最后一次讀取或最后一次寫入位置,反之亦然。
此外,如這里使用的,如果前任信號(hào)、事件或值影響了給定信號(hào)、事件或值,則給定 信號(hào)、事件或值對(duì)該前任信號(hào)、事件或值"有響應(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)"的退 化情況。類似地定義給定信號(hào)、事件或值對(duì)另一信號(hào)、事件或值的"依賴性"。
出于示例和說明的目的,提供了本發(fā)明優(yōu)選實(shí)施例的上述說明。并不旨在窮舉或者將 本發(fā)明限制為公開的精確形式。顯然,本領(lǐng)域的技術(shù)人員可以顯見許多變型和修改。具體 來說,并無限制地,通過引用將在本專利申請(qǐng)的背景部分中通過引用描述、建議或并入的 任何和所以變型并入本文對(duì)本發(fā)明的多個(gè)實(shí)施例的描述中。對(duì)本文描述的實(shí)施例的選取和 描述的目的是為了很好地闡述本發(fā)明的原理及其實(shí)際應(yīng)用,從而使得本領(lǐng)域的技術(shù)人員能 夠針對(duì)各種實(shí)施例并以適于所預(yù)期的具體應(yīng)用的各種修改來理解本發(fā)明。本發(fā)明的范圍由 所附權(quán)利要求及其等同物來限定。
權(quán)利要求
1.一種在主機(jī)子系統(tǒng)與網(wǎng)絡(luò)接口設(shè)備間的管理數(shù)據(jù)傳輸?shù)姆椒?,包括以下步驟網(wǎng)絡(luò)接口設(shè)備從在主機(jī)子系統(tǒng)中的DMA描述符隊(duì)列取出數(shù)據(jù)緩沖區(qū)描述符,每個(gè)描述符標(biāo)識(shí)在主機(jī)子系統(tǒng)中的各自的數(shù)據(jù)緩沖區(qū);在網(wǎng)絡(luò)接口設(shè)備和在取出步驟中取出的描述符所標(biāo)識(shí)的數(shù)據(jù)緩沖區(qū)之間傳輸數(shù)據(jù);以及網(wǎng)絡(luò)接口設(shè)備將多個(gè)傳輸完成事件描述符寫入到可到達(dá)主機(jī)子系統(tǒng)的事件隊(duì)列中,多個(gè)傳輸完成事件描述符中的每一個(gè)都將網(wǎng)絡(luò)接口設(shè)備與傳輸數(shù)據(jù)步驟中的至少一個(gè)數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)傳輸?shù)耐瓿赏ㄖ鳈C(jī)子系統(tǒng),以及至少一個(gè)傳輸完成事件描述符進(jìn)一步將DMA描述符隊(duì)列空狀態(tài)通知主機(jī)子系統(tǒng)。
2. 依照權(quán)利要求l的方法,其中,傳輸數(shù)據(jù)的步驟包括步驟從通過在取出步驟中取出的描述符所標(biāo)識(shí)的數(shù)據(jù)緩沖區(qū),網(wǎng)絡(luò)接口設(shè)備取出發(fā)送數(shù)據(jù),以及其中,傳輸完成事件描述符將網(wǎng)絡(luò)接口設(shè)備從傳輸數(shù)據(jù)步驟中的至少一個(gè)數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù)的完成通知主機(jī)子系統(tǒng)。
3. 依照權(quán)利要求2的方法,其中,在多個(gè)傳輸完成事件描述符中的傳輸完成事件描述符的 一個(gè),將網(wǎng)絡(luò)接口設(shè)備從傳輸數(shù)據(jù)步驟中的多個(gè)數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù)的完成通知主機(jī)子 系統(tǒng)。
4. 依照權(quán)利要求2的方法,其中,多個(gè)傳輸完成事件描述符中除了還將DMA描述符隊(duì)列 空狀態(tài)的傳輸完成事件描述符通知主機(jī)子系統(tǒng)以外的每個(gè)傳輸完成事件描述符,將網(wǎng)絡(luò)接 口設(shè)備從傳輸步驟中的常數(shù)B (B>1)個(gè)數(shù)據(jù)緩沖區(qū)中取出數(shù)據(jù)的完成通知主機(jī)子系統(tǒng)。
5. 依照權(quán)利要求4的方法,其中,多個(gè)傳輸完成事件描述符中的還通知主機(jī)子系統(tǒng)DMA 描述符隊(duì)列空狀態(tài)那一個(gè),將網(wǎng)絡(luò)接口設(shè)備從傳輸數(shù)據(jù)步驟中的小于B個(gè)數(shù)據(jù)緩沖區(qū)中取 出數(shù)據(jù)的完成通知主機(jī)子系統(tǒng)。
6. 依照權(quán)利要求l的方法,其中,傳輸數(shù)據(jù)的步驟包括步驟網(wǎng)絡(luò)接口設(shè)備將由網(wǎng)絡(luò)輸入 的數(shù)據(jù)寫入在取出步驟中取出的描述符所標(biāo)識(shí)的數(shù)據(jù)緩沖區(qū)中,以及其中,傳輸完成事件描述符將網(wǎng)絡(luò)接口設(shè)備向傳輸數(shù)據(jù)步驟中的至少一個(gè)數(shù)據(jù)緩沖區(qū)的寫入數(shù)據(jù)的完成通知主機(jī)子系統(tǒng)。
7. 依照權(quán)利要求6的方法,其中,在多個(gè)傳輸完成事件描述符中的傳輸完成事件描述符的 一個(gè)將網(wǎng)絡(luò)接口設(shè)備向傳輸數(shù)據(jù)步驟中的多個(gè)數(shù)據(jù)緩沖區(qū)的寫入數(shù)據(jù)的完成通知主機(jī)子系 統(tǒng)。
8. 依照權(quán)利要求1的方法,進(jìn)一步包括步驟主機(jī)子系統(tǒng)將在取出數(shù)據(jù)緩沖區(qū)描述符步驟中由網(wǎng)絡(luò)接口設(shè)備取出的數(shù)據(jù)緩沖區(qū)描述符寫入到DMA描述符隊(duì)列。
9. 依照權(quán)利要求l的方法,其中,在網(wǎng)絡(luò)接口設(shè)備取出數(shù)據(jù)緩沖區(qū)描述符的步驟中取出的 描述符的至少一些,進(jìn)一步標(biāo)識(shí)一已更新的主機(jī)中心寫指針到DMA描述符隊(duì)列,進(jìn)一步包括步驟作為對(duì)網(wǎng)絡(luò)接口設(shè)備從通過網(wǎng)絡(luò)接口設(shè)備最近所接收的關(guān)于DMA描 述符隊(duì)列的更新的主機(jī)中心寫指針?biāo)R(shí)別的DMA描述符隊(duì)列中的條目取出數(shù)據(jù)緩沖區(qū)描 述符的響應(yīng),網(wǎng)絡(luò)接口設(shè)備將DMA描述符隊(duì)列空通知包括于至少一個(gè)傳輸完成事件描述符 中。
10. —種在主機(jī)子系統(tǒng)與網(wǎng)絡(luò)接口設(shè)備間的管理數(shù)據(jù)傳輸?shù)姆椒?,包括以下步驟 主機(jī)子系統(tǒng)將數(shù)據(jù)緩沖區(qū)描述符寫入DMA描述符隊(duì)列,每個(gè)描述符標(biāo)識(shí)在主機(jī)子系統(tǒng)中的各自的數(shù)據(jù)緩沖區(qū);以及隨后主機(jī)在可到達(dá)主機(jī)子系統(tǒng)的事件隊(duì)列中接收多個(gè)傳輸完成事件描述符,傳輸完成事件 隊(duì)列中的每一個(gè)將網(wǎng)絡(luò)接口設(shè)備與由數(shù)據(jù)緩沖區(qū)描述符標(biāo)識(shí)的數(shù)據(jù)緩沖區(qū)的至少一個(gè)間的 數(shù)據(jù)的傳輸?shù)耐瓿赏ㄖ鳈C(jī)子系統(tǒng),以及至少一個(gè)傳輸完成事件描述符進(jìn)一步將DMA描述 符隊(duì)列空狀態(tài)通知主機(jī)子系統(tǒng)。
11. 依照權(quán)利要求10的方法,其中,在主機(jī)子系統(tǒng)寫入數(shù)據(jù)緩沖區(qū)描述符的步驟中寫入的 描述符的至少一些,進(jìn)一步標(biāo)識(shí)一已更新的主機(jī)中心寫指針到DMA描述符隊(duì)列,進(jìn)一步包括步驟:作為對(duì)網(wǎng)絡(luò)接口設(shè)備從DMA描述符隊(duì)列中的由網(wǎng)絡(luò)接口設(shè)備最近接 收的關(guān)于DMA描述符隊(duì)列的由己更新的主機(jī)中心寫指針?biāo)鶚?biāo)識(shí)的條目中取出一數(shù)據(jù)緩沖 區(qū)描述符的響應(yīng),網(wǎng)絡(luò)接口設(shè)備將DMA描述符隊(duì)列空通知包括在至少一個(gè)傳輸完成事件描 述符中。
12. —種在主機(jī)子系統(tǒng)與網(wǎng)絡(luò)接口設(shè)備間的管理數(shù)據(jù)傳輸?shù)姆椒ǎㄒ韵虏襟E網(wǎng)絡(luò)接口設(shè)備從一 DMA描述符隊(duì)列取出數(shù)據(jù)緩沖區(qū)描述符,每個(gè)描述符標(biāo)識(shí)在主機(jī)子 系統(tǒng)中的一各自的數(shù)據(jù)緩沖區(qū),并且該描述符的至少一些標(biāo)識(shí)一已更新的主機(jī)中心寫指針 到DMA描述符隊(duì)列;在網(wǎng)絡(luò)接口設(shè)備和在取出步驟中取出的描述符標(biāo)識(shí)的數(shù)據(jù)緩沖區(qū)之間傳輸數(shù)據(jù);以及 作為對(duì)網(wǎng)絡(luò)接口設(shè)備從在DMA描述符隊(duì)列中由網(wǎng)絡(luò)接口設(shè)備最近接收的關(guān)于DMA描述符隊(duì)列的由己更新的主機(jī)中心寫指針?biāo)鶚?biāo)識(shí)的條目中取出一數(shù)據(jù)緩沖區(qū)描述符的響應(yīng),網(wǎng)絡(luò)接口設(shè)備將一 DMA描述符隊(duì)列空狀態(tài)通知主機(jī)子系統(tǒng)。
13. 依照權(quán)利要求12的方法,其中,上述DMA描述符隊(duì)列在主機(jī)存儲(chǔ)器中排列。
14. 計(jì)算機(jī)裝置,具有主機(jī)子系統(tǒng),用于與經(jīng)外圍總線與主機(jī)子系統(tǒng)相通信的網(wǎng)絡(luò)接口設(shè) 備一同使用,主機(jī)子系統(tǒng)包括多個(gè)數(shù)據(jù)緩沖區(qū);DMA描述符隊(duì)列,該DMA描述符隊(duì)列具有多個(gè)數(shù)據(jù)緩沖區(qū)描述符,每個(gè)數(shù)據(jù)緩沖區(qū) 描述符標(biāo)識(shí)各自的多個(gè)數(shù)據(jù)緩沖區(qū)的一個(gè);以及事件隊(duì)列,具有多個(gè)數(shù)據(jù)傳輸完成事件描述符,每個(gè)數(shù)據(jù)傳輸完成描述符將網(wǎng)絡(luò)接口 設(shè)備與數(shù)據(jù)緩沖區(qū)的至少一個(gè)的數(shù)據(jù)傳輸?shù)耐瓿赏ㄖ鳈C(jī)子系統(tǒng),并且至少多個(gè)傳輸完成 事件描述符的一個(gè)進(jìn)一步將DMA描述符隊(duì)列空狀態(tài)通知主機(jī)子系統(tǒng)。
15. 計(jì)算機(jī)裝置,具有主機(jī)子系統(tǒng),用于與經(jīng)外圍總線與主機(jī)子系統(tǒng)相通信的網(wǎng)絡(luò)接口設(shè) 備一同使用,主機(jī)子系統(tǒng)包括多個(gè)數(shù)據(jù)緩沖區(qū);DMA描述符隊(duì)列,該DMA描述符隊(duì)列具有多個(gè)數(shù)據(jù)緩沖區(qū)描述符,每個(gè)數(shù)據(jù)緩沖區(qū) 描述符標(biāo)識(shí)一各自的多個(gè)數(shù)據(jù)緩沖區(qū)的一個(gè);以及描述符中的至少一些進(jìn)一步標(biāo)識(shí)已更新的主機(jī)中心寫指針到DMA描述符隊(duì)列。
全文摘要
概略地講,用于主機(jī)子系統(tǒng)和網(wǎng)絡(luò)接口設(shè)備間的管理數(shù)據(jù)傳輸?shù)姆椒?,所述主機(jī)將數(shù)據(jù)緩沖區(qū)描述符寫入到一DMA描述符隊(duì)列中,并且當(dāng)數(shù)據(jù)緩沖區(qū)的處理已經(jīng)完成時(shí),所述網(wǎng)絡(luò)接口設(shè)備寫入完成事件來通知主機(jī)。每個(gè)完成事件描述符通知主機(jī)在NIC和一個(gè)或更多個(gè)數(shù)據(jù)緩沖區(qū)之間的數(shù)據(jù)傳輸?shù)耐瓿?,并且也可以將一?duì)列空通知嵌入在完成事件里。
文檔編號(hào)G06F3/00GK101198924SQ200680011384
公開日2008年6月11日 申請(qǐng)日期2006年1月31日 優(yōu)先權(quán)日2005年2月3日
發(fā)明者德瑞克·羅伯茨, 戴維·里多克, 斯蒂夫·蒲柏, 玉 秦 申請(qǐng)人:Level 5 網(wǎng)絡(luò)有限公司