Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1351312 > unrolled thread

Re: [PATCH V14 8/9] vfio, platform: add support for ACPI while detecting the reset driver

Started byEric Auger <eric.auger@linaro.org>
First post2016-03-07 05:20 +0100
Last post2016-03-08 16:50 +0100
Articles 5 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH V14 8/9] vfio, platform: add support for ACPI while  detecting the reset driver Eric Auger <eric.auger@linaro.org> - 2016-03-07 05:20 +0100
    Re: [PATCH V14 8/9] vfio, platform: add support for ACPI while  detecting the reset driver Sinan Kaya <okaya@codeaurora.org> - 2016-03-07 16:40 +0100
      Re: [PATCH V14 8/9] vfio, platform: add support for ACPI while  detecting the reset driver Eric Auger <eric.auger@linaro.org> - 2016-03-08 05:50 +0100
        Re: [PATCH V14 8/9] vfio, platform: add support for ACPI while  detecting the reset driver Sinan Kaya <okaya@codeaurora.org> - 2016-03-08 06:10 +0100
          Re: [PATCH V14 8/9] vfio, platform: add support for ACPI while  detecting the reset driver Sinan Kaya <okaya@codeaurora.org> - 2016-03-08 16:50 +0100

#1351312 — Re: [PATCH V14 8/9] vfio, platform: add support for ACPI while detecting the reset driver

