[PATCH 03/13] scatterlist: Add sg_set_folio()
Zhu Yanjun
yanjun.zhu at linux.dev
Sun Jul 30 11:01:26 UTC 2023
在 2023/6/22 0:45, Matthew Wilcox (Oracle) 写道:
> This wrapper for sg_set_page() lets drivers add folios to a scatterlist
> more easily. We could, perhaps, do better by using a different page
> in the folio if offset is larger than UINT_MAX, but let's hope we get
> a better data structure than this before we need to care about such
> large folios.
>
> Signed-off-by: Matthew Wilcox (Oracle) <willy at infradead.org>
> ---
> include/linux/scatterlist.h | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h
> index ec46d8e8e49d..77df3d7b18a6 100644
> --- a/include/linux/scatterlist.h
> +++ b/include/linux/scatterlist.h
> @@ -141,6 +141,30 @@ static inline void sg_set_page(struct scatterlist *sg, struct page *page,
> sg->length = len;
> }
>
> +/**
> + * sg_set_folio - Set sg entry to point at given folio
> + * @sg: SG entry
> + * @folio: The folio
> + * @len: Length of data
> + * @offset: Offset into folio
> + *
> + * Description:
> + * Use this function to set an sg entry pointing at a folio, never assign
> + * the folio directly. We encode sg table information in the lower bits
> + * of the folio pointer. See sg_page() for looking up the page belonging
> + * to an sg entry.
> + *
> + **/
> +static inline void sg_set_folio(struct scatterlist *sg, struct folio *folio,
> + size_t len, size_t offset)
> +{
> + WARN_ON_ONCE(len > UINT_MAX);
> + WARN_ON_ONCE(offset > UINT_MAX);
> + sg_assign_page(sg, &folio->page);
> + sg->offset = offset;
> + sg->length = len;
> +}
> +
https://elixir.bootlin.com/linux/latest/source/lib/scatterlist.c#L451
Does the following function have folio version?
"
int sg_alloc_append_table_from_pages(struct sg_append_table *sgt_append,
struct page **pages, unsigned int n_pages, unsigned int offset,
unsigned long size, unsigned int max_segment,
unsigned int left_pages, gfp_t gfp_mask)
"
Thanks a lot.
Zhu Yanjun
> static inline struct page *sg_page(struct scatterlist *sg)
> {
> #ifdef CONFIG_DEBUG_SG
More information about the dri-devel
mailing list