[PATCH] um: line: don't free winch (with IRQ) under spinlock

Anton Ivanov anton.ivanov at kot-begemot.co.uk
Fri Dec 4 12:26:55 EST 2020



On 04/12/2020 15:22, Johannes Berg wrote:
> From: Johannes Berg <johannes.berg at intel.com>
> 
> Lockdep correctly complains that one shouldn't call um_free_irq()
> with free_irq() inside under a spinlock since that will attempt
> to acquire a mutex.
> 
> Rearrange the code to keep the list manipulations under the lock
> while moving the actual freeing outside of it, to avoid this.
> 
> In particular, this removes the lockdep complaint at shutdown that
> I was seeing with lockdep enabled.
> 
> Signed-off-by: Johannes Berg <johannes.berg at intel.com>
> ---
>   arch/um/drivers/line.c | 12 ++++++++----
>   1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
> index 2d68f58ac54b..1c70a31e7c5b 100644
> --- a/arch/um/drivers/line.c
> +++ b/arch/um/drivers/line.c
> @@ -614,7 +614,6 @@ static void free_winch(struct winch *winch)
>   	winch->fd = -1;
>   	if (fd != -1)
>   		os_close_file(fd);
> -	list_del(&winch->list);
>   	__free_winch(&winch->work);
>   }
>   
> @@ -715,6 +714,8 @@ static void unregister_winch(struct tty_struct *tty)
>   		winch = list_entry(ele, struct winch, list);
>   		wtty = tty_port_tty_get(winch->port);
>   		if (wtty == tty) {
> +			list_del(&winch->list);
> +			spin_unlock(&winch_handler_lock);
>   			free_winch(winch);
>   			break;
>   		}
> @@ -725,14 +726,17 @@ static void unregister_winch(struct tty_struct *tty)
>   
>   static void winch_cleanup(void)
>   {
> -	struct list_head *ele, *next;
>   	struct winch *winch;
>   
>   	spin_lock(&winch_handler_lock);
> +	while ((winch = list_first_entry_or_null(&winch_handlers,
> +						 struct winch, list))) {
> +		list_del(&winch->list);
> +		spin_unlock(&winch_handler_lock);
>   
> -	list_for_each_safe(ele, next, &winch_handlers) {
> -		winch = list_entry(ele, struct winch, list);
>   		free_winch(winch);
> +
> +		spin_lock(&winch_handler_lock);
>   	}
>   
>   	spin_unlock(&winch_handler_lock);
> 

Acked-By: anton.ivanov at cambridgegreys.com

-- 
Anton R. Ivanov
https://www.kot-begemot.co.uk/



More information about the linux-um mailing list