内核装置模块的实时更新的制作方法

文档序号:23185364发布日期:2020-12-04 14:14阅读:141来源:国知局
内核装置模块的实时更新的制作方法



背景技术:

相关技术说明

错误修复或安全补丁会定期应用于实时生产内核模块代码库。在一些计算环境中,这些补丁将导致操作环境中断。例如,云服务提供商(csp)在具有成千上万台主机的实时生产环境中运行各种软件模块。大型csp将用户踢出主机以便安装更新后版本的内核装置模块(即,装置驱动程序)是不切实际的。等待所有用户自行注销也是不可行的。

附加地,尝试在运行对应装置时替换正在运行的内核装置模块(或简称为模块)可能是一项挑战。卸载和重新加载模块的行为可能会导致丢失状态的情景。一个问题是,新模块将不了解旧模块留下的状态。在已卸载旧模块并开始加载新模块之后的一段时间期间,将没有驱动程序管理装置。装置的任何活动或状态更改都将丢失。

附图说明

通过结合附图参考以下描述,可更好地理解本文中描述的方法和机制的优点,在附图中:

图1是计算系统的一个实现方式的框图。

图2是服务器的虚拟环境的一个实现方式的框图。

图3示出了计算系统的一个实现方式的框图。

图4示出了计算系统的一个实现方式的框图。

图5示出了计算系统的一个实现方式的框图。

图6示出了计算系统的一个实现方式的框图。

图7示出了os、代理模块和内核装置模块之间的交互的一个实现方式的序列图。

图8示出了在加载新的内核装置模块时交互的一个实现方式的序列图。

图9示出了在加载新的内核装置模块时交互的一个实现方式的序列图。

图10示出了使现有内核装置模块版本静默的一个实现方式的序列图。

图11是示出用于加载内核装置模块的方法的一个实现方式的通用流程图。

图12是示出用于使第一版本的装置驱动程序静默以便将装置的控制权从第一版本的装置驱动程序转移到第二版本的装置驱动程序的方法的一个实现方式的通用流程图。

具体实施方式

在以下描述中,阐述了众多特定细节以提供对本文呈现的方法和机制的透彻理解。然而,本领域普通技术人员应认识到,可在没有这些具体细节的情况下实践各种实现方式。在一些情况下,并未详细示出众所周知的结构、部件、信号、计算机程序指令和技术,以避免混淆本文描述的方法。应当理解,为了说明的简单和清楚起见,附图中所示的元件不一定按比例绘制。例如,一些元件的尺寸可相对于其他元件被放大。

本文公开了用于执行内核装置模块的实时更新的各种系统、设备和方法。在一个实现方式中,代理模块被加载到系统上,其中代理模块为两个不同版本的内核装置模块提供注册和通信点。在一个实现方式中,代理模块和内核装置模块是可加载的内核模块。当控制权从第一版本的内核装置模块转移到第二版本的内核装置模块时,代理模块在同时激活两个版本的可加载内核模块时执行无法复制或释放的驱动程序活动。在一个实现方式中,代理模块执行的活动包括但不限于装置注册、输入输出控制(ioctl)调用、sysfs调用以及其他活动。

当加载第一版本的内核装置模块时,它将使用从代理模块导出的应用程序编程接口(api)来向代理模块注册。然后,代理模块将向操作系统(os)注册,假装是第一版本的内核装置模块。代理模块将维护所有必需的打开的sysfs属性文件和ioctl文件属性。当加载第二版本的内核装置模块时,第二版本的内核装置模块也将向代理模块注册。由于已经向os注册了代理模块,因此代理模块不需要重复注册步骤。由于每个版本的内核装置模块都向代理模块注册,因此代理模块知道如何查找每个版本的内核装置模块并与之通信。新版本的内核装置模块将查询代理模块以查找其他版本,以便两个版本能够直接通信。在一个实现方式中,一旦两个版本的内核装置模块能够彼此直接通信,则这两个版本管理它们之间的装置控制权的转移,而无需来自代理模块的进一步帮助。

现在参考图1,示出了计算系统100的一个实现方式的框图。在一个实现方式中,计算系统100至少包括处理器105a至105n、输入/输出(i/o)接口120、总线125、一个或多个存储器控制器130、网络接口控制器(nic)135和一个或多个存储器装置140。在其他实现方式中,计算系统100包括其他部件并且/或者计算系统100以不同方式布置。处理器105a至105n表示系统100中包括的任何数目的处理器。在一个实现方式中,处理器105a是通用处理器,诸如中央处理单元(cpu)。在一个实现方式中,处理器105n是具有高度并行架构的数据并行处理器。数据并行处理器包括图形处理单元(gpu)、数字信号处理器(dsp)、现场可编程门阵列(fpga)、专用集成电路(asic)等等。在一些实现方式中,处理器105a至105n包括多个数据并行处理器。

