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

Algorithm 将u32映射到指针的低开销方案,algorithm,linux-kernel,Algorithm,Linux Kernel,基本上,我想设置一个映射/hash/idr_type_of_thing,将唯一的u32映射到唯一的指针值(在当前映射集中是唯一的)。它的核心是,u32是DMA引擎看到的缓冲区的物理地址,指针是关于该缓冲区的上下文blob,其中包含缓冲区本身和关于该缓冲区的其他元数据。当我从DMA引擎获得一些事件时,它提供了u32,我希望从中找到上下文blob以进行进一步处理(如释放DMA映射、释放缓冲区等)。DMA引擎只能返回u32物理地址。是否有一些低开销的快速方案来实现这种映射,而不产生一些运行良好的哈希函

基本上,我想设置一个映射/hash/idr_type_of_thing,将唯一的u32映射到唯一的指针值(在当前映射集中是唯一的)。它的核心是,u32是DMA引擎看到的缓冲区的物理地址,指针是关于该缓冲区的上下文blob,其中包含缓冲区本身和关于该缓冲区的其他元数据。当我从DMA引擎获得一些事件时,它提供了u32,我希望从中找到上下文blob以进行进一步处理(如释放DMA映射、释放缓冲区等)。DMA引擎只能返回u32物理地址。是否有一些低开销的快速方案来实现这种映射,而不产生一些运行良好的哈希函数?顺便说一句,对于这种类型的映射,有什么好的哈希函数可以很好地工作(没有冲突?)吗

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


谢谢。

Hmm,有一个
include/linux/rbtree.h
,内核当前的红黑树实现看起来是最直观的。(目前在htmldocs下没有为此生成任何内容,但请参阅
文档/rbtree.txt
)。二叉树(任何类型)的检索时间为O(logn)。然而,它当前的形式也有缺点——键仍然存储在blob中,因此,每次比较键时都会触摸blob的缓存线。我希望有一天,如果别人不先做的话,我能解决这个问题

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


编辑:嗯,实际上我可以想到一些其他的缺点,但它可能是目前内核中最好的。如果你对它感到特别不满意,我会在你实施新东西时为你加油

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

坦白地说,我希望看到有人为此投入更现代、更方便缓存的算法。除了专利问题,朱迪树可能是最吸引人的。谢谢。我希望能找到一些没有锁的O(1):)谢谢。想知道您是否知道关于在skb中使用cb的任何规则。注释表明它可以由任何层自由使用,但它可能已经被上层使用(一些用途似乎是用于TCP和IP选项),但可能还有更多。也许他们希望在tx_完成回调中保留“状态”…用适当的标记作为一个新问题提问(但您可能希望先阅读skbuff.h中的注释)。