On Thu Feb 13, 2020 at 2:40 PM, Marcelo Diop-Gonzalez wrote: > If kref_get_unless_zero() fails, we should keep looking for the > next service, since the callers of this function expect that a NULL > return value means there are no more. > > Signed-off-by: Marcelo Diop-Gonzalez <marcgonzalez@xxxxxxxxxx> Reviewed-by: Nicolas Saenz Julienne <nsaenzjulienne@xxxxxxx> Tested-by: Nicolas Saenz Julienne <nsaenzjulienne@xxxxxxx> Note that, as Dan says, picking up the Fixes tag would be nice. > --- > .../vc04_services/interface/vchiq_arm/vchiq_core.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git > a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c > b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c > index d7d7f4d9d57f..edcd97373809 100644 > --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c > +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c > @@ -252,11 +252,15 @@ next_service_by_instance(struct vchiq_state > *state, > struct vchiq_service *service; > > rcu_read_lock(); > - service = __next_service_by_instance(state, instance, pidx); > - if (service && kref_get_unless_zero(&service->ref_count)) > - service = rcu_pointer_handoff(service); > - else > - service = NULL; > + while (1) { > + service = __next_service_by_instance(state, instance, pidx); > + if (!service) > + break; > + if (kref_get_unless_zero(&service->ref_count)) { > + service = rcu_pointer_handoff(service); > + break; > + } > + } > rcu_read_unlock(); > return service; > } > -- > 2.25.0.225.g125e21ebc7-goog _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel