<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 16.4.?一些其他的細節 本節涵蓋塊層的幾個其他的方面, 對于高級讀者可能有興趣. 對于編寫一個正確的驅動下面的內容都不需要, 但是它們在某些情況下可能是有用的. ### 16.4.1.?命令預準備 塊層為驅動提供一個進制來檢查和預處理請求, 在它們被從 elv_next_request 返回前. 這個機制允許驅動提前設立真正的驅動器命令, 決定是否這個請求可被完全處理, 或者進行其他的維護工作. 如果你想使用這個特性, 創建一個命令準備函數, 它要適應這個原型: ~~~ typedef int (prep_rq_fn) (request_queue_t *queue, struct request *req); ~~~ 請求結構包含一個成員 cmd, 它是一個 BLK_MAX_CDB 字節的數組; 這個數組可被這個準備函數用來存儲實際的硬件命令(或者任何其他的有用信息). 這個函數應當返回一個下列的值: BLKPREP_OK 命令準備正常進行, 并且這個請求可被傳遞給你的驅動的請求函數. BLKPREP_KILL 這個請求不能完成; 它帶有一個錯誤碼而失敗. BLKPREP_DEFER 這個請求這次無法完成. 它位于隊列的前面, 但是不能傳遞給請求函數. 準備函數被 elv_next_request 在請求返回到你的驅動之前立刻調用. 如果這個函數返回 BLKPREP_DEFER, 從 elv_next_request 返回給你的驅動的返回值是 NULL. 這個操作描述可能是有用的, 如果, 例如你的設備已達到它能夠等候的請求的最大數目. 為使塊層調用你的準備函數, 傳遞它到: ~~~ void blk_queue_prep_rq(request_queue_t *queue, prep_rq_fn *func); ~~~ 缺省地, 請求隊列沒有準備函數. ### 16.4.2.?被標識的命令排隊 可同時有多個請求被激活的硬件, 常常支持某種被標識的命令排隊(TCQ). TCQ 簡單地說是關聯一個整數 "tag" 到每個請求的技術, 注意當驅動器完成每個請求時, 他可告知驅動是哪一個. 在以前的內核版本, 實現 TCQ 的塊驅動不得不自己做所有的工作; 在2.6, 一個 TCQ 支持框架已經被添加到塊層, 以給所有的驅動來使用. 如果你的驅動器進行標記命令排隊, 你應當在初始化時通知內核這個事實, 使用: ~~~ int blk_queue_init_tags(request_queue_t *queue, int depth, struct blk_queue_tag *tags); ~~~ 這里, queue 是你的請求隊列, 而 depth 是你的設備能夠在任何時間擁有的等待的標記請求的數目. tags 是一個可選的指針指向一個 struct blk_queue_tag 結構數組; 必須有 depth 個. 正常地, tags 可用 NULL, 并且 blk_queue_init_tags 分配這個 數組. 如果, 但是, 你需要和多個設備分享通用的 tags, 你可傳遞這個標記數組指針(存儲在 queue_tags 成員)從另一個請求隊列. 你應當從不真正自己分配這個標記數組; 塊層需要初始化這個數組并且不輸出這個初始化函數給模塊. 因為 blk_queue_init_tags 分配內存, 它可能失敗. 在那個情況下它返回一個負的錯誤碼給調用者. 如果你的設備可處理的標記的數目改變了, 你可通知內核, 使用: ~~~ int blk_queue_resize_tags(request_queue_t *queue, int new_depth); ~~~ 這個隊列鎖必須在這個調用期間被持有. 這個調用可能失敗, 返回一個負錯誤碼. 一個標記和一個請求結構的關聯被 blk_queue_start_tag 來完成, 它必須在成員隊列鎖被持有時調用: ~~~ int blk_queue_start_tag(request_queue_t *queue, struct request *req); ~~~ 如果一個 tag 可用, 這個函數分配它給這個請求, 存儲這個標識號在 req->tag, 并且返回 0. 它還從隊列中解除這個請求, 并且連接它到它自己的標識跟蹤結構, 因此你的驅動應當小心不從隊列中解除這個請求, 如果在使用標識. 如果沒有標識可用, blk_queue_start_tag 將這個請求留在隊列并且返回一個非零值. 當一個給定的請求的所有的傳送都已完成, 你的驅動應當返回標識, 使用: ~~~ void blk_queue_end_tag(request_queue_t *queue, struct request *req); ~~~ 再一次, 你必須持有隊列鎖, 在調用這個函數之前. 這個調用應當在 end_that_request_first 返回 0 之后進行(意味著這個請求完成), 但要在調用 end_that_request_last 之前. 記住這個請求已經從隊列中解除, 因此它對于你的驅動在此點這樣做可能是一個錯誤. 如果你需要找到關聯到一個給定標識上的請求(當驅動器報告完成, 例如), 使用 blk_queue_find_tag: ~~~ struct request *blk_queue_find_tag(request_queue_t *qeue, int tag); ~~~ 返回值是關聯的請求結構, 除非有些事情已經真的出錯了. 如果事情真地出錯了, 你的請求可能發現它自己不得不復位或者對其中一個它的設備進行一些其他的大動作. 在這種情況下, 任何等待中的標識命令將不會完成. 塊層提供一個函數可用幫助在這種情況下恢復: ~~~ void blk_queue_invalidate_tags(request_queue_t *queue); ~~~ 這個函數返回所有的等待的標識給這個池, 并且將關聯的請求放回請求隊列. 你調用這個函數時必須持有隊列鎖.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看