FromEric Auger <eric.auger@linaro.org>
Date2016-03-07 05:20 +0100
SubjectRe: [PATCH V14 8/9] vfio, platform: add support for ACPI while detecting the reset driver
Message-ID<r9UOe-6ji-23@gated-at.bofh.it>
Hi Sinan,
On 03/04/2016 06:20 AM, Sinan Kaya wrote:
> On 3/3/2016 6:14 PM, Eric Auger wrote:
>> Hi Sinan,
>> On 03/02/2016 07:34 PM, Sinan Kaya wrote:
>>> On 2/26/2016 12:15 PM, Eric Auger wrote:
>>>>> -module_init(reset ## _module_init);				\
>>>>>> +#define module_vfio_reset_handler(compat, acpihid, reset)		\
>>>>>> +MODULE_ALIAS("vfio-reset:" compat);					\
>>>> Here you need to handle alias for hid case I think
>>>
>>> I'm wondering what happens when Compat or ACPI string is NULL.
>>>
>>> MODULE_ALIAS("vfio-reset:" NULL)
>>>
>>> Would the kernel like it? 
>>
>>>
>>> I'd rather create an alias only when the string is not NULL. Given
>>> this is a macro, I believe it won't work. 
>>
>> Indeed I think we should create an alias only for the supported case or
>> 2 aliases if both are supported.
>>>
>>> Can you think of any other way in the code to create the alias?
>>>
>> To be honest I did not find any elegant solution either. Personally I
>> would move the MODULE_ALIAS for compat/acpihid outside of
>> module_vfio_reset_handler macro, directly in the reset module. But maybe
>> someone will propose a better solution?
>>
> 
> I briefly looked at this. 
> 
> #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)
> #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
> 
> and it eventually becomes this
> 
> #define __MODULE_INFO(tag, name, info)                                    \
> static const char __UNIQUE_ID(name)[]                                     \
>    __used __attribute__((section(".modinfo"), unused, aligned(1)))         \
>    = __stringify(tag) "=" info
> 
> Since the info is on the right side of the equation, I'm allowed to add some 
> conditionals.
> 
> #define module_vfio_reset_handler(compat, acpihid, reset)		\
> MODULE_ALIAS("vfio-reset:" acpihid? acpihid: compat);			\
> 
> This way, we'll create an alias with one of the provided strings.  
What if you want to use vfio platform driver for HiDMA in dt mode? the
HiDma reset module advertises both acpihid and dt compat support but an
alias module will be created only for acpihid. Then I think we will not
be able to load the reset module in dt mode with existing code.

This could work however with some rework in vfio_platform_common.c. In
vfio_platform_get_reset we should try to load the module using the
acpihid if the module load using compat alias fails. In the look-up
table we can find the acpihid corresponding to the dt compat.

Any thought?

Best Regards

Eric

> 
> 
> 

[toc] | [next] | [standalone]


#1351720

FromSinan Kaya <okaya@codeaurora.org>
Date2016-03-07 16:40 +0100
Message-ID<ra5qi-4EI-19@gated-at.bofh.it>
In reply to#1351312
On 3/6/2016 11:09 PM, Eric Auger wrote:
>> #define module_vfio_reset_handler(compat, acpihid, reset)		\
>> > MODULE_ALIAS("vfio-reset:" acpihid? acpihid: compat);			\
>> > 
>> > This way, we'll create an alias with one of the provided strings.  
> What if you want to use vfio platform driver for HiDMA in dt mode? the
> HiDma reset module advertises both acpihid and dt compat support but an
> alias module will be created only for acpihid. Then I think we will not
> be able to load the reset module in dt mode with existing code.
> 

Right, it won't work. Now that we know what MODULE_ALIAS does, there is no
harm in doing this. I think we should do this.

#define module_vfio_reset_handler(compat, acpihid, reset)              \
MODULE_ALIAS("vfio-reset:" compat);                                    \
MODULE_ALIAS("vfio-reset:" acpihid);                                   \

If we prefer ACPI over DT, there is no guarantee that somebody can boot DT
kernel with ACPI kernel compilation option enabled.

If one of these are null, then the module alias will be "vfio-reset:"

Of course to make things prettier, we could use "NOT SUPPORTED" as a string
instead of NULL. then, the module alias will be vfio-reset: NOT SUPPORTED".

We could go one step further, and do.

#define module_vfio_reset_handler(compat, acpihid, reset) \
MODULE_ALIAS("vfio-reset: dt: " compat); \
MODULE_ALIAS("vfio-reset: acpi: " acpihid); \

and change the code below for this too.


> This could work however with some rework in vfio_platform_common.c. In
> vfio_platform_get_reset we should try to load the module using the
> acpihid if the module load using compat alias fails. In the look-up
> table we can find the acpihid corresponding to the dt compat.

I was planning to submit this for the next review. Still, I don't want to 
assume that acpihid is the only working option. Somebody can boot DT kernel.

diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c
index 42d7545..ba585ad 100644
--- a/drivers/vfio/platform/vfio_platform_common.c
+++ b/drivers/vfio/platform/vfio_platform_common.c
@@ -58,16 +58,30 @@ static vfio_platform_reset_fn_t vfio_platform_lookup_reset(const char *compat,
 	return reset_fn;
 }
 
-static void vfio_platform_get_reset(struct vfio_platform_device *vdev)
+static int vfio_platform_get_reset(struct vfio_platform_device *vdev)
 {
+	int rc;
+
 	vdev->reset = vfio_platform_lookup_reset(vdev->compat, vdev->acpihid,
 						 &vdev->reset_module);
-	if (!vdev->reset) {
-		request_module("vfio-reset:%s", vdev->compat);
-		vdev->reset = vfio_platform_lookup_reset(vdev->compat,
-							 vdev->acpihid,
-							 &vdev->reset_module);
-	}
+	if (vdev->reset)
+		return 0;
+
+	if (vdev->acpihid)
+		rc = request_module("vfio-reset:%s", vdev->acpihid);
+
+	if (rc && vdev->compat)
+		rc = request_module("vfio-reset:%s", vdev->compat);
+
+	if (rc)
+		return rc;
+
+	vdev->reset = vfio_platform_lookup_reset(vdev->compat, vdev->acpihid,
+						 &vdev->reset_module);
+	if (vdev->reset)
+		return 0;
+
+	return -ENODEV;
 }
 
 static void vfio_platform_put_reset(struct vfio_platform_device *vdev)
@@ -620,7 +634,11 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev,
 		return ret;
 	}
 
-	vfio_platform_get_reset(vdev);
+	ret = vfio_platform_get_reset(vdev);
+	if (ret) {
+		iommu_group_put(group);
+		return ret;
+	}
 
 	mutex_init(&vdev->igate);
  