一个或多个存储器控制器130表示可由处理器105a至105n和耦接到i/o接口120的i/o装置(未示出)访问的任何数目和类型的存储器控制器。一个或多个存储器控制器130耦接到任何数目和类型的一个或多个存储器装置140。一个或多个存储器装置140表示任何数目和类型的存储器装置。举例来说,存储器装置140中的存储器的类型包括动态随机存取存储器(dram)、静态随机存取存储器(sram)、nand快闪存储器、nor快闪存储器、铁电随机存取存储器(feram)或其他存储器。

i/o接口120表示任何数目和类型的i/o接口(例如,外围部件互连(pci)总线、pci扩展(pci-x)、pcie(pci快速)总线、吉比特以太网(gbe)总线、通用串行总线(usb))。各种类型的外围装置(未示出)耦接到i/o接口120。此类外围装置包括(但不限于)显示器、键盘、鼠标、打印机、扫描仪、操纵杆或其他类型的游戏控制器、媒体记录装置、外部存储装置、网络接口卡等。网络接口控制器(nic)135跨网络145接收和发送网络消息。

网络145表示任何类型的网络或网络的组合,包括无线连接、直接局域网(lan)、城域网(man)、广域网(wan)、内联网、互联网、有线网络、分组交换网络、光纤网络、路由器、存储区域网络,或其他类型的网络。lan的示例包括以太网网络、光纤分布式数据接口(fddi)网络和令牌环网络。在各种实现方式中,网络145还包括远程直接存储器访问(rdma)硬件和/或软件、传输控制协议/互联网协议(tcp/ip)硬件和/或软件、路由器、中继器、交换机、电网和/或其他部件。

在各种实现方式中,计算系统100是计算机、膝上型计算机、移动装置、游戏控制台、服务器、流式传输装置、可穿戴装置或者各种其他类型的计算系统或装置中的任一种。应注意,计算系统100的部件的数目随实现方式的不同而不同。例如,在其他实现方式中,存在与图1中示出的数目相比更多或更少的每种部件。还应注意的是,在其他实现方式中,计算系统100包括图1中未示出的其他部件。附加地,在其他实现方式中,计算系统100以与图1中所示不同的方式进行结构化。

现在转到图2,示出了服务器200的虚拟环境的一个实现方式的框图。在一个实现方式中,服务器200包括客户端205a至205n、虚拟机(vm)215a至215n、虚拟机监测器(vmm)220、主机硬件230、存储器240、总线/组构(fabric)250和装置255。在一个实现方式中,服务器200是云服务提供商环境的一部分。应理解,服务器200仅仅是在一个实现方式中使用的服务器架构的一个图示。在其他实现方式中,服务器包括以其他合适方式布置的其他数目和/或类型的部件。

客户端205a至205n表示耦接到服务器200和/或使用该服务器上的资源的任何数目的客户端。客户端205a至205n分别包括任何数目和类型的应用程序207和208。每个客户端205a至205n内的应用程序之一可以是例如的操作系统。每个客户端205a至205n还可以分别包括来宾驱动程序210a至210n,以与装置255进行交互。在一个实现方式中,针对每个客户端205a至205n在服务器200上使虚拟机(vm)215a至215n实例化。在一个实现方式中,vmm220调度vm215a至215n,并且每个vm内部的操作系统管理装置255上的应用程序207至208的调度。主机硬件230包括任何数目和类型的处理资源。例如,在一个实现方式中,主机硬件230包括多个cpu(例如,多核cpu)。主机硬件230还包括存储器控制器逻辑、一个或多个高速缓存子系统、组构和/或互连资源、网络接口电路、电源管理电路、电压调节器等等。存储器240表示服务器200内包括的任何数目和类型的存储器装置。总线/组构250包括用于连接服务器200的各个部件的任何类型的互连逻辑。虽然示出单个装置255连接到总线/组构250,但是应理解,多个其他装置也能够连接到总线/组构250。在一个实现方式中,装置255是gpu。在其他实现方式中,装置255是各种其他类型的装置中的任一种。在各种实现方式中,客户端205a至205n可以包括至少部分地使用装置255的计算资源来执行的应用程序。使用装置255的客户端205a至205n的来宾驱动程序210a至210n分别被设计为管理应用程序207和208分别与装置255的资源之间的交互。

