[發明專利]基于高速網卡SR-IOV功能的VF資源動態調度方法有效
| 申請號: | 202110399468.2 | 申請日: | 2021-04-14 |
| 公開(公告)號: | CN113032103B | 公開(公告)日: | 2023-07-04 |
| 發明(設計)人: | 黃旺;劉亞萍;張碩 | 申請(專利權)人: | 中南大學;鵬城實驗室 |
| 主分類號: | G06F9/455 | 分類號: | G06F9/455;G06F9/50;G06F13/42 |
| 代理公司: | 湖南企企衛知識產權代理有限公司 43257 | 代理人: | 任合明 |
| 地址: | 410083 *** | 國省代碼: | 湖南;43 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 基于 高速 網卡 sr iov 功能 vf 資源 動態 調度 方法 | ||
1.一種基于高速網卡SR-IOV功能的VF資源動態調度方法,其特征在于包括以下步驟:
第一步,構建資源調度系統,資源調度系統由資源配置模塊和動態調度模塊組成;
資源配置模塊用于模擬與配置VF具有的資源,運行在Linux操作系統內核,與PCI子系統、動態調度模塊、高速網卡相連;資源配置模塊是在PCI子系統與硬件網卡之間插入的一個中間層;資源配置模塊對VF的硬件資源和軟件資源進行初步初始化,將初始化后的硬件資源和軟件資源傳遞給PCI子系統;資源配置模塊對VF的軟件資源和硬件資源進行解耦,即將原本屬于一個整體的軟件資源和硬件資源拆成兩部分,分別進行抽象,生成VF硬件資源對象和VF軟件資源對象,分別放入到VF硬件資源對象隊列和VF軟件資源對象隊列;
VF硬件資源對象用于描述單個VF的所有硬件資源,和實際的VF硬件資源一一對應;VF硬件資源對象包括4個域:VF硬件資源對象ID、I/O空間地址、內存空間地址、是否空閑標志;VF硬件資源對象ID用于標識一個VF硬件資源對象,從1開始取值,依次增加;I/O空間地址是I/O空間的起始地址;內存空間地址是內存空間的起始地址;是否空閑標志取值為0或1,當是否空閑標志為0時表示VF硬件資源對象空閑,當是否空閑標志為1時表示VF硬件資源對象分配給了VF軟件資源對象;若SR-IOV設備支持N個VF,則根據實際的VF硬件資源生成N個VF硬件資源對象;
VF軟件資源對象用于描述VF所需要的配置信息,資源配置模塊在VF軟件資源的基礎之上,模擬生成M個VF軟件資源對象,M≥N;VF軟件資源對象包括6個域,分別為:VF軟件資源對象ID、VF硬件資源對象ID、虛擬機ID、接收隊列數、發送隊列數、中斷號;VF軟件資源對象ID用于表示一個VF軟件資源對象,從1開始取值,依次增加;VF硬件資源ID為-1時表示VF軟件資源對象沒有分配到VF硬件資源對象,VF硬件資源對象ID為正數時表示VF軟件資源對象分配到的VF硬件資源對象;虛擬機ID表示VF軟件資源對象被分配給了哪個虛擬機,虛擬機ID由虛擬機管理器指定;接收隊列數和發送隊列數表示VF軟件資源對象具有的接收隊列數量和發送隊列數量;中斷號表示PCI子系統在初始化VF軟件資源對象時為VF軟件資源對象申請的中斷號;
資源配置模塊將構建好的VF硬件資源對象和VF軟件資源對象分別放入VF硬件資源對象隊列和VF軟件資源對象隊列,PCI子系統從VF軟件資源對象隊列讀取VF軟件資源對象,對VF軟件資源對象進行初始化,生成pci_dev結構體并注冊到Linux系統內核中;
虛擬機管理器在創建虛擬機時將VF軟件資源對象對應的pci_dev結構體分配給虛擬機;虛擬機使用VF進行I/O傳輸時,通過VF對應的pci_dev結構體將I/O傳輸請求發送到資源配置模塊的VF軟件資源對象,如果VF軟件資源對象有對應的VF硬件資源對象,則通過VF硬件資源對象調用VF硬件資源進行傳輸;如果VF軟件資源對象沒有VF硬件資源對象,則向動態調度模塊發送“VF硬件資源對象分配請求”,VF硬件資源對象分配請求的內容為:請求ID、VF軟件資源對象ID、入隊時間、優先級;請求ID為VF硬件資源對象分配請求號;VF軟件資源對象ID表示是哪個VF軟件資源對象發起的請求;入隊時間表示請求放入請求隊列的時間,用于計算優先級;優先級表示“VF硬件資源對象分配請求”獲得VF硬件資源對象的優先順序,等待時間越長優先級越高;
動態調度模塊用于管理和調度VF硬件資源,運行在Linux操作系統內核,與PCI子系統、資源配置模塊相連;動態調度模塊管理兩個隊列,分別為已處理請求隊列和未處理請求隊列;動態調度模塊從資源配置模塊接收“VF硬件資源對象分配請求”,“VF硬件資源對象分配請求”簡稱請求,將未處理的“VF硬件資源對象分配請求”放入未處理請求隊列中;動態調度模塊按先入先出的順序對未處理請求隊列中的請求進行處理,取出隊頭的請求,獲取資源配置模塊中VF硬件資源對象隊列中的VF硬件資源對象,判斷VF硬件資源對象的使用情況,如果VF硬件資源對象隊列中有空閑的VF硬件資源對象,則將空閑的VF硬件資源對象分配給VF軟件資源對象,然后將請求放入到已處理隊列;如果資源配置模塊中VF硬件資源對象隊列中沒有空閑的VF硬件資源對象,則循環訪問已處理請求隊列中的每個已處理請求,獲取已處理請求的優先級,與當前請求即從未處理請求隊列取出的隊頭的請求的優先級進行比較,如果已處理請求的優先級低于當前請求,則當前請求搶占已處理請求的VF硬件資源對象,反之則將當前請求重新放入未處理請求隊列中,等待下一次的處理;動態調度模塊循環處理未處理隊列中的請求;
第二步,運行資源調度系統,資源配置模塊對VF硬件資源和VF軟件資源進行配置,構建VF硬件資源對象和VF軟件資源對象,方法是:
2.1資源配置模塊創建并初始化N個VF硬件資源對象,并將N個VF硬件資源對象存入到VF硬件資源對象隊列中,N為SR-IOV支持生成的VF的個數,VF的個數記錄在PF的配置空間中,方法是:
2.1.1初始化變量n=1;
2.1.2讀取第n個VF的配置信息;資源配置模塊通過PCI子系統提供的API即pci_read_config_word()按字節讀取配置空間第n個VF配置信息,信息包括:VF的廠商號、設備號、功能號、基址即BAR;廠商號用于標識VF是哪個廠家生產的;設備號和功能號是VF在PCI子系統中唯一的標識符;基址是內存空間、I/O空間的起始地址;
2.1.3創建并初始化第n個VF硬件資源對象:資源配置模塊將2.1步獲取到的VF的配置信息分別賦值給第n個VF硬件資源對象中的各個域:第n個VF硬件資源對象的VF硬件資源對象ID賦值為n;第n個VF硬件資源對象的內存空間地址賦值為BAR[0]+VF配置空間大小×(n-1),VF配置空間大小在VF驅動的頭文件中定義;第n個VF硬件資源對象的I/O空間地址賦值為BAR[1]+VF配置空間大小×(n-1);將是否空閑標志賦值為0;
2.1.4資源配置模塊將初始化后的第n個VF硬件資源對象存入到VF硬件資源對象隊列中;
2.1.5令n=n+1,若nN,跳轉到步驟2.2;否則跳轉到步驟2.1.2;
2.2資源配置模塊創建并初始化M個VF軟件資源對象,并將M個VF軟件資源對象存入到VF軟件資源對象隊列中,M為VF軟件資源對象的數量,應大于VF硬件資源數量N;方法是:
2.2.1向Linux系統中/sys/class/net/[PF_NAME]/device/目錄下的sriov_numvfs文件寫入需要生成的VF軟件資源對象的數量M,PF_NAME為PF即高速網卡的名稱,PCI子系統在初始化與配置PF時給PF指定;
2.2.2初始化變量m=1;
2.2.3創建第m個VF軟件資源對象并進行初始化,方法是:將第m個VF軟件資源對象ID賦值為m;將VF硬件資源對象ID賦值為-1;
2.2.4將初始化后的第m個VF軟件資源對象入隊到VF軟件資源管理隊列中;
2.2.5令m=m+1,若mM,跳轉到步驟2.3;否則跳轉到步驟2.2.3;
2.3PCI子系統創建并初始化M個pci_dev結構體,將pci_dev注冊到Linux系統內核,并對VF軟件資源對象進行進一步初始化,方法如下:
2.3.1初始化變量k=1;
2.3.2讀取VF軟件資源對象隊列中第k個VF軟件資源對象的內容;
2.3.3創建第k個pci_dev結構體并進行初始化,方法是:將第k個pci_dev結構的devfn賦值為k;
2.3.4進一步初始化第k個VF軟件資源對象,方法是:將第k個VF軟件資源對象的接收隊列數賦值為PCI子系統確定的接收隊列數num_rx_queues,發送隊列數賦值為PCI子系統確定的發送隊列數num_tx_queues、中斷號賦值為Linux系統分配的中斷號irq;
2.3.5將pci_dev注冊到Linux系統內核中;
2.3.6令k=k+1,若kM,跳轉到步驟2.4;否則跳轉到步驟2.3.2;
2.4虛擬機管理器創建M個VF軟件資源對象的虛擬機,并為每個虛擬機分配pci_dev結構體;
2.5虛擬機判斷是否需要進行I/O傳輸,若需要,創建I/O請求,I/O請求中包含虛擬機的虛擬機號,將I/O請求發送給虛擬機管理器,轉2.6;若不需要,轉2.5;
2.6虛擬機管理器接收虛擬機發送過來的I/O請求,將I/O請求發送給PCI子系統;
2.7PCI子系統接收虛擬機管理器發送過來的I/O請求,將I/O請求發送給資源配置模塊;
2.8資源配置模塊接收PCI子系統發送過來的I/O請求,按照先到先處理的原則處理I/O請求,具體步驟如下:
2.8.1讀取I/O請求中虛擬機號;
2.8.2訪問資源配置模塊中的VF軟件資源對象隊列隊頭的VF軟件資源對象;
2.8.2讀取VF軟件資源對象中的虛擬機ID;
2.8.3判斷2.8.2中讀取到的VF軟件資源對象的虛擬機ID是否與2.8.1中讀取到的虛擬機號相等,如果不相等跳轉到2.8.4;如果相等跳轉到2.8.5;
2.8.4訪問VF軟件資源對象隊列中下一個VF軟件資源對象,然后跳轉到2.8.2;
2.8.5讀取VF軟件資源對象的VF硬件資源ID;
2.8.6判斷VF軟件資源對象是否獲得VF硬件資源對象,如果VF軟件資源對象的VF硬件資源ID是否為正數,若為正數,表示獲得了VF硬件資源對象,跳轉到2.8.7;如果VF軟件資源對象的VF硬件資源ID為-1,表示沒有獲得VF硬件資源對象,跳轉到2.8.8;
2.8.7PCI子系統調用VF軟件資源對象的VF硬件資源進行I/O傳輸;
2.8.8創建并初始化“VF硬件資源對象分配請求”,將“VF硬件資源對象分配請求”的請求ID賦值為i,i等于上一個請求的請求ID+1,VF軟件對象ID賦值為2.8.6中VF軟件資源對象的VF軟件資源對象ID、入隊時間賦值為0、優先級賦值為0;
2.8.9將“VF硬件資源對象分配請求”發送給動態調度模塊;
第三步,動態調度模塊對VF硬件資源對象進行動態調度:
3.1動態調度模塊從資源配置模塊接收“VF硬件資源分配請求”,將“VF硬件資源分配請求”中的入隊時間賦值為當前系統時間,然后將“VF硬件資源分配請求”存入到未處理請求隊列;
3.2動態調度模塊循環處理未處理請求隊列中的VF硬件資源分配請求;具體步驟如下:
3.2.1動態調度模塊判斷未處理請求隊列是否為空,若為空,直接轉3.2.1;若不為空,跳轉到步驟3.2.2;
3.2.2動態調度模塊從未處理請求隊列的隊頭取出VF硬件資源分配請求;
3.2.3動態調度模塊循環訪問VF硬件資源對象隊列,讀取VF硬件資源對象中的是否空閑標志以查找空閑VF硬件資源對象,方法是:
3.2.3.1動態調度模塊讀取VF硬件資源對象隊列隊頭的VF硬件資源對象;
3.2.3.2動態調度模塊讀取VF硬件資源對象的是否空閑標志,如果為1,表示讀取到的VF硬件資源對象不空閑,跳轉到步驟3.2.3.3;如果為0,表示讀取到的VF硬件資源對象空閑,跳轉到步驟3.2.4;
3.2.3.3動態調度模塊判斷當前VF硬件資源對象是否處于VF硬件資源對象隊列隊尾,如果不是處于隊尾,跳轉到步驟3.2.3.4;如果是處于隊尾,跳轉到步驟3.2.8;
3.2.3.4動態調度模塊讀取VF硬件資源對象隊列中下一個VF硬件資源對象;跳轉到步驟3.2.3.2;
3.2.4動態調度模塊將讀取到的VF硬件資源對象分配給VF軟件資源對象,方法是:動態調度模塊根據“VF硬件資源對象分配請求”中的VF軟件資源對象ID找到對應的VF軟件資源對象;將VF軟件資源對象的VF硬件資源對象ID設置為當前訪問的VF硬件資源對象ID;將當前VF硬件資源對象的是否空閑標志設置為1;
3.2.5動態調度模塊將3.2.4已處理的“VF硬件資源對象分配請求放入到已處理請求隊列的隊尾,并將該“VF硬件資源對象分配請求”的入隊時間賦值為當前系統時間;
3.2.6動態調度模塊判斷未處理請求隊列是否為空;如果為空不做任何處理,跳轉到3.2.1,等待未處理請求隊列有未處理的請求;如果不為空跳轉到步驟3.2.7;
3.2.7動態調度模塊取出下一個未處理的VF硬件資源對象分配請求,跳轉到步驟3.2.3;
3.2.8動態調度模塊查找已處理請求中低優先級的請求;動態調度模塊計算當前“VF硬件資源對象分配請求”的優先級,循環訪問已處理請求隊列,讀取已處理的VF硬件資源對象分配請求的優先級,若在已處理請求隊列中找到比當前請求優先級更低的已處理請求,轉到步驟3.2.9,若在已處理請求隊列中未找到比當前請求優先級更低的已處理請求,則將未處理請求重新存入未處理請求隊列,轉3.2.8;
3.2.9動態調度模塊剝奪已處理請求的VF硬件資源對象,分配給當前未處理請求,轉到步驟3.2.5。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于中南大學;鵬城實驗室,未經中南大學;鵬城實驗室許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/202110399468.2/1.html,轉載請聲明來源鉆瓜專利網。





