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 - 2025 Red Hat, Inc.