为了管理os270与装置255之间的交互,存储器240存储第n个版本的内核装置模块260a,其中内核装置模块260a是装置255的装置驱动程序。当第n个版本的内核装置模块260a被加载到存储器240中并被安装在服务器200上时,第n个版本的内核装置模块260a向代理模块265注册而不是向操作系统(os)270注册。在一个实现方式中,os270是基于的os。在其他实现方式中,os270是各种其他类型的os(例如,)中的任一种。

当第n个版本的内核装置模块260a被加载到存储器240中并被安装在服务器200上时,第n个版本的内核装置模块260a向代理模块265注册而不是向操作系统(os)270注册。第n个版本的内核装置模块260a不知道先前版本的装置驱动程序是否已经安装在装置255的服务器200上并且正在运行。代理模块265在注册过程期间返回指示,以向第n个版本的内核装置模块260a通知它是第一个装置驱动程序还是已存在先前版本的装置驱动程序。在服务器200的生命周期期间,可能期望更新装置255的装置驱动程序以添加新功能、修复错误和/或进行其他类型的更改。然而,还期望装置驱动程序的更新导致对客户端205a至205n的操作的最小干扰。第(n+1)个版本的内核装置模块260b表示用于装置255的装置驱动程序的较新版本,其意图替换第n个版本的内核装置驱动程序260a。例如,在一个实现方式中,第(n+1)个版本的内核装置模块260b使用与第n个版本的内核装置驱动程序260a不同的一个或多个数据结构。

当第(n+1)个版本的内核装置模块260b被加载到存储器240中并被安装在服务器200上时,第(n+1)个版本的内核装置模块260b向代理模块265注册而不是向操作系统(os)270注册。当第(n+1)个版本的内核装置模块260b向代理模块265注册时,第(n+1)个版本的内核装置模块260b不知道先前版本的装置驱动程序是否已经安装在装置255的服务器200上并且正在运行。在先前版本(第n个版本)已经在运行的情况下,代理模块265在注册过程期间返回指示以通知第(n+1)个版本的内核装置模块260b:现有装置驱动程序已经在运行。代理模块265还为第(n+1)个版本的内核装置模块260b提供指向第n个版本的内核装置模块260a的指针。这允许第(n+1)个版本的内核装置模块260b和第n个版本的内核装置模块260a进行通信以管理控制权向第(n+1)个版本的内核装置模块260b的转移。

在一些情景下,控制权从第n个版本的内核装置模块260a到第(n+1)个版本的内核装置模块260b的这种转移必须在客户端205a至205n不知道转移的情况下发生。作为在模块260a至260b之间转移控制权的过程的一部分,将与装置255相关联的静态数据从第n个版本的内核装置模块260a复制到第(n+1)个版本的内核装置模块260b。在复制静态数据时,第n个版本的内核装置模块260a继续管理装置255,并且客户端205a至205n继续运行并使用装置255,而没有任何中断。在一个实现方式中,静态数据包括多个vf、帧缓冲区的大小、来自配置文件的数据、视频基本输入输出系统(bios)图像和/或其他数据。在复制了静态数据之后,使第n个版本的内核装置模块260a静默。在一个实现方式中,使第n个版本的内核装置模块260a静默涉及使所有输入停止进入第n个版本的内核装置模块260a中。但是,使所有输入停止进入第n个版本的内核装置模块260a中并不一定会使客户端205a至205n中断。例如,在一个实现方式中,装置255是gpu,并且当启动静默操作时,给定客户端205可能具有在装置255上运行的渲染操作。当第n个版本的内核装置模块260a正被静默时,渲染操作能够在装置255上继续运行而不会中断。仅当给定客户端205正在等待来自第n个版本的内核装置模块260a的响应时,给定客户端205才会经历小的延迟。如果在第n个版本被静默并且第(n+1)个版本的内核装置模块260b尚未启动的时间期间发生对第n个版本的内核装置模块260a的外部刺激,则可能对系统造成小的延迟。在第n个版本的内核装置模块260a被静默后,与装置255相关联的瞬态数据被从第n个版本的内核装置模块260a传送到第(n+1)个版本的内核装置模块260b。然后第(n+1)个版本的内核装置模块260b接任作为装置255的新装置驱动程序。客户端205a至205n将不会注意到装置255的装置驱动程序中的这种更改。

现在参考图3,示出了计算系统300的一个实现方式的框图。在一个实现方式中,内核装置模块305a向代理模块315a注册以用作给定装置(未示出)的装置驱动程序。在一个实现方式中,给定装置是gpu。在其他实现方式中,给定装置是各种其他类型的装置中的任一种。应注意,术语“内核装置模块”和“装置驱动程序”在本文中可互换使用。

