*参照元 [#wdcee484]
#backlinks

*説明 [#ae664a94]
-パス: [[linux-4.4.1/lib/scatterlist.c]]

-FIXME: これは何?
--説明

-sg[n] の配列があり、sg[5] が別の scatterlist sg_other[n] にリンクしていたとする。
-sg[0] の先頭から sg_next を連続して読んだ場合、sg[1], sg[2], ..., sg[5] が返され、sg[5] の次は sg_other[0] が返される(はずです、動作は見てません)。
-次の scatterlist を取得する。
--sg[n] の配列があり、sg[5] が別の scatterlist sg_other[n] にリンクしていたとする。
--sg[0] の先頭から sg_next を連続して読んだ場合、sg[1], sg[2], ..., sg[5] が返され、sg[5] の次は sg_other[0] が返される(はずです、動作は見てません)。
 sg[0].page_link ---> [page A][page A+1][page A+2][page A+3]
 |
 | sg_next()
 |
 sg[1].page_link ---> [page B][page B+1][page B+2]
 ...
 sg[4].page_link ---> [page E][page E+1]
 |
 | sg_next()
 |
 sg[5].page_link ---> sg_other[0][1][2]...
 |
 | sg_next()
 |
 sg_other[0].page_link ---> [page F][page F+1][page F+2]
 |
 | sg_next()
 |
 sg_other[1].page_link ---> [page G][page G+1]
 ...

-pagelink は何を指しているか?
-page_link は何を指しているか?
--連結する場合: 次の scatterlist の先頭(struct scatterlist *)
---[[linux-4.4.1/sg_chain()]]
--連結しない場合: ページのかたまりの先頭ページ(struct page *)
---[[linux-4.4.1/sg_page()]]

-下位 2ビットをフラグとして使っているため、scatterlist の配列の先頭は必ず 4バイト境界に合わせる必要がある。
-page_link の下位 2ビットをフラグとして使っているため、scatterlist の配列の先頭は必ず 4バイト境界に合わせる必要がある。


**引数 [#ba3ff20a]
-struct scatterlist *sg
--連続したページのかたまり(scatterlist)
--[[linux-4.4.1/scatterlist]]


**返り値 [#pad19488]
-struct scatterlist *
--次の scatterlist


**参考 [#sa3680c4]


*実装 [#o4692935]
 /**
  * sg_next - return the next scatterlist entry in a list
  * @sg:         The current sg entry
  *
  * Description:
  *   Usually the next entry will be @sg@ + 1, but if this sg element is part
  *   of a chained scatterlist, it could jump to the start of a new
  *   scatterlist array.
  *
  **/
 struct scatterlist *sg_next(struct scatterlist *sg)
 {
 #ifdef CONFIG_DEBUG_SG
-デバッグが有効
--[[linux-4.4.1/CONFIG_DEBUG_SG]]

         BUG_ON(sg->sg_magic != SG_MAGIC);
 #endif
         if (sg_is_last(sg))
                 return NULL;
 
-次が無ければ NULL を返す。
--[[linux-4.4.1/sg_is_last()]]

         sg++;
         if (unlikely(sg_is_chain(sg)))
                 sg = sg_chain_ptr(sg);
 
-sg は配列になっているので、次の要素を指すポインタは sg++ で得られる。
--ただし別の配列と連結されている場合は、sg_chain_ptr() で別の配列の先頭を得る。
--[[linux-4.4.1/unlikely()]]
--[[linux-4.4.1/sg_is_chain()]]
--[[linux-4.4.1/sg_chain_ptr()]]

         return sg;
 }
 EXPORT_SYMBOL(sg_next);
-ライセンスに関わらずシンボルを公開する。
--[[linux-4.4.1/EXPORT_SYMBOL()]]


*コメント [#xae5f038]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS