-----Original Message-----No, not only for debug, I meant if the buffers are uncached, the SW will only mmap
From: Laura Abbott [mailto:labbott@xxxxxxxxxx]
Sent: Thursday, January 03, 2019 6:31 AM
To: Zengtao (B) <prime.zeng@xxxxxxxxxxxxx>; sumit.semwal@xxxxxxxxxx
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>; Arve HjÃnnevÃg
<arve@xxxxxxxxxxx>; Todd Kjos <tkjos@xxxxxxxxxxx>; Martijn Coenen
<maco@xxxxxxxxxxx>; Joel Fernandes <joel@xxxxxxxxxxxxxxxxx>;
devel@xxxxxxxxxxxxxxxxxxxx; dri-devel@xxxxxxxxxxxxxxxxxxxxx;
linaro-mm-sig@xxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
Subject: Re: [PATCH] staging: android: ion: add buffer flag update ioctl
On 12/23/18 6:47 PM, Zengtao (B) wrote:
Hi laura:sumit.semwal@xxxxxxxxxx
-----Original Message-----
From: Laura Abbott [mailto:labbott@xxxxxxxxxx]
Sent: Friday, December 21, 2018 4:50 AM
To: Zengtao (B) <prime.zeng@xxxxxxxxxxxxx>;
HjÃnnevÃgCc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>; Arve
Coenen<arve@xxxxxxxxxxx>; Todd Kjos <tkjos@xxxxxxxxxxx>; Martijn
you<maco@xxxxxxxxxxx>; Joel Fernandes <joel@xxxxxxxxxxxxxxxxx>;
devel@xxxxxxxxxxxxxxxxxxxx; dri-devel@xxxxxxxxxxxxxxxxxxxxx;
linaro-mm-sig@xxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
Subject: Re: [PATCH] staging: android: ion: add buffer flag update
ioctl
On 12/19/18 5:39 PM, Zengtao (B) wrote:
Hi laura:sumit.semwal@xxxxxxxxxx
-----Original Message-----
From: Laura Abbott [mailto:labbott@xxxxxxxxxx]
Sent: Thursday, December 20, 2018 2:10 AM
To: Zengtao (B) <prime.zeng@xxxxxxxxxxxxx>;
HjÃnnevÃgCc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>; Arve
Coenen<arve@xxxxxxxxxxx>; Todd Kjos <tkjos@xxxxxxxxxxx>; Martijn
<maco@xxxxxxxxxxx>; Joel Fernandes <joel@xxxxxxxxxxxxxxxxx>;
devel@xxxxxxxxxxxxxxxxxxxx; dri-devel@xxxxxxxxxxxxxxxxxxxxx;
linaro-mm-sig@xxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
Subject: Re: [PATCH] staging: android: ion: add buffer flag update
ioctl
On 12/19/18 9:19 AM, Zeng Tao wrote:
In some usecases, the buffer cached attribute is not determined atcached
allocation time, it's determined just before the real cpu mapping.
And from the memory view of point, a buffer should not have the
attribute util is really mapped by the cpu. So in this patch, we
introduced the new ioctl command to target the requirement.
This is racy and error prone. Can you explain more what problem
good.andare trying to solve?
My use case is like this:
1. There are two process A and B, A takes case of ion buffer
allocation,
pass the buffer fd to B, then B maps and uses it.
2. Process B need to map the buffer with different cached attribute
for different use case, for example, if the buffer is used for pure
software algorithm, then we need to map it as cached, otherwise
non-cached, and B needs to deal with both cases.
And unfortunately the mmap syscall takes no cached flags and we
can't decide the cache attribute when we are doing the mmap, so I
introduce new the ioctl even though I think the solution is not as
uncached buffers.
Thanks for the explanation, this was about the use case I expected.
I'm pretty sure I had this exact problem once upon a time and we
didn't come up with a solution. I'd still like to get rid of uncached
buffers in general and just use cached buffers (see
http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/201
8-N
ovember/128842.html)
What's your usecase for uncached buffers?
Some buffers are only used by HW, in this case, we tend to use
But sometimes the SW need to read few buffer contents for debug
purpose and no synchronization is needed.
If this is primarily for debug, that's not really a compelling reason to
support uncached buffers. It's incredibly difficult to do uncached buffers
correctly I'd rather spend effort on making the cached use cases work
better.
them for debug or even don't need to mmap them.
So for the two kinds of buffers:
1. uncached: only the HW need to access it, the SW don't need to mmap it or just for debug.
2. cached: both the HW and the SW need to access it.
The ION is designed as a generalized memory manager, I think we should cover as many
requirements as we can in the ION design, so I 'd rather that we keep the uncached support.
And I donât quite understand the difficulty you mentioned to support the uncached buffers, would
you explain a little more about it.
Thanks
Zengtao
*page,
+++++++++++++++++
Signed-off-by: Zeng Tao <prime.zeng@xxxxxxxxxxxxx>
---
drivers/staging/android/ion/ion-ioctl.c | 4 ++++
drivers/staging/android/ion/ion.c | 17
drivers/staging/android/ion/ion.h | 1 +++++++++++++++++++++++
drivers/staging/android/uapi/ion.h | 22
4 files changed, 44 insertions(+)heap_id_mask, unsigned int flags)
diff --git a/drivers/staging/android/ion/ion-ioctl.c
b/drivers/staging/android/ion/ion-ioctl.c
index a8d3cc4..60bb702 100644
--- a/drivers/staging/android/ion/ion-ioctl.c
+++ b/drivers/staging/android/ion/ion-ioctl.c
@@ -12,6 +12,7 @@
union ion_ioctl_arg {
struct ion_allocation_data allocation;
+ struct ion_buffer_flag_data update;
struct ion_heap_query query;
};
@@ -83,6 +84,9 @@ long ion_ioctl(struct file *filp, unsigned int
cmd, unsigned long arg)
break;
}
+ case ION_IOC_BUFFER_UPDATE:
+ ret = ion_buffer_update(data.update.fd, data.update.flags);
+ break;
case ION_IOC_HEAP_QUERY:
ret = ion_query_heaps(&data.query);
break;
diff --git a/drivers/staging/android/ion/ion.c
b/drivers/staging/android/ion/ion.c
index 9907332..f1404dc 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -436,6 +436,23 @@ int ion_alloc(size_t len, unsigned int
return fd;
}
+int ion_buffer_update(unsigned int fd, unsigned int flags) {
+ struct dma_buf *dmabuf;
+ struct ion_buffer *buffer;
+
+ dmabuf = dma_buf_get(fd);
+
+ if (!dmabuf)
+ return -EINVAL;
+
+ buffer = dmabuf->priv;
+ buffer->flags = flags;
+ dma_buf_put(dmabuf);
+
+ return 0;
+}
+
int ion_query_heaps(struct ion_heap_query *query)
{
struct ion_device *dev = internal_dev; diff --git
a/drivers/staging/android/ion/ion.h
b/drivers/staging/android/ion/ion.h
index c006fc1..99bf9ab 100644
--- a/drivers/staging/android/ion/ion.h
+++ b/drivers/staging/android/ion/ion.h
@@ -199,6 +199,7 @@ int ion_heap_pages_zero(struct page
buffersize_t size, pgprot_t pgprot);
int ion_alloc(size_t len,
unsigned int heap_id_mask,
unsigned int flags);
+int ion_buffer_update(unsigned int fd, unsigned int flags);
/**
* ion_heap_init_shrinker
diff --git a/drivers/staging/android/uapi/ion.h
b/drivers/staging/android/uapi/ion.h
index 5d70098..99753fc 100644
--- a/drivers/staging/android/uapi/ion.h
+++ b/drivers/staging/android/uapi/ion.h
@@ -74,6 +74,20 @@ struct ion_allocation_data {
__u32 unused;
};
+/**
+ * struct ion_buffer_flag_data - metadata passed from userspace
+for update
+ * buffer flags
+ * @fd: file descriptor of the buffer
+ * @flags: flags passed to the buffer
+ *
+ * Provided by userspace as an argument to the ioctl */
+
+struct ion_buffer_flag_data {
+ __u32 fd;
+ __u32 flags;
+}
+
#define MAX_HEAP_NAME 32
/**
@@ -116,6 +130,14 @@ struct ion_heap_query {
struct ion_allocation_data)
/**
+ * DOC: ION_IOC_BUFFER_UPDATE - update the specified ion
informationheapsflags
+ *
+ * Takes an ion_buffer_flag_data structure and returns the result
+of the
+ * buffer flag update operation.
+ */
+#define ION_IOC_BUFFER_UPDATE _IOWR(ION_IOC_MAGIC, 1, \
+ struct ion_buffer_flag_data)
+/**
* DOC: ION_IOC_HEAP_QUERY - information about available
*
* Takes an ion_heap_query structure and populates
about