【发布时间】:2017-02-17 21:26:48
【问题描述】:
我正在阅读设备驱动程序的源代码。
它尝试 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) 会更好吗?为什么?
【问题讨论】:
-
这是来自工作设备驱动程序的真正源代码吗?对
lock进行了锁定,但是随后对另一个spinlock_t变量sq->avmi_lock进行了解锁。这看起来不正确。 -
would it be better ...- 这在很大程度上取决于您的需求。实际上,您正在为消息选择容器类型:list(每个元素分配,每个元素都需要包含到下一个元素的链接)或array / vector(所有元素一次分配,任何元素都可以通过整数索引访问)。
标签: c memory linux-kernel kernel linux-device-driver