Hi,

On 03/30/2016 09:09 PM, Boris BREZILLON wrote:

[...]

> +int sg_alloc_table_from_buf(struct sg_table *sgt, const void *buf, size_t 
> len,
> +                         const struct sg_constraints *constraints,
> +                         gfp_t gfp_mask)
> +{
> +     struct sg_constraints cons = { };
> +     size_t remaining, chunk_len;
> +     const void *sg_buf;
> +     int i, ret;
> +
> +     if (constraints)
> +             cons = *constraints;
> +
> +     ret = sg_check_constraints(&cons, buf, len);
> +     if (ret)
> +             return ret;
> +
> +     sg_buf = buf;
> +     remaining = len;
> +     i = 0;
> +     sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons)
> +             i++;
> +
> +     ret = sg_alloc_table(sgt, i, gfp_mask);
> +     if (ret)
> +             return ret;
> +
> +     sg_buf = buf;
> +     remaining = len;
> +     i = 0;
> +     sg_for_each_chunk_in_buf(sg_buf, remaining, chunk_len, &cons) {
> +             if (is_vmalloc_addr(sg_buf)) {
> +                     struct page *vm_page;
> +
> +                     vm_page = vmalloc_to_page(sg_buf);
> +                     if (!vm_page) {
> +                             ret = -ENOMEM;
> +                             goto err_free_table;
> +                     }
> +
> +                     sg_set_page(&sgt->sgl[i], vm_page, chunk_len,
> +                                 offset_in_page(sg_buf));
> +             } else {
> +                     sg_set_buf(&sgt->sgl[i], sg_buf, chunk_len);
> +             }
> +

If the buf address is in PKMAP_BASE - PAGE_OFFSET-1 region (I have
observed that JFFS2 FS provides buffers in above region to MTD layer),
if CONFIG_DEBUG_SG is set then sg_set_buf() will throw a BUG_ON() as
virt_addr_is_valid() will return false. Is there a sane way to handle
buffers of PKMAP_BASE region with sg_*  APIs?
Or, is the function sg_alloc_table_from_buf() not to be used with such
buffers?


-- 
Regards
Vignesh
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to