2017-01-12 44 views
0

我想推迟工作到workqueue,并通过这使用我的多个处理器内核。此外,我想在完成工作后将数据复制回用户空间缓冲区。现在我知道用户空间地址也依赖于用户空间进程。我已将current传递给工作函数。如何在工作功能中设置正确的上下文,以便我可以安全地在那里使用copy_to_user如何在workqueue(linux,kernel)中使用copy_to_user?

回答

1

copy_to_user intented仅从用户的上下文中调用。从workqueue上下文中调用它是个坏主意。

您可以分配内存块(kmalloc),将其提交给workqueue,等到wokqueue完成后,它在用户上下文中工作(如读,写,ioctl等函数)并将workqueue结果复制到用户空间。

作为另一种方法,你可以分配内核内存和mmap的是用户空间所以内存可通过内核和用户空间的同时可以直接访问。每当workqueue更新内核内存时,数据就变得可用于用户空间。您必须在用户空间和内核空间工作队列之间实现某种同步,以使此方法可行。

uvc_queue.c例如nmap实现。

+0

感谢您的回复。在我的情况下,我想堆叠文件系统。所以例如我得到一个缓冲区(用户空间)的读取请求。现在我分配内核内存(kmalloc)并从子文件系统中读取(在workqueue中使用kernel_read)到我的内核缓冲区。现在,如果我只在所有工作完成后才复制到用户空间缓冲区,我无法并行执行复制 - 我希望它更快。我限于读取和写入来自最顶层文件系统的用户空间的调用,所以我认为我不能使用mmap。 – tofi

+0

@tofi,我怀疑使用乘法内核的并行复制比单核复制要快。小块(适合CORE内部缓存的块)使用多个内核复制无意义。大块复制外部RAM速度的瓶颈。单核写入运行速度比RAM快得多。您只能使用内核内存进行基准测试。如果你发现速度显着提高,那么这是有意义的。 – alexander

相关问题