All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Ehrhardt <lk@c--e.de>
To: RD Babiera <rdbabiera@google.com>
Cc: heikki.krogerus@linux.intel.com, gregkh@linuxfoundation.org,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	stable@vger.kernel.org
Subject: Re: [PATCH v4] usb: typec: class: fix typec_altmode_put_partner to put plugs
Date: Wed, 3 Jan 2024 20:43:12 +0100	[thread overview]
Message-ID: <ZZW40CsR+Ruu8dDS@cae.in-ulm.de> (raw)
In-Reply-To: <20240103181754.2492492-2-rdbabiera@google.com>

On Wed, Jan 03, 2024 at 06:17:55PM +0000, RD Babiera wrote:
> When typec_altmode_put_partner is called by a plug altmode upon release,
> the port altmode the plug belongs to will not remove its reference to the
> plug. The check to see if the altmode being released is a plug evaluates
> against the released altmode's partner instead of the calling altmode, so
> change adev in typec_altmode_put_partner to properly refer to the altmode
> being released.
> 
> Because typec_altmode_set_partner calls get_device() on the port altmode,
> add partner_adev that points to the port altmode in typec_put_partner to
> call put_device() on. typec_altmode_set_partner is not called for port
> altmodes, so add a check in typec_altmode_release to prevent
> typec_altmode_put_partner() calls on port altmode release.
> 
> Fixes: 8a37d87d72f0 ("usb: typec: Bus type for alternate modes")
> Cc: stable@vger.kernel.org
> Co-developed-by: Christian A. Ehrhardt <lk@c--e.de>
> Signed-off-by: Christian A. Ehrhardt <lk@c--e.de>
> Signed-off-by: RD Babiera <rdbabiera@google.com>

I was able to reproduce the bug of the original report from here

https://lore.kernel.org/all/CAP-bSRb3SXpgo_BEdqZB-p1K5625fMegRZ17ZkPE1J8ZYgEHDg@mail.gmail.com/

(with some hacks) and verified that this change on top of a revert
of b17b7fe6dd (already in linux-usb) fixes the original bug.
The test does not excercise the code that deals with cable plugs,
though. Thus:

Tested-by: Christian A. Ehrhardt <lk@c--e.de>

Given that this is otherwise a 6.7 regression it might be
a good idea to consider this for 6.7?

> ---
> Changes since v3:
> * added partner_adev to properly put_device() on port altmode.
> ---
>  drivers/usb/typec/class.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> index 4d11f2b536fa..015aa9253353 100644
> --- a/drivers/usb/typec/class.c
> +++ b/drivers/usb/typec/class.c
> @@ -263,11 +263,13 @@ static void typec_altmode_put_partner(struct altmode *altmode)
>  {
>  	struct altmode *partner = altmode->partner;
>  	struct typec_altmode *adev;
> +	struct typec_altmode *partner_adev;
>  
>  	if (!partner)
>  		return;
>  
> -	adev = &partner->adev;
> +	adev = &altmode->adev;
> +	partner_adev = &partner->adev;
>  
>  	if (is_typec_plug(adev->dev.parent)) {
>  		struct typec_plug *plug = to_typec_plug(adev->dev.parent);
> @@ -276,7 +278,7 @@ static void typec_altmode_put_partner(struct altmode *altmode)
>  	} else {
>  		partner->partner = NULL;
>  	}
> -	put_device(&adev->dev);
> +	put_device(&partner_adev->dev);
>  }
>  
>  /**
> @@ -497,7 +499,8 @@ static void typec_altmode_release(struct device *dev)
>  {
>  	struct altmode *alt = to_altmode(to_typec_altmode(dev));
>  
> -	typec_altmode_put_partner(alt);
> +	if (!is_typec_port(dev->parent))
> +		typec_altmode_put_partner(alt);
>  
>  	altmode_id_remove(alt->adev.dev.parent, alt->id);
>  	kfree(alt);
> 
> base-commit: e7d3b9f28654dbfce7e09f8028210489adaf6a33
> -- 
> 2.43.0.472.g3155946c3a-goog
> 
> 

regards   Christian


  reply	other threads:[~2024-01-03 19:43 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-03 18:17 [PATCH v4] usb: typec: class: fix typec_altmode_put_partner to put plugs RD Babiera
2024-01-03 19:43 ` Christian Ehrhardt [this message]
2024-01-04 15:27 ` Heikki Krogerus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZZW40CsR+Ruu8dDS@cae.in-ulm.de \
    --to=lk@c--e.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=rdbabiera@google.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.