<div dir="auto">Cool, thanks! </div><br><div class="gmail_quote"><div dir="ltr">On Mon, 14 May 2018, 19:07 Felix Kuehling <<a href="mailto:felix.kuehling@amd.com">felix.kuehling@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 2018-05-11 03:59 AM, Oded Gabbay wrote:<br>
> On Fri, Mar 23, 2018 at 10:32 PM, Felix Kuehling <<a href="mailto:Felix.Kuehling@amd.com" target="_blank" rel="noreferrer">Felix.Kuehling@amd.com</a>> wrote:<br>
>> When an MMU notifier runs in memory reclaim context, it can deadlock<br>
>> trying to take locks that are already held in the thread causing the<br>
>> memory reclaim. The solution is to avoid memory reclaim while holding<br>
>> locks that are taken in MMU notifiers by using GFP_NOIO.<br>
> Which locks are problematic ?<br>
<br>
The only lock I need to take in our MMU notifier is the DQM lock.<br>
<br>
><br>
> The kernel recommendation is to use "memalloc_noio_{save,restore} to<br>
> mark the whole scope which cannot perform any IO with a short<br>
> explanation why"<br>
<br>
Yeah. Looking at it more, I think the correct one to use is actually<br>
memalloc_nofs_{save,restore}.<br>
<br>
><br>
> By using the scope functions, you protect against future allocation<br>
> code that will be written in the critical path, without worrying about<br>
> the developer using the correct GFP_NOIO flag.<br>
<br>
Yes. Last time I looked into this it was broken and didn't properly<br>
handle kmalloc allocations. It looks like this was fixed by this commit:<br>
<br>
    commit 6d7225f0cc1a1fc32cf5dd01b4ab4b8a34c7cdb4<br>
    Author: Nikolay Borisov <<a href="mailto:nborisov@suse.com" target="_blank" rel="noreferrer">nborisov@suse.com</a>><br>
    Date:   Wed May 3 14:53:05 2017 -0700<br>
<br>
        lockdep: teach lockdep about memalloc_noio_save<br>
<br>
<br>
Later NOFS was introduced, which is now used by the lockdep checker to<br>
detect reclaim deadlocks.<br>
<br>
Regards,<br>
  Felix<br>
<br>
><br>
> Oded<br>
><br>
>> This commit fixes memory allocations done while holding the dqm->lock<br>
>> which is needed in the MMU notifier (dqm->ops.evict_process_queues).<br>
>><br>
>> Signed-off-by: Felix Kuehling <<a href="mailto:Felix.Kuehling@amd.com" target="_blank" rel="noreferrer">Felix.Kuehling@amd.com</a>><br>
>> ---<br>
>>  drivers/gpu/drm/amd/amdkfd/kfd_device.c          | 2 +-<br>
>>  drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c | 2 +-<br>
>>  drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c  | 2 +-<br>
>>  3 files changed, 3 insertions(+), 3 deletions(-)<br>
>><br>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c<br>
>> index 334669996..0434f65 100644<br>
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c<br>
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c<br>
>> @@ -652,7 +652,7 @@ int kfd_gtt_sa_allocate(struct kfd_dev *kfd, unsigned int size,<br>
>>         if (size > kfd->gtt_sa_num_of_chunks * kfd->gtt_sa_chunk_size)<br>
>>                 return -ENOMEM;<br>
>><br>
>> -       *mem_obj = kmalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL);<br>
>> +       *mem_obj = kmalloc(sizeof(struct kfd_mem_obj), GFP_NOIO);<br>
>>         if ((*mem_obj) == NULL)<br>
>>                 return -ENOMEM;<br>
>><br>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c<br>
>> index c00c325..2bc49c6 100644<br>
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c<br>
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c<br>
>> @@ -412,7 +412,7 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,<br>
>>         if (WARN_ON(type >= KFD_MQD_TYPE_MAX))<br>
>>                 return NULL;<br>
>><br>
>> -       mqd = kzalloc(sizeof(*mqd), GFP_KERNEL);<br>
>> +       mqd = kzalloc(sizeof(*mqd), GFP_NOIO);<br>
>>         if (!mqd)<br>
>>                 return NULL;<br>
>><br>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c<br>
>> index 89e4242..481307b 100644<br>
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c<br>
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c<br>
>> @@ -394,7 +394,7 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,<br>
>>         if (WARN_ON(type >= KFD_MQD_TYPE_MAX))<br>
>>                 return NULL;<br>
>><br>
>> -       mqd = kzalloc(sizeof(*mqd), GFP_KERNEL);<br>
>> +       mqd = kzalloc(sizeof(*mqd), GFP_NOIO);<br>
>>         if (!mqd)<br>
>>                 return NULL;<br>
>><br>
>> --<br>
>> 2.7.4<br>
>><br>
<br>
</blockquote></div>