From: Christoph Hellwig <hch@infradead.org>
To: John Stultz <john.stultz@linaro.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
Laura Abbott <labbott@redhat.com>,
Benjamin Gaignard <benjamin.gaignard@linaro.org>,
Greg KH <gregkh@linuxfoundation.org>,
Sumit Semwal <sumit.semwal@linaro.org>,
Liam Mark <lmark@codeaurora.org>,
Brian Starkey <Brian.Starkey@arm.com>,
"Andrew F . Davis" <afd@ti.com>, Chenbo Feng <fengc@google.com>,
Alistair Strachan <astrachan@google.com>,
dri-devel@lists.freedesktop.org
Subject: Re: [RFC][PATCH 2/5 v2] dma-buf: heaps: Add heap helpers
Date: Fri, 15 Mar 2019 02:06:46 -0700 [thread overview]
Message-ID: <20190315090646.GC4470@infradead.org> (raw)
In-Reply-To: <1551819273-640-3-git-send-email-john.stultz@linaro.org>
> +static void *dma_heap_map_kernel(struct heap_helper_buffer *buffer)
> +{
> + struct scatterlist *sg;
> + int i, j;
> + void *vaddr;
> + pgprot_t pgprot;
> + struct sg_table *table = buffer->sg_table;
> + int npages = PAGE_ALIGN(buffer->heap_buffer.size) / PAGE_SIZE;
> + struct page **pages = vmalloc(array_size(npages,
> + sizeof(struct page *)));
> + struct page **tmp = pages;
> +
> + if (!pages)
> + return ERR_PTR(-ENOMEM);
> +
> + pgprot = PAGE_KERNEL;
> +
> + for_each_sg(table->sgl, sg, table->nents, i) {
> + int npages_this_entry = PAGE_ALIGN(sg->length) / PAGE_SIZE;
> + struct page *page = sg_page(sg);
> +
> + WARN_ON(i >= npages);
> + for (j = 0; j < npages_this_entry; j++)
> + *(tmp++) = page++;
This should probably use nth_page.
That being said I really wish we could have a more iterative version
of vmap, where the caller does a get_vm_area_caller and then adds
each chunk using another call, including the possibility of mapping
larger than PAGE_SIZE contigous ones. Any chance you could look into
that?
> + ret = remap_pfn_range(vma, addr, page_to_pfn(page), len,
> + vma->vm_page_prot);
So the same chunk could be mapped to userspace and vmap, and later on
also DMA mapped. Who is going to take care of cache aliasing as I
see nothing of that in this series?
> + if (buffer->kmap_cnt) {
> + buffer->kmap_cnt++;
> + return buffer->vaddr;
> + }
> + vaddr = dma_heap_map_kernel(buffer);
> + if (WARN_ONCE(!vaddr,
> + "heap->ops->map_kernel should return ERR_PTR on error"))
> + return ERR_PTR(-EINVAL);
> + if (IS_ERR(vaddr))
> + return vaddr;
> + buffer->vaddr = vaddr;
> + buffer->kmap_cnt++;
The cnt manioulation is odd. The normal way to make this readable
is to use a postfix op on the check, as that makes it clear to everyone,
e.g.:
if (buffer->kmap_cnt++)
return buffer->vaddr;
..
> + buffer->kmap_cnt--;
> + if (!buffer->kmap_cnt) {
> + vunmap(buffer->vaddr);
> + buffer->vaddr = NULL;
> + }
Same here, just with an infix.
> +static inline void INIT_HEAP_HELPER_BUFFER(struct heap_helper_buffer *buffer,
> + void (*free)(struct heap_helper_buffer *))
> +{
> + buffer->private_flags = 0;
> + buffer->priv_virt = NULL;
> + mutex_init(&buffer->lock);
> + buffer->kmap_cnt = 0;
> + buffer->vaddr = NULL;
> + buffer->sg_table = NULL;
> + INIT_LIST_HEAD(&buffer->attachments);
> + buffer->free = free;
> +}
There is absolutely no reason to inlines this as far as I can tell.
Also it would seem much simpler to simply let the caller assign the
free callback.
next prev parent reply other threads:[~2019-03-15 9:06 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-05 20:54 [RFC][PATCH 0/5 v2] DMA-BUF Heaps (destaging ION) John Stultz
2019-03-05 20:54 ` [RFC][PATCH 1/5 v2] dma-buf: Add dma-buf heaps framework John Stultz
2019-03-06 16:12 ` Benjamin Gaignard
2019-03-06 16:57 ` John Stultz
2019-03-15 8:55 ` Christoph Hellwig
2019-03-06 16:27 ` Andrew F. Davis
2019-03-06 19:03 ` John Stultz
2019-03-06 21:45 ` Andrew F. Davis
2019-03-15 8:54 ` Christoph Hellwig
2019-03-15 20:24 ` Andrew F. Davis
2019-03-15 20:18 ` Laura Abbott
2019-03-15 20:49 ` Andrew F. Davis
2019-03-15 21:29 ` John Stultz
2019-03-15 22:44 ` Laura Abbott
2019-03-18 4:38 ` Sumit Semwal
2019-03-18 4:41 ` Sumit Semwal
2019-03-19 12:08 ` Brian Starkey
2019-03-19 15:24 ` Andrew F. Davis
2019-03-21 21:16 ` John Stultz
2019-03-27 14:53 ` Greg KH
2019-03-28 6:09 ` John Stultz
2019-03-05 20:54 ` [RFC][PATCH 2/5 v2] dma-buf: heaps: Add heap helpers John Stultz
2019-03-13 20:18 ` Liam Mark
2019-03-13 21:48 ` Andrew F. Davis
2019-03-13 22:57 ` Liam Mark
2019-03-13 23:42 ` Andrew F. Davis
2019-03-15 9:06 ` Christoph Hellwig [this message]
2019-03-19 15:03 ` Andrew F. Davis
2019-03-21 20:01 ` John Stultz
2019-03-19 14:26 ` Brian Starkey
2019-03-21 20:11 ` John Stultz
2019-03-21 20:35 ` Andrew F. Davis
2019-03-21 20:43 ` Andrew F. Davis
2019-03-05 20:54 ` [RFC][PATCH 3/5 v2] dma-buf: heaps: Add system heap to dmabuf heaps John Stultz
2019-03-06 16:01 ` Benjamin Gaignard
2019-03-11 5:48 ` John Stultz
2019-03-13 20:20 ` Liam Mark
2019-03-13 22:49 ` John Stultz
2019-03-15 9:06 ` Christoph Hellwig
2019-03-05 20:54 ` [RFC][PATCH 4/5 v2] dma-buf: heaps: Add CMA heap to dmabuf heapss John Stultz
2019-03-06 16:05 ` Benjamin Gaignard
2019-03-21 20:15 ` John Stultz
2019-03-15 9:06 ` Christoph Hellwig
2019-03-15 20:08 ` John Stultz
2019-03-19 14:53 ` Brian Starkey
2019-03-05 20:54 ` [RFC][PATCH 5/5 v2] kselftests: Add dma-heap test John Stultz
2019-03-06 16:14 ` Benjamin Gaignard
2019-03-06 16:35 ` Andrew F. Davis
2019-03-06 18:19 ` John Stultz
2019-03-06 18:32 ` Andrew F. Davis
2019-03-06 17:01 ` John Stultz
2019-03-15 20:07 ` Laura Abbott
2019-03-15 20:13 ` John Stultz
2019-03-15 20:49 ` Laura Abbott
2019-03-13 20:23 ` Liam Mark
2019-03-13 20:11 ` [RFC][PATCH 0/5 v2] DMA-BUF Heaps (destaging ION) Liam Mark
2019-03-13 22:30 ` John Stultz
2019-03-13 23:29 ` Liam Mark
2019-03-19 16:54 ` Benjamin Gaignard
2019-03-19 16:59 ` Andrew F. Davis
2019-03-19 21:58 ` Rob Clark
2019-03-19 22:36 ` John Stultz
2019-03-20 9:16 ` Benjamin Gaignard
2019-03-20 14:44 ` Andrew F. Davis
2019-03-20 15:59 ` Benjamin Gaignard
2019-03-20 16:11 ` John Stultz
2019-03-15 20:34 ` Laura Abbott
2019-03-15 23:15 ` Jerome Glisse
2019-03-16 0:16 ` John Stultz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190315090646.GC4470@infradead.org \
--to=hch@infradead.org \
--cc=Brian.Starkey@arm.com \
--cc=afd@ti.com \
--cc=astrachan@google.com \
--cc=benjamin.gaignard@linaro.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=fengc@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=john.stultz@linaro.org \
--cc=labbott@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lmark@codeaurora.org \
--cc=sumit.semwal@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).