vm320a、330a和340a表示利用给定装置的处理资源的任何数目的vm。vm320a、330a和340a分别对应于轮流在给定装置上运行的虚拟函数(vf)325a、335a和345a。在另一实现方式中,不是vf的各种客户端可以轮流在给定装置上运行。在内核装置模块305a向代理模块315a注册之后,代理模块315a向操作系统(os)(未示出)注册,假装为内核装置模块305a。换句话说,代理模块315a将其自身标识为os的内核装置模块305a,以便将内核装置模块305a注册为给定装置的装置驱动程序。然后,在代理模块315a就内核装置模块305a向os注册之后,内核装置模块305a能够开始管理给定装置。在一个实现方式中,管理给定装置涉及处理ioctl和sysfs调用、处理中断(例如,邮箱中断、世界切换(worldswitch)中断)以及处理调试请求。在其他实现方式中,管理给定装置涉及其他类型的动作。

现在转到图4,示出了计算系统400的一个实现方式的框图。计算系统400意图表示在稍后的时间点的(图3的)计算系统300。因此,内核装置模块305b和代理模块315b意图分别表示在稍后的时间点的内核装置模块305a和代理模块315a。在图4所示的时间点,内核装置模块310b已经被加载到系统400上。加载到系统400上意味着内核装置模块310b已存储在系统400的存储器中,并且内核装置模块310b的执行已在系统400的一个或多个处理器上启动。

为了本论述的目的,假定内核装置模块310b是内核装置模块305b的后续版本。例如,如果内核装置模块305b是第一版本的装置驱动程序,则内核装置模块310b是第二或更迟版本(或者在降级的情况下是更早版本)的装置驱动程序。通常不时地更新装置驱动程序,以合并新功能、修复错误、提供安全性更新和/或实现其他更改。因此,预期在系统400的整个生命周期期间,给定装置的原始装置驱动程序将不是给定装置的唯一装置驱动程序。因此,对内核装置模块305b的更新将在各个时间加载到系统400上。内核装置模块310b意图表示内核装置模块305b的完整替换。当执行内核装置模块305b的完整替换时,控制权从内核装置模块305b到内核装置模块310b的移交不应使vm320b、330b和340b中断。或者,换言之,期望在将控制权从内核装置模块305b转移到内核装置模块310b期间使对vm320b、330b和340b的中断最小化。如图4所示,vm320b、330b和340b分别对应于轮流在给定装置上运行的vf325b、335b和345b。在另一实现方式中,不是vf的各种客户端可以在给定装置上运行。

如本文所使用的,术语“内核装置模块”被定义为处置系统400的给定装置与系统400的os或其他软件应用程序之间的对接的装置驱动程序。在一个实现方式中,给定装置是gpu。在其他实现方式中,给定装置是各种其他类型的装置中的任一种。为了本论述的目的,假定内核装置模块310b和内核装置模块310a两者都被设计用于与系统400的同一装置对接。因此,如果内核装置模块310b和内核装置模块310a两者同时尝试处置与同一给定装置的对接,则这将导致系统400不可预测的行为。因此,内核装置模块305b和内核装置模块310b将协调对给定装置的访问以管理控制权的移交。

当内核装置模块310b被加载到系统400上时,内核装置模块310b向代理模块315b注册而不是向os注册。os已经向给定装置进行了现有的驱动程序注册,并且因此os将不允许内核装置模块310b为此给定装置注册相同的驱动程序名称。现有注册由代理模块315b代表内核装置模块305b执行。因此,由于内核装置模块310b不能向os注册以成为给定装置的装置驱动程序,因此内核装置模块310b向代理模块315b注册。响应于接收到该注册尝试,代理模块315b将通知内核装置模块310b另一内核装置模块(即,内核装置模块305b)已经被注册成为给定装置的装置驱动程序。代理模块315b还向内核装置模块310b提供允许内核装置模块310b与内核装置模块305b通信的指针。

在该实现方式中,内核装置模块310b使用指针与内核装置模块305b通信以促进给定装置的控制权的转移。第一步,内核装置模块310b请求与给定装置相关联的任何静态数据。响应于该请求,内核装置模块305b将与给定装置相关联的静态数据发送到内核装置模块310b。在一个实现方式中,静态数据包括多个vf、帧缓冲区的大小、来自配置文件的数据、视频基本输入输出系统(bios)图像和/或其他数据。在这些事件发生时,内核装置模块305b继续充当给定装置的装置驱动程序。通过继续充当给定装置的装置驱动程序,内核装置模块305b继续处理给定装置的ioctl和sysfs调用。内核装置模块305b还继续处理给定装置的邮箱中断、世界切换中断和调试信号。

