*参照元 [#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]