diff mbox

[v2] drm/radeon: Init amdkfd only if it was compiled

Message ID 1419843586-29864-1-git-send-email-oded.gabbay@amd.com (mailing list archive)
State New, archived
Headers show

Commit Message

Oded Gabbay Dec. 29, 2014, 8:59 a.m. UTC
This patch changes the radeon_kfd_init(), which is used to initialize the
interface between radeon and amdkfd, so the interface will be initialized only
if amdkfd was build, either as module or inside the kernel image.

In the modules case, the symbol_request() will be used (same as old code). In
the in-image compilation case, a direct call to kgd2kfd_init() will be done.
For other cases, radeon_kfd_init() will just return false.

This patch is necessary because in case of the following specific
configuration: kernel 32-bit, no modules support, random kernel base and no
hibernation, the symbol_request() doesn't work as expected - it doesn't return
NULL if the symbol doesn't exists - which makes the kernel panic.

Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>
---
 drivers/gpu/drm/radeon/radeon_kfd.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Christian König Dec. 29, 2014, 12:41 p.m. UTC | #1
Am 29.12.2014 um 09:59 schrieb Oded Gabbay:
> This patch changes the radeon_kfd_init(), which is used to initialize the
> interface between radeon and amdkfd, so the interface will be initialized only
> if amdkfd was build, either as module or inside the kernel image.
>
> In the modules case, the symbol_request() will be used (same as old code). In
> the in-image compilation case, a direct call to kgd2kfd_init() will be done.
> For other cases, radeon_kfd_init() will just return false.
>
> This patch is necessary because in case of the following specific
> configuration: kernel 32-bit, no modules support, random kernel base and no
> hibernation, the symbol_request() doesn't work as expected - it doesn't return
> NULL if the symbol doesn't exists - which makes the kernel panic.
>
> Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>

Using symbol_request() in general doesn't seem to be such a good idea, 
because it breaks symbol versioning and as far as I can see is only very 
rarely used in drivers (AFAIK only V4L drivers).

But for the moment I don't have another idea either except for always 
loading the module which on most hardware is completely unnecessary. 
Maybe we should consider restructuring the module load dependencies in 
the next kernel release.

For now the patch is Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
>   drivers/gpu/drm/radeon/radeon_kfd.c | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c
> index 242fd8b..d3e78b4 100644
> --- a/drivers/gpu/drm/radeon/radeon_kfd.c
> +++ b/drivers/gpu/drm/radeon/radeon_kfd.c
> @@ -101,6 +101,7 @@ static const struct kgd2kfd_calls *kgd2kfd;
>   
>   bool radeon_kfd_init(void)
>   {
> +#if defined(CONFIG_HSA_AMD_MODULE)
>   	bool (*kgd2kfd_init_p)(unsigned, const struct kfd2kgd_calls*,
>   				const struct kgd2kfd_calls**);
>   
> @@ -117,6 +118,17 @@ bool radeon_kfd_init(void)
>   	}
>   
>   	return true;
> +#elif defined(CONFIG_HSA_AMD)
> +	if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kfd2kgd, &kgd2kfd)) {
> +		kgd2kfd = NULL;
> +
> +		return false;
> +	}
> +
> +	return true;
> +#else
> +	return false;
> +#endif
>   }
>   
>   void radeon_kfd_fini(void)
Oded Gabbay Dec. 29, 2014, 12:49 p.m. UTC | #2
On 12/29/2014 02:41 PM, Christian König wrote:
> Am 29.12.2014 um 09:59 schrieb Oded Gabbay:
>> This patch changes the radeon_kfd_init(), which is used to initialize the
>> interface between radeon and amdkfd, so the interface will be initialized only
>> if amdkfd was build, either as module or inside the kernel image.
>>
>> In the modules case, the symbol_request() will be used (same as old code). In
>> the in-image compilation case, a direct call to kgd2kfd_init() will be done.
>> For other cases, radeon_kfd_init() will just return false.
>>
>> This patch is necessary because in case of the following specific
>> configuration: kernel 32-bit, no modules support, random kernel base and no
>> hibernation, the symbol_request() doesn't work as expected - it doesn't return
>> NULL if the symbol doesn't exists - which makes the kernel panic.
>>
>> Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>
>
> Using symbol_request() in general doesn't seem to be such a good idea, because
> it breaks symbol versioning and as far as I can see is only very rarely used in
> drivers (AFAIK only V4L drivers).
>
> But for the moment I don't have another idea either except for always loading
> the module which on most hardware is completely unnecessary. Maybe we should
> consider restructuring the module load dependencies in the next kernel release.
>
> For now the patch is Reviewed-by: Christian König <christian.koenig@amd.com>
>
Thanks Christian.
I agree that this is somewhat a mess, that was created unfortunately at the very 
beginning of kfd.

We will definitely fix this in 2015, as we also need to think how kfd will 
integrate with both radeon and amdgpu if they are present on the same system. 
The current method we use doesn't enable that situation.

Ideally, I would like to see total separation (between init of radeon and init 
of amdkfd) and use of exported symbols instead of symbol_request. Couple that 
with probe deferral and I think the end result will be much better than the 
current design.

	Oded

>> ---
>>   drivers/gpu/drm/radeon/radeon_kfd.c | 12 ++++++++++++
>>   1 file changed, 12 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c
>> b/drivers/gpu/drm/radeon/radeon_kfd.c
>> index 242fd8b..d3e78b4 100644
>> --- a/drivers/gpu/drm/radeon/radeon_kfd.c
>> +++ b/drivers/gpu/drm/radeon/radeon_kfd.c
>> @@ -101,6 +101,7 @@ static const struct kgd2kfd_calls *kgd2kfd;
>>   bool radeon_kfd_init(void)
>>   {
>> +#if defined(CONFIG_HSA_AMD_MODULE)
>>       bool (*kgd2kfd_init_p)(unsigned, const struct kfd2kgd_calls*,
>>                   const struct kgd2kfd_calls**);
>> @@ -117,6 +118,17 @@ bool radeon_kfd_init(void)
>>       }
>>       return true;
>> +#elif defined(CONFIG_HSA_AMD)
>> +    if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kfd2kgd, &kgd2kfd)) {
>> +        kgd2kfd = NULL;
>> +
>> +        return false;
>> +    }
>> +
>> +    return true;
>> +#else
>> +    return false;
>> +#endif
>>   }
>>   void radeon_kfd_fini(void)
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c
index 242fd8b..d3e78b4 100644
--- a/drivers/gpu/drm/radeon/radeon_kfd.c
+++ b/drivers/gpu/drm/radeon/radeon_kfd.c
@@ -101,6 +101,7 @@  static const struct kgd2kfd_calls *kgd2kfd;
 
 bool radeon_kfd_init(void)
 {
+#if defined(CONFIG_HSA_AMD_MODULE)
 	bool (*kgd2kfd_init_p)(unsigned, const struct kfd2kgd_calls*,
 				const struct kgd2kfd_calls**);
 
@@ -117,6 +118,17 @@  bool radeon_kfd_init(void)
 	}
 
 	return true;
+#elif defined(CONFIG_HSA_AMD)
+	if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kfd2kgd, &kgd2kfd)) {
+		kgd2kfd = NULL;
+
+		return false;
+	}
+
+	return true;
+#else
+	return false;
+#endif
 }
 
 void radeon_kfd_fini(void)