现在参考图5,示出了计算系统500的一个实现方式的框图。图5表示图4的论述的继续。换句话说,计算系统500意图表示在稍后的时间点的计算系统400。因此,内核装置模块305c、内核装置模块310c和代理模块315c意图分别表示在稍后的时间点的(图4的)内核装置模块305b、内核装置模块310b和代理模块315b。vm320c、330c和340c以及vf325c、335c和345c也分别表示在稍后的时间点的(图4的)vm320b、330b和340b以及vf325b、335b和345b。

在图5所示的时间点,内核装置模块305c对邮箱中断、世界切换中断和调试信号的处理已暂停。在此时间期间针对给定装置生成的、发往内核装置模块305c的任何中断或调试信号都将被排队。但是,内核装置模块305c将在此时间点继续处理ioctl和sysfs调用。在该实现方式中,如果vm320b、330b或340b之一恰好正在利用给定装置,则它们可以继续这样做。发往vm的任何中断或操作都可以继续不受阻碍地被处理。内核装置模块305c和内核装置模块310c将彼此通信以协调中断和调试信号的处理的暂停以及内核装置模块305c的静默的时序。一旦内核装置模块305c已被静默,内核装置模块305c就将瞬态数据发送到内核装置模块310c。在一个实现方式中,瞬态数据包括当前正在运行的vf、当前正在运行的vf的状态、运行列表上vf的顺序、事件存储桶、累积数据和/或其他数据。在内核装置模块305c已被静默的时间段期间,发往vm的任何中断或操作都可以继续不受阻碍地被处理。

现在转到图6,示出了计算系统600的一个实现方式的框图。计算系统600意图表示在稍后的时间点的计算系统500。因此,内核装置模块305d、内核装置模块310d和代理模块315d意图分别表示在稍后的时间点的内核装置模块305c、内核装置模块310c和代理模块315c。而且,vm320d、330d和340d以及vf325d、335d和vf345d分别表示在稍后的时间点的vm320c、330c和340c以及vf325c、335c和vf345c。

在图6所示的时间点,邮箱中断、世界切换中断和调试信号的处理已由内核装置模块310d重新启动。在内核装置305d停止处理中断和调试信号与内核装置310d开始处置中断和调试信号的处理之间的时间期间生成的任何中断或调试信号,都将离开记录它们的相应队列或状态寄存器进行处理。附加地,在图6所表示的时间点,内核装置模块310d将开始处理ioctl和sysfs调用。内核装置模块310d和内核装置模块305d彼此通信以协调用于处置ioctl和sysfs调用的处理的控制权的转移。

现在参考图7,示出了os、代理模块和内核装置模块之间的交互的一个实现方式的序列图。在一个实现方式中,当对内核装置模块706进行modprobe调用时,os702解析内核装置模块706的依赖性。根据实现方式,手动执行modprobe或者将modprobe自动化为启动脚本的一部分。当os702确定内核装置模块706依赖于代理模块704时,os702将在步骤710中加载并初始化代理模块704。代理模块704在步骤712中执行内部初始化,以准备在步骤714中加载内核装置模块706。然后,在步骤714中加载内核装置模块706之后,内核装置模块706在步骤716中调用函数“register_driver”以向代理模块704注册。为了本论述的目的,假定内核装置模块706是要为系统的特定装置加载的初始装置驱动程序。因此,由于内核装置模块706是要为特定装置加载的初始装置驱动程序,因此在步骤718中,代理模块704将其与内核装置模块706的该实例相关联的内部表标记为“活动”,并且为特定装置执行硬件的首次初始化。

内核装置模块706不会向os702注册为装置驱动程序,而是将向代理模块704注册为装置驱动程序。代理模块704将充当内核装置模块706的替代os。总线(例如,外围部件互连(pci))装置标识符(id)对于代理模块704是透明的。代理模块704从内核装置模块706获得装置id。这在各版本的代理模块704与各版本的内核装置模块706之间增加了另一级别的独立性。代理模块704将使用内核装置模块706提供的装置id代表内核装置模块706向os702注册其自身的驱动程序。内核装置模块706向代理模块704传递函数指针表,代理模块704将使用这些函数指针作为对内核装置模块706的回调。为了安全起见,代理模块704制作函数指针表的副本。这可以防止内核装置模块706故意恶意地或无意地(例如,由于错误)更改该表。

在循环721中,os702在步骤722中搜索与给定装置id匹配的装置,并为每个匹配的装置id调用代理模块704的.probe函数。os702将对与内核装置模块706的装置id表中的装置id匹配的所有装置执行此操作。接收到对.probe函数的调用之后,代理模块704将不执行任何硬件装置初始化。而是,装置初始化将由内核装置模块706执行。代理模块704将为内核装置模块706的每个匹配装置id调用.probe回调函数。在一个实现方式中,代理模块704利用除os参数之外的额外参数来调用内核装置模块706的.probe函数。该额外参数指示负载是驱动程序的初始负载还是先前驱动程序的替换。对于序列图700中所示的实现方式,代理模块704将使用额外参数来通知内核装置模块706这是驱动程序的初始负载。响应于接收到这是驱动程序的初始负载的通知,内核装置模块706将执行完整的硬件初始化。

