代码之家  ›  专栏  ›  技术社区  ›  Harty

在Linux内核中,打印“虚拟设备上的死循环”会导致什么样的死循环?

  •  0
  • Harty  · 技术社区  · 16 年前

    当内核资源的“当前锁所有者”是当前CPU时,打印就会出现。我不知道什么会导致这种情况。在网上找不到太多。有人调试过这个吗?

    3 回复  |  直到 16 年前
        1
  •  2
  •   user250320    16 年前

    这是一条诊断信息,旨在引起注意可能的死锁。

    在这种特殊情况下,有一个由旋转锁保护的传输队列。除了这个锁之外,传输队列还维护一个“所有者”字段,该字段包含一个在持有这个spinlock时设置的cpuid。

    正如您可能知道的,如果请求的锁已经被占用,spin lock将始终在CPU上旋转。

    所以 at this location 代码检查CPU是否与锁定spinlock的CPU相同。

    如果它不在同一个CPU上,它将执行可能需要获取锁的操作。

    另一方面,如果它是同一个CPU,有些事情是不正确的,即我们实际上应该在旋转等待锁。可能是因为一个错误的中断处理程序/下半部分。

    因为这表示可能出现死锁,所以会打印一条诊断消息:)。

        2
  •  0
  •   raghava    16 年前

    调试?你的意思是,需要知道 where in the source ?

        3
  •  0
  •   Harty    16 年前

    好的,明白了。

    当您在Linux内核的单个执行上下文(例如,SoftIRQ的单个实例等)中两次输入相同的函数(引用相同的内核资源)时,通常会发生这种情况。 解决此问题的方法是确保在同一执行上下文中不重复输入函数两次。如果发生这种情况,这是代码中的一个错误。