C 内核哈希表.h哈希表的动态大小

C 内核哈希表.h哈希表的动态大小,c,kernel,C,Kernel,我已经编写了使用的模块,目前它工作得非常好,但是我想将其从静态哈希表大小更改为可配置的大小 我应该如何从以下内容更改初始化: DEFINE_HASHTABLE(my_hash_table, 10); 动态的,这样我可以在模块作为参数加载时传递哈希表的大小 我试过了 struct hlist\u head*my\u hash\u table及其对应的kmallocs()但没有成功,并给出以下错误: include/linux/bug.h:33:45: error: negative width

我已经编写了使用的模块,目前它工作得非常好,但是我想将其从静态哈希表大小更改为可配置的大小

我应该如何从以下内容更改初始化:

DEFINE_HASHTABLE(my_hash_table, 10);
动态的,这样我可以在模块作为参数加载时传递哈希表的大小

我试过了
struct hlist\u head*my\u hash\u table
及其对应的
kmallocs()
但没有成功,并给出以下错误:

include/linux/bug.h:33:45: error: negative width in bit-field ‘<anonymous>’
 #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
                                             ^

include/linux/hashtable.h:27:35: note: in definition of macro ‘hash_min’
  (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits))
                                   ^

include/linux/hashtable.h:23:25: note: in expansion of macro ‘ilog2’
 #define HASH_BITS(name) ilog2(HASH_SIZE(name))
                         ^

include/linux/compiler-gcc.h:44:28: note: in expansion of macro ‘BUILD_BUG_ON_ZERO’
 #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
                            ^

include/linux/kernel.h:54:59: note: in expansion of macro ‘__must_be_array’
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
                                                           ^

include/linux/hashtable.h:22:26: note: in expansion of macro ‘ARRAY_SIZE’
 #define HASH_SIZE(name) (ARRAY_SIZE(name))
                          ^

include/linux/hashtable.h:23:31: note: in expansion of macro ‘HASH_SIZE’
 #define HASH_BITS(name) ilog2(HASH_SIZE(name))
                               ^

include/linux/hashtable.h:56:48: note: in expansion of macro ‘HASH_BITS’
  hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
                                                ^

HashTable.c:103:9: note: in expansion of macro ‘hash_add’
         hash_add(my_hash_table, &entry->entry, entry->hashed_key);
include/linux/bug.h:33:45:错误:位字段中的负宽度“”
#在0(e)(sizeof(struct{int:-!!(e);}))上定义构建错误
^
include/linux/hashtable.h:27:35:注意:在宏'hash_min'的定义中
(sizeof(val)条目,条目->散列键);

要更改

DEFINE_HASHTABLE(my_hash_table, 10);
。。。对于动态分配的等价物,您可以使用如下内容:

#define MY_HT_SZ 1024

struct hlist_head *my_hash_table;
int i;

my_hash_table = kmalloc(MY_HT_SZ * sizeof(struct hlist_head), GFP_KERNEL);

if (!my_hash_table)
    goto error_handler;

for (i = 0; i < MY_HT_SZ; i++)
    INIT_HLIST_HEAD(&my_hash_table[i]);
#定义MY_HT_SZ 1024
结构hlist\u head*我的哈希表;
int i;
my_hash_table=kmalloc(my_HT_SZ*sizeof(struct hlist_head),GFP_内核);
如果(!我的哈希表)
转到错误处理程序;
对于(i=0;i
内核已经支持“动态”哈希表。这叫做相对论散列表。在以下非常好的LWN文章中可以找到更多信息和解释它如何工作/如何使用它:以及

为什么要使用
kmalloc()
?如果不确定,请阅读“是”,我也知道vmalloc,但目前这不是一个问题。您是否查看并研究了内部结构?到目前为止,您的努力是什么,哪里失败了?重新调整哈希表的大小通常是个坏主意。调整大小后,必须重新计算所有现有哈希项,如果有一个包含许多项的大型表,则效率不高。更好的办法是从一开始就巧妙地调整表的大小。@BingBang我认为OP不想动态调整哈希表的大小,而只是用特定的大小动态初始化它。我已经尝试过了,但由于哈希表的原因,它不起作用。h宏,请参见outputyes,正如我前面说过的,已经尝试过了,在哈希_添加时给出宏错误,相应地更新了问题这些宏保护您不访问数组外的元素。您不能使用这些宏,因为动态分配宏时大小未知。帮你自己一个忙,研究一下如何使用
hlist\u add\u head
:那么你说这个真正是哈希表API的宏只对数组有效?而不是在动态分配的指向数组的指针上?这些是用于预定义哈希表的方便宏。我有一种感觉,您缺少一些有关哈希表的基本知识。也许你应该提供更多你想要实现的信息。你的数据是什么?您使用的是哪个哈希函数?我不想在加载模块时调整大小,我想使用哈希表大小参数加载模块,而不是使用编译时间。在这种情况下,您需要了解哈希表只不过是hlist_头的数组,所以您应该接受哈希表大小作为参数(最好是2的幂)。然后使用kmalloc/kzalloc分配适当大小的数组。也就是说,忘记定义散列表。相反,您将有类似于struct hlist_head*hash_table=kzalloc的内容(sizeof(struct hlist_head)*NUM u of_元素,GFP_内核);是的,这就是我所做的,查看hashtable中有错误的输出。h宏将粘贴更多代码,而不仅仅是初始化,否则我们无法推断您正在尝试做什么以及为什么会出现这些错误。不要使用kzalloc。当然会(目前)工作,但内部字段应作为黑盒处理。最好使用
INIT\u HLIST\u HEAD
宏。