<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<div style="font-family: "segoe ui westeuropean", "segoe ui", helvetica, arial, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Ok then, I guess I will proceed with the dummy pages list implementation then.</div>
<div style="font-family: "segoe ui westeuropean", "segoe ui", helvetica, arial, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: "segoe ui westeuropean", "segoe ui", helvetica, arial, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Andrey</div>
<div><br>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Koenig, Christian <Christian.Koenig@amd.com><br>
<b>Sent:</b> 08 January 2021 09:52<br>
<b>To:</b> Grodzovsky, Andrey <Andrey.Grodzovsky@amd.com>; Daniel Vetter <daniel@ffwll.ch><br>
<b>Cc:</b> amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>; dri-devel@lists.freedesktop.org <dri-devel@lists.freedesktop.org>; daniel.vetter@ffwll.ch <daniel.vetter@ffwll.ch>; robh@kernel.org <robh@kernel.org>; l.stach@pengutronix.de <l.stach@pengutronix.de>;
 yuq825@gmail.com <yuq825@gmail.com>; eric@anholt.net <eric@anholt.net>; Deucher, Alexander <Alexander.Deucher@amd.com>; gregkh@linuxfoundation.org <gregkh@linuxfoundation.org>; ppaalanen@gmail.com <ppaalanen@gmail.com>; Wentland, Harry <Harry.Wentland@amd.com><br>
