[PATCH v4 12/15] drivers/firmware/sdei: Remove _sdei_event_register()

James Morse james.morse at arm.com
Fri Sep 18 12:14:43 EDT 2020


Hi Gavin,

On 30/07/2020 02:45, Gavin Shan wrote:
> The function _sdei_event_register() is called by sdei_event_register()
> and sdei_device_thaw() as the following functional call chain shows.
> _sdei_event_register() covers the shared and private events, but
> sdei_device_thaw() only covers the shared events. So the logic to
> cover the private events in _sdei_event_register() isn't needed by
> sdei_device_thaw().
> 
> Similarly, sdei_reregister_event_llocked() covers the shared and
> private events in the regard of reenablement. The logic to cover
> the private events isn't needed by sdei_device_thaw() either.

These were added for code-reuse instead of duplication, but from the diff-stat it looks
like it cut-in too high up and would have been simpler not to. (I remember cpuhp being a
nightmare)


>    sdei_event_register          sdei_device_thaw
>       _sdei_event_register         sdei_reregister_shared
>                                       sdei_reregister_event_llocked
>                                          _sdei_event_register
> 
> This removes _sdei_event_register() and sdei_reregister_event_llocked().
> Their logic is moved to sdei_event_register() and sdei_reregister_shared().
> This shouldn't cause any logicial changes.

(logical)


>  drivers/firmware/arm_sdei.c | 77 ++++++++++++++-----------------------
>  1 file changed, 28 insertions(+), 49 deletions(-)

>  static int sdei_reregister_shared(void)
>  {
>  	int err = 0;
> @@ -674,9 +638,24 @@ static int sdei_reregister_shared(void)
>  			continue;
>  
>  		if (event->reregister) {
> -			err = sdei_reregister_event_llocked(event);
> -			if (err)
> +			err = sdei_api_event_register(event->event_num,
> +					sdei_entry_point, event->registered,
> +					SDEI_EVENT_REGISTER_RM_ANY, 0);
> +			if (err) {
> +				sdei_event_destroy_llocked(event);

> +				pr_err("Failed to re-register event %u\n",
> +				       event->event_num);

sdei_event_destroy_llocked() just free()'d event. You need to print the error first.


>  				break;
> +			}
> +		}
> +
> +		if (event->reenable) {
> +			err = sdei_api_event_enable(event->event_num);
> +			if (err) {
> +				pr_err("Failed to re-enable event %u\n",
> +				       event->event_num);
> +				break;
> +			}
>  		}
>  	}
>  	spin_unlock(&sdei_list_lock);


With the use-after-free fixed:
Reviewed-by: James Morse <james.morse at arm.com>


Thanks,

James



More information about the linux-arm-kernel mailing list