如果copy_to_user处于RW锁定状态会发生什么?

时间:2016-05-26 00:30:59

标签: linux-kernel preemption rwlock

我在读写锁中实现了copy_to_user()。我的问题是,如果在执行copy_to_user时出现页面错误,即使没有释放锁,它是否会得到服务?如果没有,我怎么能实现这个目标?任何想法都会非常感激。

read_lock(x);
copy_to_user((a), (b), (c));
read_unlock(x);

谢谢!

1 个答案:

答案 0 :(得分:1)

读取器 - 写入器锁是自旋锁的优化用例(意图用于对全局/静态/共享数据具有大量读取的路径)。 因为它们本质上是自旋锁,所以你不应该把它们放在可能睡觉的关键部分(schedule())。

用户页面错误是可能发生睡眠的情况;因此,您不应该在rw-lock临界区中执行copy_ [to | from] _user()。

如果你做了什么? 页面错误将在任何原子上下文中被禁用 - 例如使用rwlocks等。用户空间错误将导致控制转向故障处理代码;在x86上,它在这里:

arch/x86/mm/fault.c:__do_page_fault()
...
  /*   
     * If we're in an interrupt, have no user context or are running
     * in a region with pagefaults disabled then we must not take the fault
     */
    if (unlikely(faulthandler_disabled() || !mm)) {
        bad_area_nosemaphore(regs, error_code, address);
        return;
    }

...

bad_area_nosemaphore()基本上会通过SIGSEGV杀死用户进程上下文!