【Intel QAT】SYM类算法轮询回调过程分析

  本文分析的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注册“引擎回调函数”,此过程是在加解密操作之前进行的;

猜你喜欢

转载自blog.csdn.net/KXue0703/article/details/124510349