将u32映射到指针的低开销方案

时间:2013-04-26 22:51:57

标签: algorithm linux-kernel

基本上我想设置一个map / hash / idr_type_of_thing,它将唯一的u32映射到唯一的指针值(在当前映射集中是唯一的)。它的核心是u32是DMA引擎看到的缓冲区的物理地址,指针是包含缓冲区本身和缓冲区的其他元数据的缓冲区的上下文blob。当我从DMA引擎获得一些事件时,它提供了u32,并且我希望找到用于进一步处理的上下文blob(比如释放DMA映射,空闲缓冲区等)。 DMA引擎只能返回u32物理地址。是否有一些低开销的快速方案来进行这种映射,而没有提出一些运行良好的哈希函数? BTW,这种映射的任何好的哈希函数都能很好地工作(没有碰撞?)?

可以同时存在的映射总数是一些固定的小数字,比如512。

感谢。

2 个答案:

答案 0 :(得分:1)

嗯,有include/linux/rbtree.h,内核当前的红黑树实现看似最直观。 (目前在htmldocs下没有为此生成任何内容,但也请查看Documentation/rbtree.txt)。二叉树(任何类型)具有O(log n)检索时间。但是,它也有当前形式的弊端 - 密钥仍然存储在blob中,因此,每次比较密钥时都会触摸blob的缓存行。如果有人不先做这件事,我希望有一天能解决这个问题。

除了这个缺点,红黑树是一种非常有效的算法。

编辑:嗯,实际上我可以想到其他一些缺点,但它现在可能是内核中最好的。如果您对此感到特别不满意,我会在您实施新内容时为您欢呼!!!

答案 1 :(得分:1)

将指针放入DMA存储器中,就在实际DMA缓冲区之前或之后。 (使用哪一个取决于您的对齐要求以及您是否知道DMA缓冲区的大小。)