Linux kernel 如果复制到用户处于RW锁中,会发生什么情况?
我在读写锁中实现了copy_to_user()。我的问题是,如果在执行copy_to_用户时出现页面错误,那么即使锁没有释放,它还会得到服务吗?如果没有,我如何才能做到这一点?任何想法都将非常感激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()
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我在答案中添加了这一点。