diff mbox series

[v3] xen: Remove dependency between pciback and privcmd

Message ID 20241011034227.1278144-1-Jiqian.Chen@amd.com (mailing list archive)
State Superseded
Headers show
Series [v3] xen: Remove dependency between pciback and privcmd | expand

Commit Message

Jiqian Chen Oct. 11, 2024, 3:42 a.m. UTC
Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
dependency causes xen-privcmd can't be loaded on domU, because dependent
xen-pciback isn't always be loaded successfully on domU.

To solve above problem, remove that dependency, and do not call
pcistub_get_gsi_from_sbdf() directly, instead add a hook in
drivers/xen/apci.c, xen-pciback register the real call function, then in
privcmd_ioctl_pcidev_get_gsi call that hook.

Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
---
v2->v3 changes:
Added rwlock get_gsi_from_sbdf_lock to avoid races.
Called xen_acpi_register_get_gsi_func to register function in xen_pcibk_init and set NULL to hook in xen_pcibk_cleanup when unloading.

v1->v2 changes:
Added hook xen_acpi_get_gsi_from_sbdf.
Changed pcistub_get_gsi_from_sbdf to static and pciback register it as the real hook function.
---
 drivers/xen/Kconfig                |  1 -
 drivers/xen/acpi.c                 | 24 ++++++++++++++++++++++++
 drivers/xen/privcmd.c              |  6 ++----
 drivers/xen/xen-pciback/pci_stub.c | 11 +++++++++--
 include/xen/acpi.h                 | 12 ++++--------
 5 files changed, 39 insertions(+), 15 deletions(-)

Comments

