[发明专利]基于高速网卡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.vipzhuanli.com/pat/books/202110399468.2/1.html,转载请声明来源钻瓜专利网。