Let me know what you think.


-- 
Sinan Kaya
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project

[toc] | [prev] | [next] | [standalone]


#1352623

FromEric Auger <eric.auger@linaro.org>
Date2016-03-08 05:50 +0100
Message-ID<rahKN-4oq-1@gated-at.bofh.it>
In reply to#1351720
Hi Sinan,
On 03/07/2016 04:30 PM, Sinan Kaya wrote:
> On 3/6/2016 11:09 PM, Eric Auger wrote:
>>> #define module_vfio_reset_handler(compat, acpihid, reset)		\
>>>> MODULE_ALIAS("vfio-reset:" acpihid? acpihid: compat);			\
>>>>
>>>> This way, we'll create an alias with one of the provided strings.  
>> What if you want to use vfio platform driver for HiDMA in dt mode? the
>> HiDma reset module advertises both acpihid and dt compat support but an
>> alias module will be created only for acpihid. Then I think we will not
>> be able to load the reset module in dt mode with existing code.
>>
> 
> Right, it won't work. Now that we know what MODULE_ALIAS does, there is no
> harm in doing this. I think we should do this.
> 
> #define module_vfio_reset_handler(compat, acpihid, reset)              \
> MODULE_ALIAS("vfio-reset:" compat);                                    \
> MODULE_ALIAS("vfio-reset:" acpihid);                                   \
> 
> If we prefer ACPI over DT, there is no guarantee that somebody can boot DT
> kernel with ACPI kernel compilation option enabled.
> 
> If one of these are null, then the module alias will be "vfio-reset:"
> 
> Of course to make things prettier, we could use "NOT SUPPORTED" as a string
> instead of NULL. then, the module alias will be vfio-reset: NOT SUPPORTED".
> 
> We could go one step further, and do.
> 
> #define module_vfio_reset_handler(compat, acpihid, reset) \
> MODULE_ALIAS("vfio-reset: dt: " compat); \
> MODULE_ALIAS("vfio-reset: acpi: " acpihid); \

My gut feeling is we must not create a dummy alias when the mode
(dt/acpi) is not supported/tested. It fills the modinfo section with
spurious data, aliases are visible to modinfo, ...

So I personally foresee 2 solutions,
1) we create a single alias using acpihid if supported or compat if not.
Then even in dt mode we try to load this module through the acpihid
alias. Looks weird but should work.
2) We simply move the module alias declaration out of this macro (to the
reset module itself), define 2 aliases in case both dt and acpi are
supported & tested.

My personal preference is 2 I think.

Best Regards

Eric

> 
> and change the code below for this too.
> 
> 
>> This could work however with some rework in vfio_platform_common.c. In
>> vfio_platform_get_reset we should try to load the module using the
>> acpihid if the module load using compat alias fails. In the look-up
>> table we can find the acpihid corresponding to the dt compat.
> 
> I was planning to submit this for the next review. Still, I don't want to 
> assume that acpihid is the only working option. Somebody can boot DT kernel.
> 
> diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c
> index 42d7545..ba585ad 100644
> --- a/drivers/vfio/platform/vfio_platform_common.c
> +++ b/drivers/vfio/platform/vfio_platform_common.c
> @@ -58,16 +58,30 @@ static vfio_platform_reset_fn_t vfio_platform_lookup_reset(const char *compat,
>  	return reset_fn;
>  }
>  
> -static void vfio_platform_get_reset(struct vfio_platform_device *vdev)
> +static int vfio_platform_get_reset(struct vfio_platform_device *vdev)
>  {
> +	int rc;
> +
>  	vdev->reset = vfio_platform_lookup_reset(vdev->compat, vdev->acpihid,
>  						 &vdev->reset_module);
> -	if (!vdev->reset) {
> -		request_module("vfio-reset:%s", vdev->compat);
> -		vdev->reset = vfio_platform_lookup_reset(vdev->compat,
> -							 vdev->acpihid,
> -							 &vdev->reset_module);
> -	}
> +	if (vdev->reset)
> +		return 0;
> +
> +	if (vdev->acpihid)
> +		rc = request_module("vfio-reset:%s", vdev->acpihid);
> +
> +	if (rc && vdev->compat)
> +		rc = request_module("vfio-reset:%s", vdev->compat);
> +
> +	if (rc)
> +		return rc;
> +
> +	vdev->reset = vfio_platform_lookup_reset(vdev->compat, vdev->acpihid,
> +						 &vdev->reset_module);
> +	if (vdev->reset)
> +		return 0;
> +
> +	return -ENODEV;
>  }
>  
>  static void vfio_platform_put_reset(struct vfio_platform_device *vdev)
> @@ -620,7 +634,11 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev,
>  		return ret;
>  	}
>  
> -	vfio_platform_get_reset(vdev);
> +	ret = vfio_platform_get_reset(vdev);
> +	if (ret) {
> +		iommu_group_put(group);
> +		return ret;
> +	}
>  
>  	mutex_init(&vdev->igate);
>   
> 
> Let me know what you think.
> 
> 

