- 追加された行はこの色です。
- 削除された行はこの色です。
*参照元 [#wdcee484]
#backlinks
*説明 [#ae664a94]
-パス: [[linux-4.4.1/]]
-パス: [[linux-4.4.1/lib/scatterlist.c]]
-FIXME: これは何?
--説明
-次の 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]
...
-page_link は何を指しているか?
--連結する場合: 次の scatterlist の先頭(struct scatterlist *)
---[[linux-4.4.1/sg_chain()]]
--連結しない場合: ページのかたまりの先頭ページ(struct page *)
---[[linux-4.4.1/sg_page()]]
-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]