scatterlist: introduce sg_unmark_end
This is useful in places that recycle the same scatterlist multiple times, and do not want to incur the cost of sg_init_table every time in hot paths. Acked-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Родитель
0d2e1a2926
Коммит
c8164d8931
|
@ -110,7 +110,7 @@ new_segment:
|
|||
if (!sg)
|
||||
sg = sglist;
|
||||
else {
|
||||
sg->page_link &= ~0x02;
|
||||
sg_unmark_end(sg);
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
|
||||
|
|
|
@ -143,7 +143,7 @@ new_segment:
|
|||
* termination bit to avoid doing a full
|
||||
* sg_init_table() in drivers for each command.
|
||||
*/
|
||||
(*sg)->page_link &= ~0x02;
|
||||
sg_unmark_end(*sg);
|
||||
*sg = sg_next(*sg);
|
||||
}
|
||||
|
||||
|
|
|
@ -171,6 +171,22 @@ static inline void sg_mark_end(struct scatterlist *sg)
|
|||
sg->page_link &= ~0x01;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_unmark_end - Undo setting the end of the scatterlist
|
||||
* @sg: SG entryScatterlist
|
||||
*
|
||||
* Description:
|
||||
* Removes the termination marker from the given entry of the scatterlist.
|
||||
*
|
||||
**/
|
||||
static inline void sg_unmark_end(struct scatterlist *sg)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
BUG_ON(sg->sg_magic != SG_MAGIC);
|
||||
#endif
|
||||
sg->page_link &= ~0x02;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_phys - Return physical address of an sg entry
|
||||
* @sg: SG entry
|
||||
|
|
Загрузка…
Ссылка в новой задаче