<b>Subject:</b> Re: [PATCH v3 01/12] drm: Add dummy page per device or GEM object</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Mhm, I'm not aware of any let over pointer between TTM and GEM and we
<br>
worked quite hard on reducing the size of the amdgpu_bo, so another <br>
extra pointer just for that corner case would suck quite a bit.<br>
<br>
Christian.<br>
<br>
Am 08.01.21 um 15:46 schrieb Andrey Grodzovsky:<br>
> Daniel had some objections to this (see bellow) and so I guess I need <br>
> you both to agree on the approach before I proceed.<br>
><br>
> Andrey<br>
><br>
> On 1/8/21 9:33 AM, Christian König wrote:<br>
>> Am 08.01.21 um 15:26 schrieb Andrey Grodzovsky:<br>
>>> Hey Christian, just a ping.<br>
>><br>
>> Was there any question for me here?<br>
>><br>
>> As far as I can see the best approach would still be to fill the VMA <br>
>> with a single dummy page and avoid pointers in the GEM object.<br>
>><br>
>> Christian.<br>
>><br>
>>><br>
>>> Andrey<br>
>>><br>
>>> On 1/7/21 11:37 AM, Andrey Grodzovsky wrote:<br>
>>>><br>
>>>> On 1/7/21 11:30 AM, Daniel Vetter wrote:<br>
>>>>> On Thu, Jan 07, 2021 at 11:26:52AM -0500, Andrey Grodzovsky wrote:<br>
>>>>>> On 1/7/21 11:21 AM, Daniel Vetter wrote:<br>
>>>>>>> On Tue, Jan 05, 2021 at 04:04:16PM -0500, Andrey Grodzovsky wrote:<br>
>>>>>>>> On 11/23/20 3:01 AM, Christian König wrote:<br>
>>>>>>>>> Am 23.11.20 um 05:54 schrieb Andrey Grodzovsky:<br>
>>>>>>>>>> On 11/21/20 9:15 AM, Christian König wrote:<br>
>>>>>>>>>>> Am 21.11.20 um 06:21 schrieb Andrey Grodzovsky:<br>
>>>>>>>>>>>> Will be used to reroute CPU mapped BO's page faults once<br>
>>>>>>>>>>>> device is removed.<br>
>>>>>>>>>>> Uff, one page for each exported DMA-buf? That's not <br>
>>>>>>>>>>> something we can do.<br>
>>>>>>>>>>><br>
>>>>>>>>>>> We need to find a different approach here.<br>
>>>>>>>>>>><br>
>>>>>>>>>>> Can't we call alloc_page() on each fault and link them together<br>
>>>>>>>>>>> so they are freed when the device is finally reaped?<br>
>>>>>>>>>> For sure better to optimize and allocate on demand when we reach<br>
>>>>>>>>>> this corner case, but why the linking ?<br>
>>>>>>>>>> Shouldn't drm_prime_gem_destroy be good enough place to free ?<br>
>>>>>>>>> I want to avoid keeping the page in the GEM object.<br>
>>>>>>>>><br>
>>>>>>>>> What we can do is to allocate a page on demand for each fault <br>
>>>>>>>>> and link<br>
>>>>>>>>> the together in the bdev instead.<br>
>>>>>>>>><br>
>>>>>>>>> And when the bdev is then finally destroyed after the last <br>
>>>>>>>>> application<br>
>>>>>>>>> closed we can finally release all of them.<br>
>>>>>>>>><br>
>>>>>>>>> Christian.<br>
>>>>>>>> Hey, started to implement this and then realized that by <br>
>>>>>>>> allocating a page<br>
>>>>>>>> for each fault indiscriminately<br>
>>>>>>>> we will be allocating a new page for each faulting virtual <br>
>>>>>>>> address within a<br>
>>>>>>>> VA range belonging the same BO<br>
>>>>>>>> and this is obviously too much and not the intention. Should I <br>
>>>>>>>> instead use<br>
>>>>>>>> let's say a hashtable with the hash<br>
>>>>>>>> key being faulting BO address to actually keep allocating and <br>
>>>>>>>> reusing same<br>
>>>>>>>> dummy zero page per GEM BO<br>
>>>>>>>> (or for that matter DRM file object address for non imported <br>
>>>>>>>> BOs) ?<br>
>>>>>>> Why do we need a hashtable? All the sw structures to track this <br>
>>>>>>> should<br>
>>>>>>> still be around:<br>
>>>>>>> - if gem_bo->dma_buf is set the buffer is currently exported as <br>
>>>>>>> a dma-buf,<br>
>>>>>>>     so defensively allocate a per-bo page<br>
>>>>>>> - otherwise allocate a per-file page<br>
>>>>>><br>
>>>>>> That exactly what we have in current implementation<br>
>>>>>><br>
>>>>>><br>
>>>>>>> Or is the idea to save the struct page * pointer? That feels a <br>
>>>>>>> bit like<br>
>>>>>>> over-optimizing stuff. Better to have a simple implementation <br>
>>>>>>> first and<br>
>>>>>>> then tune it if (and only if) any part of it becomes a problem <br>
>>>>>>> for normal<br>
>>>>>>> usage.<br>
>>>>>><br>
>>>>>> Exactly - the idea is to avoid adding extra pointer to <br>
>>>>>> drm_gem_object,<br>
>>>>>> Christian suggested to instead keep a linked list of dummy pages <br>
>>>>>> to be<br>
>>>>>> allocated on demand once we hit a vm_fault. I will then also <br>
>>>>>> prefault the entire<br>
>>>>>> VA range from vma->vm_end - vma->vm_start to vma->vm_end and map <br>
>>>>>> them<br>
>>>>>> to that single dummy page.<br>
>>>>> This strongly feels like premature optimization. If you're worried <br>
>>>>> about<br>
>>>>> the overhead on amdgpu, pay down the debt by removing one of the <br>
>>>>> redundant<br>
>>>>> pointers between gem and ttm bo structs (I think we still have <br>
>>>>> some) :-)<br>
>>>>><br>
>>>>> Until we've nuked these easy&obvious ones we shouldn't play "avoid 1<br>
>>>>> pointer just because" games with hashtables.<br>
>>>>> -Daniel<br>
>>>><br>
>>>><br>
>>>> Well, if you and Christian can agree on this approach and suggest <br>
>>>> maybe what pointer is<br>
>>>> redundant and can be removed from GEM struct so we can use the <br>
>>>> 'credit' to add the dummy page<br>
>>>> to GEM I will be happy to follow through.<br>
>>>><br>
>>>> P.S Hash table is off the table anyway and we are talking only <br>
>>>> about linked list here since by prefaulting<br>
>>>> the entire VA range for a vmf->vma i will be avoiding redundant <br>
>>>> page faults to same VMA VA range and so<br>
>>>> don't need to search and reuse an existing dummy page but simply <br>
>>>> create a new one for each next fault.<br>
>>>><br>
>>>> Andrey<br>
>><br>
<br>
</div>
</span></font></div>
</body>
</html>