[PATCH v2 1/3] xen/events: Cleanup find_virq() return codes

Jason Andryuk posted 3 patches 1 month, 1 week ago
There is a newer version of this series
[PATCH v2 1/3] xen/events: Cleanup find_virq() return codes
Posted by Jason Andryuk 1 month, 1 week ago
rc is overwritten by the evtchn_status hypercall in each iteration, so
the return value will be whatever the last iteration is.  Change to an
explicit -ENOENT for an un-found virq and return 0 on a successful
match.

Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
---
v2:
New
---
 drivers/xen/events/events_base.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
index 41309d38f78c..199afe59f357 100644
--- a/drivers/xen/events/events_base.c
+++ b/drivers/xen/events/events_base.c
@@ -1318,7 +1318,7 @@ static int find_virq(unsigned int virq, unsigned int cpu, evtchn_port_t *evtchn)
 {
 	struct evtchn_status status;
 	evtchn_port_t port;
-	int rc = -ENOENT;
+	int rc;
 
 	memset(&status, 0, sizeof(status));
 	for (port = 0; port < xen_evtchn_max_channels(); port++) {
@@ -1331,10 +1331,10 @@ static int find_virq(unsigned int virq, unsigned int cpu, evtchn_port_t *evtchn)
 			continue;
 		if (status.u.virq == virq && status.vcpu == xen_vcpu_nr(cpu)) {
 			*evtchn = port;
-			break;
+			return 0;
 		}
 	}
-	return rc;
+	return -ENOENT;
 }
 
 /**
-- 
2.50.1
Re: [PATCH v2 1/3] xen/events: Cleanup find_virq() return codes
Posted by Jan Beulich 1 month, 1 week ago
On 26.08.2025 02:55, Jason Andryuk wrote:
> rc is overwritten by the evtchn_status hypercall in each iteration, so
> the return value will be whatever the last iteration is.

Which may even be a false "success". Especially for that it feels like ...

>  Change to an
> explicit -ENOENT for an un-found virq and return 0 on a successful
> match.
> 
> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>

... this also wants a Fixes: tag and perhaps a Cc: to stable@.

> --- a/drivers/xen/events/events_base.c
> +++ b/drivers/xen/events/events_base.c
> @@ -1318,7 +1318,7 @@ static int find_virq(unsigned int virq, unsigned int cpu, evtchn_port_t *evtchn)
>  {
>  	struct evtchn_status status;
>  	evtchn_port_t port;
> -	int rc = -ENOENT;
> +	int rc;

Maybe best to also move this into the more narrow scope (loop body)?
Either way:
Reviewed-by: Jan Beulich <jbeulich@suse.com>

>  	memset(&status, 0, sizeof(status));

Having this outside of the loop is a little odd, too: It makes assumptions
on the behavior of the hypervisor (like not altering the structure upon
error). Yet likely not something to deal with right here.

Jan
Re: [PATCH v2 1/3] xen/events: Cleanup find_virq() return codes
Posted by Jason Andryuk 1 month, 1 week ago
On 2025-08-26 03:22, Jan Beulich wrote:
> On 26.08.2025 02:55, Jason Andryuk wrote:
>> rc is overwritten by the evtchn_status hypercall in each iteration, so
>> the return value will be whatever the last iteration is.
> 
> Which may even be a false "success". Especially for that it feels like ...

I'll state that here...

> 
>>   Change to an
>> explicit -ENOENT for an un-found virq and return 0 on a successful
>> match.
>>
>> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
> 
> ... this also wants a Fixes: tag and perhaps a Cc: to stable@.

and add these.

> 
>> --- a/drivers/xen/events/events_base.c
>> +++ b/drivers/xen/events/events_base.c
>> @@ -1318,7 +1318,7 @@ static int find_virq(unsigned int virq, unsigned int cpu, evtchn_port_t *evtchn)
>>   {
>>   	struct evtchn_status status;
>>   	evtchn_port_t port;
>> -	int rc = -ENOENT;
>> +	int rc;
> 
> Maybe best to also move this into the more narrow scope (loop body)?

Sounds good.

> Either way:
> Reviewed-by: Jan Beulich <jbeulich@suse.com>

Thanks.

> 
>>   	memset(&status, 0, sizeof(status));
> 
> Having this outside of the loop is a little odd, too: It makes assumptions
> on the behavior of the hypervisor (like not altering the structure upon
> error). Yet likely not something to deal with right here.

Agreed.

Thanks,
Jason
Re: [PATCH v2 1/3] xen/events: Cleanup find_virq() return codes
Posted by Jürgen Groß 1 month, 1 week ago
On 26.08.25 17:03, Jason Andryuk wrote:
> On 2025-08-26 03:22, Jan Beulich wrote:
>> On 26.08.2025 02:55, Jason Andryuk wrote:
>>> rc is overwritten by the evtchn_status hypercall in each iteration, so
>>> the return value will be whatever the last iteration is.
>>
>> Which may even be a false "success". Especially for that it feels like ...
> 
> I'll state that here...
> 
>>
>>>   Change to an
>>> explicit -ENOENT for an un-found virq and return 0 on a successful
>>> match.
>>>
>>> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
>>
>> ... this also wants a Fixes: tag and perhaps a Cc: to stable@.
> 
> and add these.
> 
>>
>>> --- a/drivers/xen/events/events_base.c
>>> +++ b/drivers/xen/events/events_base.c
>>> @@ -1318,7 +1318,7 @@ static int find_virq(unsigned int virq, unsigned int 
>>> cpu, evtchn_port_t *evtchn)
>>>   {
>>>       struct evtchn_status status;
>>>       evtchn_port_t port;
>>> -    int rc = -ENOENT;
>>> +    int rc;
>>
>> Maybe best to also move this into the more narrow scope (loop body)?
> 
> Sounds good.
> 
>> Either way:
>> Reviewed-by: Jan Beulich <jbeulich@suse.com>

With the changes you promised to do:

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


Juergen