2017-01-12 40 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

相關問題