gpt4 book ai didi

linux - 如果列表不为空,list_empty 返回 1(非零)

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:32 27 4
gpt4 key购买 nike

我正在研究 Linux 设备驱动程序代码。我无法透露这段代码的具体用途。我会尽力解释我的情况。当我们收到 USB 中断,表明有来自 USB 的数据时,下面的代码将在中断上下文中执行。数据将以 URB 的形式到达,我们将它们转换为 block ,将它们添加到 Linux 循环双向链表中以进行进一步处理。

     spin_lock(&demod->demod_lock);          
/* Delete node from free list */
list_del(&chunk->list_head);
/* Add it to full list */
list_add_tail(&chunk->list_head,&demod->ChunkRefList.full);
/* Update chunk status */
chunk->status=CHUNKDESC_FULL_LIST;
/* Increment the chunks assigned to application */
demod->stats.assigned.c++;
spin_unlock(&demod->demod_lock);

printk("Value returned by list_empty is %d ",list_empty(&demod->ChunkRefList.full));

我再说一遍,这段代码是在中断上下文中执行的。我使用此代码作为嵌入式系统的一部分,该系统永远显示音频和视频(AV)。

大约 12 小时后,AV 被卡住,当我分析时,我看到返回的 list_empty(&demod->ChunkRefList.full) 的值始终为 0x1。通常在 AV 正常播放的情况下,其值为 0x0,表明列表不为空。

正如你所看到的,当上面的代码执行时,它首先向完整列表添加一个节点,并检查完整列表是否为空。理想情况下,该值应始终为 0x0。为什么它的值为0x1

I am monitoring the value of list_empty(&demod->ChunkRefList.full) using timedoctor applicaiton which doesn't introduce any overhead in interrupt context. I have used printk above to make you understand that I am printing its value.

最佳答案

终于,我解决了这个问题。

由于代码是在中断上下文中实现的,因此使用 list_del 后跟 list_add_tail 会导致问题。

因此,我删除了这两个宏并引入了 list_move_tail 宏来解决该问题。

通过使用list_move_tail,我们不需要删除节点并将其添加到新列表中。内核将处理这两个操作。

因此,总而言之,最好在中断上下文中使 Linux 链接列表操作尽可能少。

关于linux - 如果列表不为空,list_empty 返回 1(非零),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32069456/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com