[toc] | [prev] | [next] | [standalone]


#1352631

FromSinan Kaya <okaya@codeaurora.org>
Date2016-03-08 06:10 +0100
Message-ID<rai49-4K7-1@gated-at.bofh.it>
In reply to#1352623
On 3/7/2016 11:46 PM, Eric Auger wrote:
>> #define module_vfio_reset_handler(compat, acpihid, reset) \
>> > MODULE_ALIAS("vfio-reset: dt: " compat); \
>> > MODULE_ALIAS("vfio-reset: acpi: " acpihid); \
> My gut feeling is we must not create a dummy alias when the mode
> (dt/acpi) is not supported/tested. It fills the modinfo section with
> spurious data, aliases are visible to modinfo, ...
> 
> So I personally foresee 2 solutions,
> 1) we create a single alias using acpihid if supported or compat if not.
> Then even in dt mode we try to load this module through the acpihid
> alias. Looks weird but should work.
> 2) We simply move the module alias declaration out of this macro (to the
> reset module itself), define 2 aliases in case both dt and acpi are
> supported & tested.
> 
> My personal preference is 2 I think.
> 
> Best Regards
> 
> Eric
> 

I agree with your assessment of #2. We are trying to be too smart. 
I'll post a patch with #2 solution.

-- 
Sinan Kaya
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project

[toc] | [prev] | [next] | [standalone]


#1353158

FromSinan Kaya <okaya@codeaurora.org>
Date2016-03-08 16:50 +0100
Message-ID<ras3w-2Le-11@gated-at.bofh.it>
In reply to#1352631
Hi,

On 3/8/2016 12:07 AM, Sinan Kaya wrote:
> On 3/7/2016 11:46 PM, Eric Auger wrote:
>>> #define module_vfio_reset_handler(compat, acpihid, reset) \
>>>> MODULE_ALIAS("vfio-reset: dt: " compat); \
>>>> MODULE_ALIAS("vfio-reset: acpi: " acpihid); \
>> My gut feeling is we must not create a dummy alias when the mode
>> (dt/acpi) is not supported/tested. It fills the modinfo section with
>> spurious data, aliases are visible to modinfo, ...
>>
>> So I personally foresee 2 solutions,
>> 1) we create a single alias using acpihid if supported or compat if not.
>> Then even in dt mode we try to load this module through the acpihid
>> alias. Looks weird but should work.
>> 2) We simply move the module alias declaration out of this macro (to the
>> reset module itself), define 2 aliases in case both dt and acpi are
>> supported & tested.
>>
>> My personal preference is 2 I think.
>>
>> Best Regards
>>
>> Eric
>>
> 
> I agree with your assessment of #2. We are trying to be too smart. 
> I'll post a patch with #2 solution.
> 

I split patch 8 and 9 from the series and posted a new set here.

http://www.spinics.net/lists/arm-kernel/msg489578.html

-- 
Sinan Kaya
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web