*参照元 [#wee9b246] #backlinks *説明 [#of645f8d] -パス: [[linux-4.4.1/include/linux/scatterlist.h]] -FIXME: これは何? --ページのかたまり(scatterlist)の配列 2つを連結する。 -ページのかたまり(scatterlist)の配列 2つを連結する。 **引数 [#c4c977d6] -struct scatterlist *prv --連続したページのかたまり(scatterlist)の配列 --[[linux-4.4.1/scatterlist]] -unsigned int prv_nents --prv の長さ、つまり struct scatterlist の配列の要素数 --連結後の最後の要素だけは特別扱いされる。 ---連結後の prv の最後の要素 prv[prv_nents - 1] はリストの連結用として使われるため、ページのかたまりを指さなくなる。 ---連結後の prv[prv_nents - 1] の page_link はページ struct page * ではなく、次の scatterlist の先頭(struct scatterlist *)を保持しているので、sg_page() に渡してはいけない。 ---[[linux-4.4.1/sg_page()]] -struct scatterlist *sgl --prv に連結する、scatterlist の配列 **返り値 [#g8dda06d] -なし **参考 [#z3da937c] *実装 [#pba24e5f] /** * sg_chain - Chain two sglists together * @prv: First scatterlist * @prv_nents: Number of entries in prv * @sgl: Second scatterlist * * Description: * Links @prv@ and @sgl@ together, to form a longer scatterlist. * **/ static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents, struct scatterlist *sgl) { /* * offset and length are unused for chain entry. Clear them. */ prv[prv_nents - 1].offset = 0; prv[prv_nents - 1].length = 0; -連結後の最後の要素だけは特別扱いされる。 --prv の最後の要素 prv[prv_nents - 1] はリストの連結用として使われるため、ページのかたまりを指さない、このため offset, length は無効となる。 /* * Set lowest bit to indicate a link pointer, and make sure to clear * the termination bit if it happens to be set. */ prv[prv_nents - 1].page_link = ((unsigned long) sgl | 0x01) & ~0x02; } -prv[prv_nents - 1] の page_link はページ struct page * ではなく、次の scatterlist の先頭(struct scatterlist *)を保持する。 *コメント [#f994bd1a]