一旦所有装置都已被探测和初始化,内核装置模块706将进入其正常运行时模式。在运行时期间,可以影响装置和内核装置模块706的状态的刺激的示例可以包括邮箱中断、世界切换计时器中断以及来自硬件仿真器的通知。来宾os中的来宾驱动程序将使用邮箱中断为内核装置模块706生成通知。当内核装置模块706接收到邮箱中断时,内核装置模块706将调度邮箱工作队列上的工作项,以供以后处理。当os702可用时,os702将执行工作队列上的工作。在一个实现方式中,内核装置模块706以可编程的间隔处理世界切换计时器中断。在一个实现方式中,可编程的间隔在3毫秒(ms)至5ms的范围内。在每个间隔,内核装置模块都将在世界切换工作队列中调度世界切换请求。

在各种实现方式中,硬件仿真器和内核装置模块706通过ioctl调用(硬件仿真器→内核装置模块706)和sysfs调用(内核装置模块706→硬件仿真器)彼此通信。在一个实现方式中,硬件仿真器是快速仿真器(qemu)。当硬件仿真器需要内核装置模块706处理一些工作时,硬件仿真器将打开ioctl属性、发送请求、然后关闭该属性。当内核装置模块706从ioctl调用返回时,工作已完成。响应于调用方的线程上的调用,直接在内核装置模块706中完成工作。就像世界切换和邮箱中断的情况一样,不涉及工作队列。当内核装置模块706有工作要硬件仿真器做时,内核装置模块706将在缓冲区中放置命令,并发出信号通知硬件仿真器实例正在等待的属性。当硬件仿真器已完成工作时,硬件仿真器将读取缓冲区并用ioctl调用进行响应。

内核装置模块706将保持在循环731中,以检测和处理刺激,直到内核装置模块706被替换或卸载为止。在一个实现方式中,在内核装置模块706的正常运行时期间,内核装置模块706独立于代理模块704运行。换句话说,在该实现方式中,代理模块704不涉及装置的单根输入/输出虚拟化(sriov)操作。在一个实现方式中,代理模块704负责更新或替换内核装置模块706。在该实现方式中,如果内核装置模块706尝试从系统中卸载,或者如果较新的内核装置模块尝试替换内核装置模块706,则激活代理模块704。

现在转到图8,示出了在加载新的内核装置模块810时的交互的一个实现方式的序列图。当新内核装置模块810被加载到系统上时,新内核装置模块810将向代理模块805注册而不是向os注册。新内核装置模块版本810不知道已经在运行现有的内核装置模块815。新内核装置模块版本810将尝试以与通过调用register_driver()给定函数来向代理模块805注册而向代理模块805注册现有内核装置模块版本815的方式相同的方式来向代理模块805注册。在步骤820中,新内核装置模块版本810将函数指针表和装置id表两者都传递给代理模块805。

在一个实现方式中,新内核装置模块810的加载将触发实时内核装置模块更新过程,并且不需要进一步的用户交互。在一个实现方式中,成功时移除现有内核装置模块版本815,或者如果检测到错误则移除新内核装置模块版本810。实时内核装置模块版本更新的一个目标是能够在不中断正在运行的客户端会话的情况下更新内核装置模块可执行代码。这包括代码的向前和向后的更新。为了能够进行完整的更新,期望的是更新之前存在的所有实时客户端会话在更新之后也将处于活动状态。如果新内核装置模块810支持与现有内核装置模块815支持的装置相同的装置,则新内核装置模块810被注册为这些装置的新装置驱动程序。可替代地,如果新内核装置模块810不能支持与现有内核装置模块815支持的装置相同的装置,则中止更新,并记录错误说明。

现在参考图9,示出了在加载新内核装置模块810时的交互的一个实现方式的序列图。图9意图继续图8的论述。当将装置的控制权从现有内核装置模块815转移到新内核装置模块810时,静态数据被从现有内核装置模块815发送到新内核装置模块810。在传送静态数据之后,现有内核装置模块815被静默,以便将瞬态数据从现有内核装置模块815传送到新内核装置模块810。

