本文分析的QAT源码版本为:QAT1.7.L.4.13.0-00009
,源码下载地址为:https://01.org/intel-quickassist-technology,比较遗憾的是Intel并没有开放QAT源码的版本控制,一旦有新版本的QAT发布,老版本的QAT就下架了,再也找不到了。
言归正传,本文主要从SYM回调函数的注册(初始化)及轮询响应等两个方面进行详细的分析。
1. 函数注册(初始化)
在使用Engine+Lib(QAT)实现加解密的过程中,所涉及的主要函数如下:
(1) Engine回调函数(执行加密操作的之前才会调用)
(2) QAT回调函数(service初始化时调用)
(3) QAT的ring响应函数(service初始化时调用)
1.1 Engine回调函数注册
Engine通过调用QAT接口函数 cpaCySymInitSession()
将Engine的回调函数注册到QAT。如下图所示:
在函数cpaCySymInitSession()
中进一步调用函数LacSym_InitSession()
,并在该函数中实现了回调函数的注册,如下图所示。此时,Engine注册的回调函数就被保存在了Session的上下文中了,待回调的时候使用。
至此,Engine的回调函数注册完成。
1.2 QAT回调函数注册
在Engine调用函数 icp_sal_userStart()
进行server服务初始化的过程中调用LacSymCb_CallbacksRegister()
实现了回调函数的初始化操作。
如上图所示,LacSymQat_RespHandlerRegister()
是真正注册回调的函数接口,在注册回调函数的时候,根据当前的不同操作类型注册不同的回调函数(QAT注册的回调函数都是一样的);
如上图所示,LacSymQat_RespHandlerRegister
将回调函数放在全局变量 respHandlerSymTbl[]
中,至此QAT的回调注册完成。
1.3 QAT响应函数注册
Engine在调用函数 icp_sal_userStart()
进行server服务初始化的过程中调用 icp_adf_transCreateHandle()
实现了响应函数的注册。
响应函数:LacSymQat_SymRespHandler()
,通过全局变量respHandlerSymTbl[]
与QAT的注册的回调函数联系起来。
2. 轮询
轮询的入口函数是:icp_sal_CyPollInstance()
,在该函数中调用了函数icp_adf_pollInstance()
,紧接着调用了adf_pollRing()
,最终底层真正轮询的函数为:adf_user_notify_msgs_poll()
,该函数的实现如下所示:
3. 总结
上面从“函数的注册”及“响应轮询”两个方面总结了轮询回调的主要实现过程,下图对轮询响应的全过程进行了初步的总结。
服务(service)初始化:QAT回调函数的注册、Ring响应函数的注册;
会话(session)初始化:Engine向QAT注册“引擎回调函数”,此过程是在加解密操作之前进行的;