一旦 urb 被正確地創建,並且被 USB 驅動初始化, 它已准備好被提交給 USB 核心來發送 出到 USB 設備. 這通過調用函數 usb_submit_urb 實現:
int usb_submit_urb(struct urb *urb, int mem_flags);
urb 參數是一個指向 urb 的指針, 它要被發送到設備. mem_flags 參數等同於傳遞給 kmalloc 調用的同樣的參數, 並且用來告訴 USB 核心如何及時分配任何內存緩沖在這個 時間.
在 urb 被成功提交給 USB 核心之后, 應當從不試圖存取 urb 結構的任何成員直到完成 函數被調用.
因為函數 usb_submit_urb 可被在任何時候被調用(包括從一個中斷上下文), mem_flags 變量的指定必須正確. 真正只有 3 個有效值可用, 根據何時 usb_submit_urb 被調用:
GFP_ATOMIC
這個值應當被使用無論何時下面的是真:
· 調用者處於一個 urb 完成處理者, 一個中斷, 一個后半部, 一個 tasklet, 或者一個時鍾回調.
調用者持有一個自旋鎖或者讀寫鎖. 注意如果正持有一個旗標, 這個值不必要.
current->state 不是 TASK_RUNNING. 狀態一直是 TASK_RUNNING 除非驅動已 自己改變 current 狀態.
GFP_NOIO
這個值應當被使用, 如果驅動在塊 I/O 補丁中. 它還應當用在所有的存儲類型的 錯誤處理補丁中.
GFP_KERNEL
這應當用在所有其他的情況中, 不屬於之前提到的類別.