在一个实现方式中,为了在过渡到新的装置驱动程序时传送敏感瞬态数据,装置的状态应该是稳定的。在该实现方式中,装置仍然可以运行,但是内核装置模块已知的其状态无法改变。在一个实现方式中,识别了可以改变软件和/或装置的状态的刺激。在一个实现方式中,这些刺激包括邮箱中断、世界切换中断以及来自硬件仿真器的通知。在其他实现方式中,识别并停止了其他刺激以防止装置状态改变。在框910中,通过停止这些识别出的刺激来使现有内核装置模块815静默,以防止在传送敏感瞬态数据期间发生任何状态改变。

现在转到图10,示出了使现有内核装置模块版本1010静默的一个实现方式的序列图。为了本论述的目的,假定新内核装置模块版本1005通过替换现有内核装置模块版本1010来接任作为给定装置的装置驱动程序。在一个实现方式中,给定装置是gpu,而在其他实现方式中,给定装置是各种其他装置(例如,网络控制器、存储装置)中的任一种。为了替换现有内核装置模块版本1010,将使现有内核装置模块版本1010静默。在一个实现方式中,现有内核装置模块版本1010的静默由新内核装置模块版本1005启动,但是执行各种动作以达到静默状态的是现有内核装置模块版本1010。在一个实现方式中,通过停止在主机计算系统上执行的多个线程来使现有内核装置模块版本1010静默。在一个实现方式中,停止的线程包括调度程序、邮箱和ioctl线程。在一个实现方式中,每个线程都有一个相关联的标志(针对每个适配器),该标志将指示该线程是否可以接受新工作。

在一个实现方式中,要停止的第一线程是步骤1015中的调度程序线程。设置调度程序线程的标志将向内核装置模块中的世界切换调度程序指示:调度程序线程不再能够启动新的调度程序请求(即,防止进一步的世界切换发生)。调度程序线程首先停止,因为邮箱线程可能会尝试生成重新启动调度程序的请求。注意,调度程序线程仍然能够继续处理进行中的请求,但是一旦调度程序线程已停止,调度程序线程就无法启动新请求。如果调用重新启动调度程序线程,则该调用将被忽略。

在一个实现方式中,在步骤1020中停止邮箱线程之前,在步骤1015中停止调度程序线程。当来宾驱动程序保持互斥存取模式时,来宾驱动程序还将保持世界切换互斥锁。世界切换互斥锁防止世界切换到任何其他虚拟函数(vf)。当来宾驱动程序(经由邮箱消息)释放互斥模式或超时时,将释放世界切换互斥锁。邮箱线程将使释放互斥模式的请求优先于授予互斥模式的请求。如果邮箱线程正在运行,并且存在释放互斥模式的请求,则该请求将处于进行中。在等待调度程序线程停止之前,允许邮箱线程完成互斥模式的释放。注意,如果保持互斥模式,并且工作队列上没有待处理的互斥模式释放,则可以在传送瞬态状态期间停止调度程序线程并将互斥锁状态传送到内核装置模块版本1005。换句话说,实时更新无需等待互斥模式完成就可以完成实时更新。

在步骤1020中停止邮箱线程,以防止邮箱线程接受任何新工作。邮箱线程的新工作源于来宾驱动程序发出进入或退出互斥模式的请求。在一个实现方式中,禁用邮箱中断而不是停止来宾驱动程序。来宾驱动程序仍然可以尝试触发邮箱中断,但是邮箱中断将不会得到处理。中断请求将保存在邮箱状态寄存器中,并且稍后可以进行轮询以确定在禁用中断时是否生成了任何工作请求。当邮箱线程在处理工作项时,可能会发生步骤1020中的停止邮箱线程的请求。也可能存在排队等待邮箱线程的工作项。设置标志并不指示邮箱线程将处于空闲状态。下一步是在步骤1025中等待邮箱线程停止。

在步骤1020中请求停止邮箱线程之后,进行中的工作项将被处理完成,但是不会启动新的工作项。队列上的任何工作项都将被传送到新内核装置模块版本1005,以便在传送瞬态数据期间进行处理。在一个实现方式中,在步骤1025处,现有内核装置模块版本1010等待邮箱线程停止,并且调度程序线程停止,之后在步骤1035中,停止ioctl线程。通常,邮箱工作项也将需要来自vmm的响应。为了接收到该响应而不死锁,允许ioctl线程继续运行,直到在步骤1025中邮箱线程停止为止。在步骤1035中请求ioctl线程停止之后,现有内核装置模块版本1010在步骤1040中等待ioctl线程停止。现有内核装置模块版本1010等待直到任何未完成的工作都已完成,然后才将成功响应返回到新内核装置模块版本1005。当任何未完成的工作都已完成时,将瞬态数据从现有内核装置模块版本1010传送到新内核装置模块版本1005,并且然后将装置的控制权传递给新内核装置模块版本1005。