Jan Beulich Oct. 11, 2024, 8:54 a.m. UTC | #1
On 11.10.2024 05:42, Jiqian Chen wrote:
> @@ -1757,11 +1756,19 @@ static int __init xen_pcibk_init(void)
>  		bus_register_notifier(&pci_bus_type, &pci_stub_nb);
>  #endif
>  
> +#ifdef CONFIG_XEN_ACPI
> +	xen_acpi_register_get_gsi_func(pcistub_get_gsi_from_sbdf);
> +#endif
> +
>  	return err;
>  }
>  
>  static void __exit xen_pcibk_cleanup(void)
>  {
> +#ifdef CONFIG_XEN_ACPI
> +	xen_acpi_register_get_gsi_func(NULL);
> +#endif

Just wondering - instead of these two #ifdef-s, ...

> --- a/include/xen/acpi.h
> +++ b/include/xen/acpi.h
> @@ -91,13 +91,9 @@ static inline int xen_acpi_get_gsi_info(struct pci_dev *dev,
>  }
>  #endif
>  
> -#ifdef CONFIG_XEN_PCI_STUB
> -int pcistub_get_gsi_from_sbdf(unsigned int sbdf);
> -#else
> -static inline int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
> -{
> -	return -1;
> -}
> -#endif
> +typedef int (*get_gsi_from_sbdf_t)(u32 sbdf);
> +
> +void xen_acpi_register_get_gsi_func(get_gsi_from_sbdf_t func);
> +int xen_acpi_get_gsi_from_sbdf(u32 sbdf);

... wouldn't a static inline stub (for the !XEN_ACPI case) aid overall readability?

Jan
Jiqian Chen Oct. 11, 2024, 9:20 a.m. UTC | #2
On 2024/10/11 16:54, Jan Beulich wrote:
> On 11.10.2024 05:42, Jiqian Chen wrote:
>> @@ -1757,11 +1756,19 @@ static int __init xen_pcibk_init(void)
>>  		bus_register_notifier(&pci_bus_type, &pci_stub_nb);
>>  #endif
>>  
>> +#ifdef CONFIG_XEN_ACPI
>> +	xen_acpi_register_get_gsi_func(pcistub_get_gsi_from_sbdf);
>> +#endif
>> +
>>  	return err;
>>  }
>>  
>>  static void __exit xen_pcibk_cleanup(void)
>>  {
>> +#ifdef CONFIG_XEN_ACPI
>> +	xen_acpi_register_get_gsi_func(NULL);
>> +#endif
> 
> Just wondering - instead of these two #ifdef-s, ...
> 
>> --- a/include/xen/acpi.h
>> +++ b/include/xen/acpi.h
>> @@ -91,13 +91,9 @@ static inline int xen_acpi_get_gsi_info(struct pci_dev *dev,
>>  }
>>  #endif
>>  
>> -#ifdef CONFIG_XEN_PCI_STUB
>> -int pcistub_get_gsi_from_sbdf(unsigned int sbdf);
>> -#else
>> -static inline int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
>> -{
>> -	return -1;
>> -}
>> -#endif
>> +typedef int (*get_gsi_from_sbdf_t)(u32 sbdf);
>> +
>> +void xen_acpi_register_get_gsi_func(get_gsi_from_sbdf_t func);
>> +int xen_acpi_get_gsi_from_sbdf(u32 sbdf);
> 
> ... wouldn't a static inline stub (for the !XEN_ACPI case) aid overall readability?
I'm not sure if other files do this. But for me, it feels a little strange to use "#ifdef CONFIG_XEN_ACPI #else" in apci.h, like self-containment.
And "#include apci.h" in pic_stub.c is also wraped with CONFIG_XEN_ACPI.

> 
> Jan
Jiqian Chen Oct. 11, 2024, 9:33 a.m. UTC | #3
On 2024/10/11 17:20, Chen, Jiqian wrote:
> On 2024/10/11 16:54, Jan Beulich wrote:
>> On 11.10.2024 05:42, Jiqian Chen wrote:
>>> @@ -1757,11 +1756,19 @@ static int __init xen_pcibk_init(void)
>>>  		bus_register_notifier(&pci_bus_type, &pci_stub_nb);
>>>  #endif
>>>  
>>> +#ifdef CONFIG_XEN_ACPI
>>> +	xen_acpi_register_get_gsi_func(pcistub_get_gsi_from_sbdf);
>>> +#endif
>>> +
>>>  	return err;
>>>  }
>>>  
>>>  static void __exit xen_pcibk_cleanup(void)
>>>  {
>>> +#ifdef CONFIG_XEN_ACPI
>>> +	xen_acpi_register_get_gsi_func(NULL);
>>> +#endif
>>
>> Just wondering - instead of these two #ifdef-s, ...
>>
>>> --- a/include/xen/acpi.h
>>> +++ b/include/xen/acpi.h
>>> @@ -91,13 +91,9 @@ static inline int xen_acpi_get_gsi_info(struct pci_dev *dev,
>>>  }
>>>  #endif
>>>  
>>> -#ifdef CONFIG_XEN_PCI_STUB
>>> -int pcistub_get_gsi_from_sbdf(unsigned int sbdf);
>>> -#else
>>> -static inline int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
>>> -{
>>> -	return -1;
>>> -}
>>> -#endif
>>> +typedef int (*get_gsi_from_sbdf_t)(u32 sbdf);
>>> +
>>> +void xen_acpi_register_get_gsi_func(get_gsi_from_sbdf_t func);
>>> +int xen_acpi_get_gsi_from_sbdf(u32 sbdf);
>>
>> ... wouldn't a static inline stub (for the !XEN_ACPI case) aid overall readability?
> I'm not sure if other files do this. But for me, it feels a little strange to use "#ifdef CONFIG_XEN_ACPI #else" in apci.h, like self-containment.
> And "#include apci.h" in pic_stub.c is also wraped with CONFIG_XEN_ACPI.
OK, I saw other files also do this.
If you insist, I will make modifications in the next version.
Thank you!

> 
>>
>> Jan
>
Jan Beulich Oct. 11, 2024, 10:10 a.m. UTC | #4
On 11.10.2024 11:33, Chen, Jiqian wrote:
> On 2024/10/11 17:20, Chen, Jiqian wrote:
>> On 2024/10/11 16:54, Jan Beulich wrote:
>>> On 11.10.2024 05:42, Jiqian Chen wrote:
>>>> @@ -1757,11 +1756,19 @@ static int __init xen_pcibk_init(void)
>>>>  		bus_register_notifier(&pci_bus_type, &pci_stub_nb);
>>>>  #endif
>>>>  
>>>> +#ifdef CONFIG_XEN_ACPI
>>>> +	xen_acpi_register_get_gsi_func(pcistub_get_gsi_from_sbdf);
>>>> +#endif
>>>> +
>>>>  	return err;
>>>>  }
>>>>  
>>>>  static void __exit xen_pcibk_cleanup(void)
>>>>  {
>>>> +#ifdef CONFIG_XEN_ACPI
>>>> +	xen_acpi_register_get_gsi_func(NULL);
>>>> +#endif
>>>
>>> Just wondering - instead of these two #ifdef-s, ...
>>>
>>>> --- a/include/xen/acpi.h
>>>> +++ b/include/xen/acpi.h
>>>> @@ -91,13 +91,9 @@ static inline int xen_acpi_get_gsi_info(struct pci_dev *dev,
>>>>  }
>>>>  #endif
>>>>  
>>>> -#ifdef CONFIG_XEN_PCI_STUB
>>>> -int pcistub_get_gsi_from_sbdf(unsigned int sbdf);
>>>> -#else
>>>> -static inline int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
>>>> -{
>>>> -	return -1;
>>>> -}
>>>> -#endif
>>>> +typedef int (*get_gsi_from_sbdf_t)(u32 sbdf);
>>>> +
>>>> +void xen_acpi_register_get_gsi_func(get_gsi_from_sbdf_t func);
>>>> +int xen_acpi_get_gsi_from_sbdf(u32 sbdf);
>>>
>>> ... wouldn't a static inline stub (for the !XEN_ACPI case) aid overall readability?
>> I'm not sure if other files do this. But for me, it feels a little strange to use "#ifdef CONFIG_XEN_ACPI #else" in apci.h, like self-containment.
>> And "#include apci.h" in pic_stub.c is also wraped with CONFIG_XEN_ACPI.
> OK, I saw other files also do this.
> If you insist, I will make modifications in the next version.

Well, I'm not a maintainer of this code, so I can't very well insist.

Jan
Jürgen Groß Oct. 11, 2024, 11:12 a.m. UTC | #5
On 11.10.24 12:10, Jan Beulich wrote:
> On 11.10.2024 11:33, Chen, Jiqian wrote:
>> On 2024/10/11 17:20, Chen, Jiqian wrote:
>>> On 2024/10/11 16:54, Jan Beulich wrote:
>>>> On 11.10.2024 05:42, Jiqian Chen wrote:
>>>>> @@ -1757,11 +1756,19 @@ static int __init xen_pcibk_init(void)
>>>>>   		bus_register_notifier(&pci_bus_type, &pci_stub_nb);
>>>>>   #endif
>>>>>   
>>>>> +#ifdef CONFIG_XEN_ACPI
>>>>> +	xen_acpi_register_get_gsi_func(pcistub_get_gsi_from_sbdf);
>>>>> +#endif
>>>>> +
>>>>>   	return err;
>>>>>   }
>>>>>   
>>>>>   static void __exit xen_pcibk_cleanup(void)
>>>>>   {
>>>>> +#ifdef CONFIG_XEN_ACPI
>>>>> +	xen_acpi_register_get_gsi_func(NULL);
>>>>> +#endif
>>>>
>>>> Just wondering - instead of these two #ifdef-s, ...
>>>>
>>>>> --- a/include/xen/acpi.h
>>>>> +++ b/include/xen/acpi.h
>>>>> @@ -91,13 +91,9 @@ static inline int xen_acpi_get_gsi_info(struct pci_dev *dev,
>>>>>   }
>>>>>   #endif
>>>>>   
>>>>> -#ifdef CONFIG_XEN_PCI_STUB
>>>>> -int pcistub_get_gsi_from_sbdf(unsigned int sbdf);
>>>>> -#else
>>>>> -static inline int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
>>>>> -{
>>>>> -	return -1;
>>>>> -}
>>>>> -#endif
>>>>> +typedef int (*get_gsi_from_sbdf_t)(u32 sbdf);
>>>>> +
>>>>> +void xen_acpi_register_get_gsi_func(get_gsi_from_sbdf_t func);
>>>>> +int xen_acpi_get_gsi_from_sbdf(u32 sbdf);
>>>>
>>>> ... wouldn't a static inline stub (for the !XEN_ACPI case) aid overall readability?
>>> I'm not sure if other files do this. But for me, it feels a little strange to use "#ifdef CONFIG_XEN_ACPI #else" in apci.h, like self-containment.
>>> And "#include apci.h" in pic_stub.c is also wraped with CONFIG_XEN_ACPI.
>> OK, I saw other files also do this.
>> If you insist, I will make modifications in the next version.
> 
> Well, I'm not a maintainer of this code, so I can't very well insist.

In this case I'm in favor of having the #ifdefs at the calling site.

The amount of code isn't larger this way, while it is more clear when
reading the code that the calls are only done in the CONFIG_XEN_ACPI
case.


Juergen
Jürgen Groß Oct. 11, 2024, 11:16 a.m. UTC | #6
On 11.10.24 05:42, Jiqian Chen wrote:
> Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
> adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
> dependency causes xen-privcmd can't be loaded on domU, because dependent
> xen-pciback isn't always be loaded successfully on domU.
> 
> To solve above problem, remove that dependency, and do not call
> pcistub_get_gsi_from_sbdf() directly, instead add a hook in
> drivers/xen/apci.c, xen-pciback register the real call function, then in
> privcmd_ioctl_pcidev_get_gsi call that hook.
> 
> Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>

Reviewed-by: Juergen Gross <jgross@suse.com>


Juergen
Jürgen Groß Oct. 11, 2024, 12:06 p.m. UTC | #7
On 11.10.24 05:42, Jiqian Chen wrote:
> Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
> adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
> dependency causes xen-privcmd can't be loaded on domU, because dependent
> xen-pciback isn't always be loaded successfully on domU.
> 
> To solve above problem, remove that dependency, and do not call
> pcistub_get_gsi_from_sbdf() directly, instead add a hook in
> drivers/xen/apci.c, xen-pciback register the real call function, then in
> privcmd_ioctl_pcidev_get_gsi call that hook.
> 
> Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>

Unfortunately I'm seeing a build breakage for the 32-bit x86 build.

Reason is that drivers/xen/acpi.c is being built for Dom0 only, so having
CONFIG_XEN_ACPI defined is not enough for ensuring the new functions are
present.

I suggest to add a new CONFIG item CONFIG_XEN_DOM0_ACPI like

config XEN_DOM0_ACPI
	def_bool y
	depends on XEN_ACPI && XEN_DOM0

and then replace all CONFIG_XEN_ACPI instances in your patch with
CONFIG_XEN_DOM0_ACPI. This includes the use case in
privcmd_ioctl_pcidev_get_gsi().


Juergen
Jiqian Chen Oct. 12, 2024, 2:22 a.m. UTC | #8
On 2024/10/11 20:06, Juergen Gross wrote:
> On 11.10.24 05:42, Jiqian Chen wrote:
>> Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>> adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
>> dependency causes xen-privcmd can't be loaded on domU, because dependent
>> xen-pciback isn't always be loaded successfully on domU.
>>
>> To solve above problem, remove that dependency, and do not call
>> pcistub_get_gsi_from_sbdf() directly, instead add a hook in
>> drivers/xen/apci.c, xen-pciback register the real call function, then in
>> privcmd_ioctl_pcidev_get_gsi call that hook.
>>
>> Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
>> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
> 
> Unfortunately I'm seeing a build breakage for the 32-bit x86 build.
> 
> Reason is that drivers/xen/acpi.c is being built for Dom0 only, so having
> CONFIG_XEN_ACPI defined is not enough for ensuring the new functions are
> present.
> 
> I suggest to add a new CONFIG item CONFIG_XEN_DOM0_ACPI like
> 
> config XEN_DOM0_ACPI
>     def_bool y
>     depends on XEN_ACPI && XEN_DOM0
> 
> and then replace all CONFIG_XEN_ACPI instances in your patch with
> CONFIG_XEN_DOM0_ACPI. This includes the use case in
> privcmd_ioctl_pcidev_get_gsi().

How about add stubs for xen_acpi_register_get_gsi_func and xen_acpi_get_gsi_from_sbdf when "!CONFIG_XEN_DOM0" in acpi.h, like the other functions in that file do.

> 
> 
> Juergen
Jiqian Chen Oct. 12, 2024, 2:36 a.m. UTC | #9
On 2024/10/12 10:22, Chen, Jiqian wrote:
> On 2024/10/11 20:06, Juergen Gross wrote:
>> On 11.10.24 05:42, Jiqian Chen wrote:
>>> Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>> adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
>>> dependency causes xen-privcmd can't be loaded on domU, because dependent
>>> xen-pciback isn't always be loaded successfully on domU.
>>>
>>> To solve above problem, remove that dependency, and do not call
>>> pcistub_get_gsi_from_sbdf() directly, instead add a hook in
>>> drivers/xen/apci.c, xen-pciback register the real call function, then in
>>> privcmd_ioctl_pcidev_get_gsi call that hook.
>>>
>>> Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
>>> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
>>
>> Unfortunately I'm seeing a build breakage for the 32-bit x86 build.
Could you please attach the link or steps?
Then I can reproduce it, and validate it locally with new changes.

>>
>> Reason is that drivers/xen/acpi.c is being built for Dom0 only, so having
>> CONFIG_XEN_ACPI defined is not enough for ensuring the new functions are
>> present.
>>
>> I suggest to add a new CONFIG item CONFIG_XEN_DOM0_ACPI like
>>
>> config XEN_DOM0_ACPI
>>     def_bool y
>>     depends on XEN_ACPI && XEN_DOM0
>>
>> and then replace all CONFIG_XEN_ACPI instances in your patch with
>> CONFIG_XEN_DOM0_ACPI. This includes the use case in
>> privcmd_ioctl_pcidev_get_gsi().
> 
> How about add stubs for xen_acpi_register_get_gsi_func and xen_acpi_get_gsi_from_sbdf when "!CONFIG_XEN_DOM0" in acpi.h, like the other functions in that file do.
> 
>>
>>
>> Juergen
>
Jürgen Groß Oct. 12, 2024, 5:48 a.m. UTC | #10
On 12.10.24 04:36, Chen, Jiqian wrote:
> On 2024/10/12 10:22, Chen, Jiqian wrote:
>> On 2024/10/11 20:06, Juergen Gross wrote:
>>> On 11.10.24 05:42, Jiqian Chen wrote:
>>>> Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>>> adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
>>>> dependency causes xen-privcmd can't be loaded on domU, because dependent
>>>> xen-pciback isn't always be loaded successfully on domU.
>>>>
>>>> To solve above problem, remove that dependency, and do not call
>>>> pcistub_get_gsi_from_sbdf() directly, instead add a hook in
>>>> drivers/xen/apci.c, xen-pciback register the real call function, then in
>>>> privcmd_ioctl_pcidev_get_gsi call that hook.
>>>>
>>>> Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>>> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
>>>> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
>>>
>>> Unfortunately I'm seeing a build breakage for the 32-bit x86 build.
> Could you please attach the link or steps?
> Then I can reproduce it, and validate it locally with new changes.

I'm using the attached kernel config.


Juergen
Jiqian Chen Oct. 12, 2024, 6:50 a.m. UTC | #11
On 2024/10/12 13:48, Jürgen Groß wrote:
> On 12.10.24 04:36, Chen, Jiqian wrote:
>> On 2024/10/12 10:22, Chen, Jiqian wrote:
>>> On 2024/10/11 20:06, Juergen Gross wrote:
>>>> On 11.10.24 05:42, Jiqian Chen wrote:
>>>>> Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>>>> adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
>>>>> dependency causes xen-privcmd can't be loaded on domU, because dependent
>>>>> xen-pciback isn't always be loaded successfully on domU.
>>>>>
>>>>> To solve above problem, remove that dependency, and do not call
>>>>> pcistub_get_gsi_from_sbdf() directly, instead add a hook in
>>>>> drivers/xen/apci.c, xen-pciback register the real call function, then in
>>>>> privcmd_ioctl_pcidev_get_gsi call that hook.
>>>>>
>>>>> Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>>>> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
>>>>> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
>>>>
>>>> Unfortunately I'm seeing a build breakage for the 32-bit x86 build.
>> Could you please attach the link or steps?
>> Then I can reproduce it, and validate it locally with new changes.
> 
> I'm using the attached kernel config.
Thanks, I can reproduce the 32-bit build error locally.
And this "Add stubs for xen_acpi_register_get_gsi_func and xen_acpi_get_gsi_from_sbdf when "!CONFIG_XEN_DOM0" in acpi.h, like the other functions in that file do." can fix it.
Is it okay?

> 
> 
> Juergen
>
Jürgen Groß Oct. 12, 2024, 8:28 a.m. UTC | #12
On 12.10.24 08:50, Chen, Jiqian wrote:
> On 2024/10/12 13:48, Jürgen Groß wrote:
>> On 12.10.24 04:36, Chen, Jiqian wrote:
>>> On 2024/10/12 10:22, Chen, Jiqian wrote:
>>>> On 2024/10/11 20:06, Juergen Gross wrote:
>>>>> On 11.10.24 05:42, Jiqian Chen wrote:
>>>>>> Commit 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>>>>> adds a weak reverse dependency to the config XEN_PRIVCMD definition, that
>>>>>> dependency causes xen-privcmd can't be loaded on domU, because dependent
>>>>>> xen-pciback isn't always be loaded successfully on domU.
>>>>>>
>>>>>> To solve above problem, remove that dependency, and do not call
>>>>>> pcistub_get_gsi_from_sbdf() directly, instead add a hook in
>>>>>> drivers/xen/apci.c, xen-pciback register the real call function, then in
>>>>>> privcmd_ioctl_pcidev_get_gsi call that hook.
>>>>>>
>>>>>> Fixes: 2fae6bb7be32 ("xen/privcmd: Add new syscall to get gsi from dev")
>>>>>> Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
>>>>>> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
>>>>>
>>>>> Unfortunately I'm seeing a build breakage for the 32-bit x86 build.
>>> Could you please attach the link or steps?
>>> Then I can reproduce it, and validate it locally with new changes.
>>
>> I'm using the attached kernel config.
> Thanks, I can reproduce the 32-bit build error locally.
> And this "Add stubs for xen_acpi_register_get_gsi_func and xen_acpi_get_gsi_from_sbdf when "!CONFIG_XEN_DOM0" in acpi.h, like the other functions in that file do." can fix it.
> Is it okay?

Fine with me.


Juergen
diff mbox series

Patch

diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig
index 72ddee4c1544..f7d6f47971fd 100644
--- a/drivers/xen/Kconfig
+++ b/drivers/xen/Kconfig
@@ -261,7 +261,6 @@  config XEN_SCSI_BACKEND
 config XEN_PRIVCMD
 	tristate "Xen hypercall passthrough driver"
 	depends on XEN
-	imply XEN_PCIDEV_BACKEND
 	default m
 	help
 	  The hypercall passthrough driver allows privileged user programs to
diff --git a/drivers/xen/acpi.c b/drivers/xen/acpi.c
index 9e2096524fbc..d2ee605c5ca1 100644
--- a/drivers/xen/acpi.c
+++ b/drivers/xen/acpi.c
@@ -125,3 +125,27 @@  int xen_acpi_get_gsi_info(struct pci_dev *dev,
 	return 0;
 }
 EXPORT_SYMBOL_GPL(xen_acpi_get_gsi_info);
+
+static get_gsi_from_sbdf_t get_gsi_from_sbdf;
+static DEFINE_RWLOCK(get_gsi_from_sbdf_lock);
+
+void xen_acpi_register_get_gsi_func(get_gsi_from_sbdf_t func)
+{
+	write_lock(&get_gsi_from_sbdf_lock);
+	get_gsi_from_sbdf = func;
+	write_unlock(&get_gsi_from_sbdf_lock);
+}
+EXPORT_SYMBOL_GPL(xen_acpi_register_get_gsi_func);
+
+int xen_acpi_get_gsi_from_sbdf(u32 sbdf)
+{
+	int ret = -EOPNOTSUPP;
+
+	read_lock(&get_gsi_from_sbdf_lock);
+	if (get_gsi_from_sbdf)
+		ret = get_gsi_from_sbdf(sbdf);
+	read_unlock(&get_gsi_from_sbdf_lock);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(xen_acpi_get_gsi_from_sbdf);
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index 3273cb8c2a66..4f75bc876454 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -850,15 +850,13 @@  static long privcmd_ioctl_mmap_resource(struct file *file,
 static long privcmd_ioctl_pcidev_get_gsi(struct file *file, void __user *udata)
 {
 #if defined(CONFIG_XEN_ACPI)
-	int rc = -EINVAL;
+	int rc;
 	struct privcmd_pcidev_get_gsi kdata;
 
 	if (copy_from_user(&kdata, udata, sizeof(kdata)))
 		return -EFAULT;
 
-	if (IS_REACHABLE(CONFIG_XEN_PCIDEV_BACKEND))
-		rc = pcistub_get_gsi_from_sbdf(kdata.sbdf);
-
+	rc = xen_acpi_get_gsi_from_sbdf(kdata.sbdf);
 	if (rc < 0)
 		return rc;
 
diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c
index 2f3da5ac62cd..b616b7768c3b 100644
--- a/drivers/xen/xen-pciback/pci_stub.c
+++ b/drivers/xen/xen-pciback/pci_stub.c
@@ -227,7 +227,7 @@  static struct pci_dev *pcistub_device_get_pci_dev(struct xen_pcibk_device *pdev,
 }
 
 #ifdef CONFIG_XEN_ACPI
-int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
+static int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
 {
 	struct pcistub_device *psdev;
 	int domain = (sbdf >> 16) & 0xffff;
@@ -242,7 +242,6 @@  int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
 
 	return psdev->gsi;
 }
-EXPORT_SYMBOL_GPL(pcistub_get_gsi_from_sbdf);
 #endif
 
 struct pci_dev *pcistub_get_pci_dev_by_slot(struct xen_pcibk_device *pdev,
@@ -1757,11 +1756,19 @@  static int __init xen_pcibk_init(void)
 		bus_register_notifier(&pci_bus_type, &pci_stub_nb);
 #endif
 
+#ifdef CONFIG_XEN_ACPI
+	xen_acpi_register_get_gsi_func(pcistub_get_gsi_from_sbdf);
+#endif
+
 	return err;
 }
 
 static void __exit xen_pcibk_cleanup(void)
 {
+#ifdef CONFIG_XEN_ACPI
+	xen_acpi_register_get_gsi_func(NULL);
+#endif
+
 #ifdef CONFIG_PCI_IOV
 	bus_unregister_notifier(&pci_bus_type, &pci_stub_nb);
 #endif
diff --git a/include/xen/acpi.h b/include/xen/acpi.h
index daa96a22d257..8cb081c633cc 100644
--- a/include/xen/acpi.h
+++ b/include/xen/acpi.h
@@ -91,13 +91,9 @@  static inline int xen_acpi_get_gsi_info(struct pci_dev *dev,
 }
 #endif
 
-#ifdef CONFIG_XEN_PCI_STUB
-int pcistub_get_gsi_from_sbdf(unsigned int sbdf);
-#else
-static inline int pcistub_get_gsi_from_sbdf(unsigned int sbdf)
-{
-	return -1;
-}
-#endif
+typedef int (*get_gsi_from_sbdf_t)(u32 sbdf);
+
+void xen_acpi_register_get_gsi_func(get_gsi_from_sbdf_t func);
+int xen_acpi_get_gsi_from_sbdf(u32 sbdf);
 
 #endif	/* _XEN_ACPI_H */