Linux kernel 如果复制到用户处于RW锁中,会发生什么情况?

Linux kernel 如果复制到用户处于RW锁中,会发生什么情况?,linux-kernel,preemption,rwlock,Linux Kernel,Preemption,Rwlock,我在读写锁中实现了copy_to_user()。我的问题是,如果在执行copy_to_用户时出现页面错误,那么即使锁没有释放,它还会得到服务吗?如果没有,我如何才能做到这一点?任何想法都将非常感激 read_lock(x); copy_to_user((a), (b), (c)); read_unlock(x); 谢谢 读写器锁是自旋锁的优化用例(用于对全局/静态/共享数据进行大量读取的路径)。 因为它们本质上是自旋锁,所以不应该在它们的关键部分中放入任何可能会休眠的内容(schedule()

我在读写锁中实现了copy_to_user()。我的问题是,如果在执行copy_to_用户时出现页面错误,那么即使锁没有释放,它还会得到服务吗?如果没有,我如何才能做到这一点?任何想法都将非常感激

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

谢谢

读写器锁是自旋锁的优化用例(用于对全局/静态/共享数据进行大量读取的路径)。 因为它们本质上是自旋锁,所以不应该在它们的关键部分中放入任何可能会休眠的内容(schedule())

用户页面错误是可能发生睡眠的情况;因此,您不应该在rw lock临界部分中复制u[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杀死用户进程上下文

您是否锁定了页面错误处理程序关心的任何内容?读取锁定是否会禁用抢占?如果是这样的话,页面错误是否有可能因为抢占被禁用而无法得到服务?好吧,这很糟糕,但是如果他这样做了会发生什么呢?@Gilad我在答案中添加了这一点。