现在转到图11,示出了用于加载内核装置模块的方法1100的一个实现方式。出于论述的目的,按顺序次序示出此实现方式中的步骤和图12的那些步骤。然而,应注意,在所描述的方法的各种实现方式中,所描述的要素中的一个或多个同时执行,以不同于所示的次序执行,或者被完全省略。还在需要时执行其他附加的要素。本文所述的各种系统或设备中的任一者被配置为实现方法1100。

向代理模块注册给定版本的装置驱动程序,其中给定版本的装置驱动程序被配置为管理软件应用程序与给定装置之间的交互(框1105)。在一个实现方式中,该装置是gpu。在其他实现方式中,该装置是各种其他类型的处理或外围装置中的任一种。接下来,代理模块确定先前版本的装置驱动程序是否已经加载到给定装置的系统上并且正在执行(条件框1110)。如果先前版本的装置驱动程序已经加载到系统上并且正在执行(条件框1110,“是”分支),则代理模块向给定版本的装置驱动程序提供第一指示,其中第一指示指定先前版本的装置驱动程序已经被加载(框1115)。代理模块还向给定版本的装置驱动程序提供指向先前版本的装置驱动程序的指针(框1120)。响应于接收到第一指示,给定版本的装置驱动程序放弃了装置的硬件初始化(框1125)。给定版本的装置驱动程序使用指针与先前版本的装置驱动程序进行通信,以处置装置的控制权从先前版本的装置驱动程序到给定版本的装置驱动程序的转移(框1130)。在已经将装置的控制权从先前版本的装置驱动程序转移到给定版本的装置驱动程序之后,停用先前版本的装置驱动程序(框1135)。在框1135之后,方法1100结束。

如果先前版本的装置驱动程序尚未加载到系统上并且正在执行(条件框1110,“否”分支),则代理模块向给定版本的装置驱动程序提供第二指示,其中第二指示与第一指示不同(框1140)。而且,代理模块向os注册为给定版本的装置驱动程序(框1145)。换句话说,代理模块将给定版本的装置驱动程序仿真到os。同样响应于接收到第二指示,给定版本的装置驱动程序使装置执行硬件初始化例程(框1150)。同样响应于接收到第二指示,给定版本的装置驱动程序开始管理装置(框1155)。在框1155之后,方法1100结束。应注意,在各种实现方式中,对安装在系统上的每个新版本的装置驱动程序执行方法1100。

现在参考图12,示出了用于使第一版本的装置驱动程序静默以便将装置的控制权从第一版本的装置驱动程序转移到第二版本的装置驱动程序的方法1200的一个实现方式。第二版本的装置驱动程序接收第一版本的装置驱动程序已经在管理计算系统的给定装置的指示(框1205)。在一个实现方式中,第二版本的装置驱动程序响应于向代理模块进行注册而接收指示。响应于接收到该指示,生成停止调度程序线程的请求(框1210)。在一个实现方式中,通过设置对应标志来停止调度程序线程,该标志向来宾驱动程序指示调度程序线程不能再启动新的调度程序请求。接下来,生成停止邮箱线程的请求(框1215)。在框1215中生成停止邮箱线程的请求,以防止邮箱线程接受任何新工作。然后,第一版本的装置驱动程序等待邮箱线程停止(框1220)。接下来,第一版本的装置驱动程序等待调度程序线程停止(框1225)。然后,生成停止ioctl线程的请求(框1230)。接下来,系统等待ioctl线程停止(框1235)。然后,将瞬态数据从第一版本的装置驱动程序传送到第二版本的装置驱动程序(框1240)。接下来,将装置的控制权从第一版本的装置驱动程序转移到第二版本的装置驱动程序(框1245)。在框1245之后,方法1200结束。

在各种实现方式中,使用软件应用程序的程序指令来实现本文所述的方法和/或机制。例如,可由通用或专用处理器执行的程序指令是预期的。在各种实现方式中,此类程序指令由高级编程语言表示。在其他实现方式中,程序指令从高级编程语言编译成二进制形式、中间形式或其他形式。可替代地,编写描述硬件的行为或设计的程序指令。此类程序指令是由诸如c等高级编程语言表示。可替代地,使用诸如verilog等硬件设计语言(hdl)。在各种实现方式中,程序指令存储在多种非暂时性计算机可读存储介质中的任一种上。在使用期间,计算系统可访问存储介质,以将程序指令提供到计算系统以用于程序执行。一般来讲,此类计算系统至少包括一个或多个存储器和被配置为执行程序指令的一个或多个处理器。

应当强调的是,上述实现方式仅是实现方式的非限制性示例。一旦完全了解以上公开内容,众多变化和修改对于本领域技术人员来说将变得显而易见。所附权利要求意图被解释为包含所有此类变化和修改。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1