我在读写锁中实现了 copy_to_user() 。我的问题是,如果在执行 copy_to_user 时出现页面错误,即使没有释放锁,它也会得到服务吗?如果没有,我怎样才能做到这一点?任何想法都会非常感激。
read_lock(x);
copy_to_user((a), (b), (c));
read_unlock(x);
谢谢!
我在读写锁中实现了 copy_to_user() 。我的问题是,如果在执行 copy_to_user 时出现页面错误,即使没有释放锁,它也会得到服务吗?如果没有,我怎样才能做到这一点?任何想法都会非常感激。
read_lock(x);
copy_to_user((a), (b), (c));
read_unlock(x);
谢谢!
读写锁是自旋锁的优化用例(用于对全局/静态/共享数据进行大量读取的路径)。因为它们本质上是自旋锁,所以你不应该在它们的临界区中放置任何可能休眠的东西(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 杀死用户进程上下文!