kmalloc 很多结构,我应该一次或分别 kmalloc 它们

kmalloc many struct, should I kmalloc them all at a time or respectively

我正在阅读设备驱动程序的源代码。

它尝试 kmalloc 16 struct foo

spin_lock_bh(&sq->lock);
for (i=0; i<16; i++) {
        msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
        if (!msg)
                break;
        msg->next = sq->msg_first;
        sq->msg_first = msg; 
        sq->nr_msgs++;
}    
spin_unlock_bh(&sq->lock);

那么,kmalloc(sizeof(*msg) * 16, GFP_ATOMIC) 会更好吗?为什么?

不看源代码就很难下定论。以这种方式进行内存分配的基本原理可能与我们在这里提出的任何方法都大不相同。

一个合理的理由可能是这样。如您所见,分配的项目在单链表中链接在一起。这可能只是一个初始项目池,可以在驱动程序运行时扩展或缩短。初始池中的某些项目可能会在以后被删除和释放。如果您要在单个分配中分配此内存,您将无法做到这一点。由于项目链接到链表中,我认为这不会像 Tsyvarev 建议的那样用作数组。

我必须说,基本原理往往可以用一个词来描述:因为。因为代码的作者决定这样做更方便,或者更清晰等等。不幸的是,这种情况一直在发生。只要那些地方不重要(即不在热路径中),就可以了。你无法解决所有问题。

编辑
如以下回复中所述,分配用于 最多 16 个项目。这可能是一个深思熟虑的设计决定。如果分配在某个时候失败,它就会跳出分配循环,从 16 个项目中分配尽可能多的项目。这实际上符合这样的想法,即这些项目可能构成 的初始池 [=] =24=] 16 项.

此代码尝试分配 up 到 16 struct foos。但是如果没有足够的内存那么它仍然会分配一些。您建议的更改是尝试分配 16 个 struct foo,如果不能分配则失败。如果只有部分分配空间怎么办?

此外,对于一次分配,分配器必须找到一个连续的内存区域,而对于多次分配,它可以处理碎片化的内存。