<div dir="ltr">Hi Kenny,<div><br></div><div>Thanks for the info. Do you mind forwarding the existing discussion to me or have me cc'ed in that thread?</div><div><br></div><div>Best,</div><div>Yiwei</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 30, 2019 at 10:23 PM Kenny Ho <<a href="mailto:y2kenny@gmail.com">y2kenny@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Yiwei,<br>
<br>
I am not sure if you are aware, there is an ongoing RFC on adding drm<br>
support in cgroup for the purpose of resource tracking.  One of the<br>
resource is GPU memory.  It's not exactly the same as what you are<br>
proposing (it doesn't track API usage, but it tracks the type of GPU<br>
memory from kmd perspective) but perhaps it would be of interest to<br>
you.  There are no consensus on it at this point.<br>
<br>
(sorry for being late to the discussion.  I only noticed this thread<br>
when one of the email got lucky and escape the spam folder.)<br>
<br>
Regards,<br>
Kenny<br>
<br>
On Wed, Oct 30, 2019 at 4:14 AM Yiwei Zhang <<a href="mailto:zzyiwei@google.com" target="_blank">zzyiwei@google.com</a>> wrote:<br>
><br>
> Hi Jerome and all folks,<br>
><br>
> In addition to my last reply, I just wanna get some more information regarding this on the upstream side.<br>
><br>
> 1. Do you think this(standardize a way to report GPU private allocations) is going to be a useful thing on the upstream as well? It grants a lot benefits for Android, but I'd like to get an idea for the non-Android world.<br>
><br>
> 2. There might be some worries that upstream kernel driver has no idea regarding the API. However, to achieve good fidelity around memory reporting, we'd have to pass down certain metadata which is known only by the userland. Consider this use case: on the upstream side, freedreno for example, some memory buffer object(BO) during its own lifecycle could represent totally different things, and kmd is not aware of that. When we'd like to take memory snapshots at certain granularity, we have to know what that buffer represents so that the snapshot can be meaningful and useful.<br>
><br>
> If we just keep this Android specific, I'd worry some day the upstream has standardized a way to report this and Android vendors have to take extra efforts to migrate over. This is one of the main reasons we'd like to do this on the upstream side.<br>
><br>
> Timeline wise, Android has explicit deadlines for the next release and we have to push hard towards those. Any prompt responses are very much appreciated!<br>
><br>
> Best regards,<br>
> Yiwei<br>
><br>
> On Mon, Oct 28, 2019 at 11:33 AM Yiwei Zhang <<a href="mailto:zzyiwei@google.com" target="_blank">zzyiwei@google.com</a>> wrote:<br>
>><br>
>> On Mon, Oct 28, 2019 at 8:26 AM Jerome Glisse <<a href="mailto:jglisse@redhat.com" target="_blank">jglisse@redhat.com</a>> wrote:<br>
>>><br>
>>> On Fri, Oct 25, 2019 at 11:35:32AM -0700, Yiwei Zhang wrote:<br>
>>> > Hi folks,<br>
>>> ><br>
>>> > This is the plain text version of the previous email in case that was<br>
>>> > considered as spam.<br>
>>> ><br>
>>> > --- Background ---<br>
>>> > On the downstream Android, vendors used to report GPU private memory<br>
>>> > allocations with debugfs nodes in their own formats. However, debugfs nodes<br>
>>> > are getting deprecated in the next Android release.<br>
>>><br>
>>> Maybe explain why it is useful first ?<br>
>><br>
>><br>
>> Memory is precious on Android mobile platforms. Apps using a large amount of<br>
>> memory, games, tend to maintain a table for the memory on different devices with<br>
>> different prediction models. Private gpu memory allocations is currently semi-blind<br>
>> to the apps and the platform as well.<br>
>><br>
>> By having the data, the platform can do:<br>
>> (1) GPU memory profiling as part of the huge Android profiler in progress.<br>
>> (2) Android system health team can enrich the performance test coverage.<br>
>> (3) We can collect filed metrics to detect any regression on the gpu private memory<br>
>> allocations in the production population.<br>
>> (4) Shell user can easily dump the allocations in a uniform way across vendors.<br>
>> (5) Platform can feed the data to the apps so that apps can do memory allocations<br>
>> in a more predictable way.<br>
>><br>
>>><br>
>>> ><br>
>>> > --- Proposal ---<br>
>>> > We are taking the chance to unify all the vendors to migrate their existing<br>
>>> > debugfs nodes into a standardized sysfs node structure. Then the platform<br>
>>> > is able to do a bunch of useful things: memory profiling, system health<br>
>>> > coverage, field metrics, local shell dump, in-app api, etc. This proposal<br>
>>> > is better served upstream as all GPU vendors can standardize a gpu memory<br>
>>> > structure and reduce fragmentation across Android and Linux that clients<br>
>>> > can rely on.<br>
>>> ><br>
>>> > --- Detailed design ---<br>
>>> > The sysfs node structure looks like below:<br>
>>> > /sys/devices/<ro.gfx.sysfs.0>/<pid>/<type_name><br>
>>> > e.g. "/sys/devices/mali0/gpu_mem/606/gl_buffer" and the gl_buffer is a node<br>
>>> > having the comma separated size values: "4096,81920,...,4096".<br>
>>><br>
>>> How does kernel knows what API the allocation is use for ? With the<br>
>>> open source driver you never specify what API is creating a gem object<br>
>>> (opengl, vulkan, ...) nor what purpose (transient, shader, ...).<br>
>><br>
>><br>
>> Oh, is this a hard requirement for the open source drivers to not bookkeep any<br>
>> data from userland? I think the API is just some additional metadata passed down.<br>
>><br>
>>><br>
>>><br>
>>> > For the top level root, vendors can choose their own names based on the<br>
>>> > value of ro.gfx.sysfs.0 the vendors set. (1) For the multiple gpu driver<br>
>>> > cases, we can use ro.gfx.sysfs.1, ro.gfx.sysfs.2 for the 2nd and 3rd KMDs.<br>
>>> > (2) It's also allowed to put some sub-dir for example "kgsl/gpu_mem" or<br>
>>> > "mali0/gpu_mem" in the ro.gfx.sysfs.<channel> property if the root name<br>
>>> > under /sys/devices/ is already created and used for other purposes.<br>
>>><br>
>>> On one side you want to standardize on the other you want to give<br>
>>> complete freedom on the top level naming scheme. I would rather see a<br>
>>> consistent naming scheme (ie something more restraint and with little<br>
>>> place for interpration by individual driver)<br>
>><br>
>><br>
>> Thanks for commenting on this. We definitely need some suggestions on the root<br>
>> directory. In the multi-gpu case on desktop, is there some existing consumer to<br>
>> query "some data" from all the GPUs? How does the tool find all GPUs and<br>
>> differentiate between them? Is this already standardized?<br>
>><br>
>>> > For the 2nd level "pid", there are usually just a couple of them per<br>
>>> > snapshot, since we only takes snapshot for the active ones.<br>
>>><br>
>>> ? Do not understand here, you can have any number of applications with<br>
>>> GPU objects ? And thus there is no bound on the number of PID. Please<br>
>>> consider desktop too, i do not know what kind of limitation android<br>
>>> impose.<br>
>><br>
>><br>
>> We are only interested in tracking *active* GPU private allocations. So yes, any<br>
>> application currently holding an active GPU context will probably has a node here.<br>
>> Since we want to do profiling for specific apps, the data has to be per application<br>
>> based. I don't get your concerns here. If it's about the tracking overhead, it's rare<br>
>> to see tons of application doing private gpu allocations at the same time. Could<br>
>> you help elaborate a bit?<br>
>><br>
>>> > For the 3rd level "type_name", the type name will be one of the GPU memory<br>
>>> > object types in lower case, and the value will be a comma separated<br>
>>> > sequence of size values for all the allocations under that specific type.<br>
>>> ><br>
>>> > We especially would like some comments on this part. For the GPU memory<br>
>>> > object types, we defined 9 different types for Android:<br>
>>> > (1) UNKNOWN // not accounted for in any other category<br>
>>> > (2) SHADER // shader binaries<br>
>>> > (3) COMMAND // allocations which have a lifetime similar to a<br>
>>> > VkCommandBuffer<br>
>>> > (4) VULKAN // backing for VkDeviceMemory<br>
>>> > (5) GL_TEXTURE // GL Texture and RenderBuffer<br>
>>> > (6) GL_BUFFER // GL Buffer<br>
>>> > (7) QUERY // backing for query<br>
>>> > (8) DESCRIPTOR // allocations which have a lifetime similar to a<br>
>>> > VkDescriptorSet<br>
>>> > (9) TRANSIENT // random transient things that the driver needs<br>
>>> ><br>
>>> > We are wondering if those type enumerations make sense to the upstream side<br>
>>> > as well, or maybe we just deal with our own different type sets. Cuz on the<br>
>>> > Android side, we'll just read those nodes named after the types we defined<br>
>>> > in the sysfs node structure.<br>
>>><br>
>>> See my above point of open source driver and kernel being unaware<br>
>>> of the allocation purpose and use.<br>
>>><br>
>>> Cheers,<br>
>>> Jérôme<br>
>>><br>
>><br>
>> Many thanks for the reply!<br>
>> Yiwei<br>
><br>
> _______________________________________________<br>
> dri-devel mailing list<br>
> <a href="mailto:dri-devel@lists.freedesktop.org" target="_blank">dri-devel@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/dri-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/dri-devel</a><br>
</blockquote></div>