草庐IT

spin_lock_irq

全部标签

linux - Linux flock(fd, LOCK_EX|LOCK_NB) 会虚假地失败吗?

考虑这样一种情况,其中两个进程并发尝试使用flock(fd,LOCK_EX|LOCK_NB)对某个文件放置独占锁。如前所述,尝试是非阻塞,因此这两个进程之一应该会因EWOULDBLOCK而失败。这是我的问题:flock()的(Linux)实现是否保证在每种情况下两个进程中的一个进程会成功?或者,是否有可能两者都以EWOULDBLOCK失败,即使没有其他人进行干扰?简而言之,flock(fd,LOCK_EX|LOCK_NB)是否会因EWOULDBLOCK错误地失败?我主要对Linux提供的flock()版本感兴趣,但欢迎提供有关其他系统(如OSX)上的flock()的信息.此外,我假设无

linux - 是否有必要在 softirq 上下文中调用 rcu_read_lock

rcu_read_lock的实现是disablepreempt和barrier。软中断上下文不会被抢占。那么是否有必要在softirq上下文中调用rcu_read_lock。屏障重要吗? 最佳答案 是的,有必要使用rcu_read_lock访问受rcu保护的指针,即使在softirq上下文中也是如此。正如您所指出的,rcu_read_lock和softirqs的一些实现(例如:TINY_RCU)使得它没有损坏的风险,即使您不使用rcu_read_lock。但是,这不是rcuapi的保证,只是因为具体实现的“hack”。这个hack可

linux - 是否有必要在 softirq 上下文中调用 rcu_read_lock

rcu_read_lock的实现是disablepreempt和barrier。软中断上下文不会被抢占。那么是否有必要在softirq上下文中调用rcu_read_lock。屏障重要吗? 最佳答案 是的,有必要使用rcu_read_lock访问受rcu保护的指针,即使在softirq上下文中也是如此。正如您所指出的,rcu_read_lock和softirqs的一些实现(例如:TINY_RCU)使得它没有损坏的风险,即使您不使用rcu_read_lock。但是,这不是rcuapi的保证,只是因为具体实现的“hack”。这个hack可

c - Spin Loop 在缓存一致性方面的开销

假设一个内核中的线程正在对一个变量进行旋转,该变量将由另一个内核中运行的线程进行更新。我的问题是缓存级别的开销是多少。等待线程是否会缓存变量,因此在写入线程写入该变量之前不会在总线上引起任何流量?如何减少这种开销。x86pause指令有帮助吗? 最佳答案 我相信所有现代x86CPU都使用MESIprotocol.因此,旋转的“读取器”线程可能会以“独占”或“共享”模式缓存数据副本,在旋转时不会产生内存总线流量。只有当另一个核心写入该位置时,它才必须执行跨核心通信。[更新]这样的“自旋锁”只有在您不会长时间自旋时才是一个好主意。如果在

c - Spin Loop 在缓存一致性方面的开销

假设一个内核中的线程正在对一个变量进行旋转,该变量将由另一个内核中运行的线程进行更新。我的问题是缓存级别的开销是多少。等待线程是否会缓存变量,因此在写入线程写入该变量之前不会在总线上引起任何流量?如何减少这种开销。x86pause指令有帮助吗? 最佳答案 我相信所有现代x86CPU都使用MESIprotocol.因此,旋转的“读取器”线程可能会以“独占”或“共享”模式缓存数据副本,在旋转时不会产生内存总线流量。只有当另一个核心写入该位置时,它才必须执行跨核心通信。[更新]这样的“自旋锁”只有在您不会长时间自旋时才是一个好主意。如果在

c - request_irq 和 __interrupt 的区别

据我所知,两者都用于注册中断处理程序。我在内核代码中看到了很多request_irq调用,但甚至没有看到一个__interrupt调用。__interrupt是从用户空间注册处理程序的某种方式吗? 最佳答案 request_irq本质上是对request_threaded_irq的包装调用,它分配IRQ资源并启用IRQ。这是从kernel/irq/manage.c,Line#1239中的注释block中解释的.基本上,如果您需要为某种设备设置中断处理,您需要使用request_irq。确保您正在使用的任何子系统还没有为request

c - request_irq 和 __interrupt 的区别

据我所知,两者都用于注册中断处理程序。我在内核代码中看到了很多request_irq调用,但甚至没有看到一个__interrupt调用。__interrupt是从用户空间注册处理程序的某种方式吗? 最佳答案 request_irq本质上是对request_threaded_irq的包装调用,它分配IRQ资源并启用IRQ。这是从kernel/irq/manage.c,Line#1239中的注释block中解释的.基本上,如果您需要为某种设备设置中断处理,您需要使用request_irq。确保您正在使用的任何子系统还没有为request

[20230616]One Deadlock of 'row cache lock' and 'library cache lock'.txt

[20230616]OneDeadlockof'rowcachelock'and'librarycachelock'.txt--//链接http://ksun-oracle.blogspot.com/2023/06/one-deadlock-of-row-cache-lock-and.html演示一个有趣的测试.--//他测试采用cluster表,我估计普通表这样操作不会出现这样的情况,先重复作者的测试看看.1.环境:SCOTT@test01p>@ver1PORT_STRING                   VERSION       BANNER                    

linux - 如何在 Linux 中避免共享 IRQ 竞争

我正在考虑嵌入式Linux项目(还没有硬件)中即将出现的情况,其中两个外部芯片需要共享一条物理IRQ线。这条线在硬件中能够实现边沿触发,但不能实现电平触发中断。查看Linux中的共享irq支持,我了解到这与两个单独的驱动程序一起工作的方式是每个驱动程序都会调用它们的中断处理程序,检查它们的硬件并在适当时进行处理。但是我想象以下竞争条件,并且想知道我是否遗漏了什么或者可以采取什么措施来解决这个问题。假设有两个外部中断源,设备A和B:设备B中断发生,IRQ激活IRQ边缘导致Linux核心中断处理程序运行设备A的ISR运行,发现没有待处理的中断设备中断发生,IRQ保持活跃(线或)设备B的IS

linux - 如何在 Linux 中避免共享 IRQ 竞争

我正在考虑嵌入式Linux项目(还没有硬件)中即将出现的情况,其中两个外部芯片需要共享一条物理IRQ线。这条线在硬件中能够实现边沿触发,但不能实现电平触发中断。查看Linux中的共享irq支持,我了解到这与两个单独的驱动程序一起工作的方式是每个驱动程序都会调用它们的中断处理程序,检查它们的硬件并在适当时进行处理。但是我想象以下竞争条件,并且想知道我是否遗漏了什么或者可以采取什么措施来解决这个问题。假设有两个外部中断源,设备A和B:设备B中断发生,IRQ激活IRQ边缘导致Linux核心中断处理程序运行设备A的ISR运行,发现没有待处理的中断设备中断发生,IRQ保持活跃(线或)设备B的IS