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
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
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
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
© 2016 - 2026 Red Hat, Inc.