diff mbox series

tpm: Fix memory leak in tpmm_chip_alloc

Message ID 20220307104827.40843-1-guozihua@huawei.com (mailing list archive)
State New, archived
Headers show
Series tpm: Fix memory leak in tpmm_chip_alloc | expand

Commit Message

Guozihua (Scott) March 7, 2022, 10:48 a.m. UTC
Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
call put_device on error, while tpm->devs is left untouched. Call
put_device on tpm->devs as well if devm_add_action_or_reset returns an
error.

Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
Signed-off-by: GUO Zihua <guozihua@huawei.com>
---
 drivers/char/tpm/tpm-chip.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

Comments

Jarkko Sakkinen March 7, 2022, 1:45 p.m. UTC | #1
On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
> Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
> call put_device on error, while tpm->devs is left untouched. Call
> put_device on tpm->devs as well if devm_add_action_or_reset returns an
> error.
> 
> Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
> Signed-off-by: GUO Zihua <guozihua@huawei.com>
> ---
>  drivers/char/tpm/tpm-chip.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> index b009e7479b70..0a92334e8c40 100644
> --- a/drivers/char/tpm/tpm-chip.c
> +++ b/drivers/char/tpm/tpm-chip.c
> @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
>  	return 0;
>  }
>  
> +static void tpm_chip_free(struct tpm_chip *chip)
> +{
> +	put_device(&chip->devs);
> +	put_device(&chip->dev);
> +}
> +
>  /**
>   * tpm_chip_alloc() - allocate a new struct tpm_chip instance
>   * @pdev: device to which the chip is associated
> @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
>  	return chip;
>  
>  out:
> -	put_device(&chip->devs);
> -	put_device(&chip->dev);
> +	tpm_chip_free(chip);
>  	return ERR_PTR(rc);
>  }
>  EXPORT_SYMBOL_GPL(tpm_chip_alloc);
> @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
>  		return chip;
>  
>  	rc = devm_add_action_or_reset(pdev,
> -				      (void (*)(void *)) put_device,
> -				      &chip->dev);
> +				      (void (*)(void *)) tpm_chip_free,
> +				      chip);
>  	if (rc)
>  		return ERR_PTR(rc);
>  
> -- 
> 2.17.1
> 

Please test against the latest in

git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git

and share your results.

BR, Jarkko
Guozihua (Scott) March 10, 2022, 3:33 a.m. UTC | #2
On 2022/3/7 21:45, Jarkko Sakkinen wrote:
> On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
>> Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
>> call put_device on error, while tpm->devs is left untouched. Call
>> put_device on tpm->devs as well if devm_add_action_or_reset returns an
>> error.
>>
>> Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
>> Signed-off-by: GUO Zihua <guozihua@huawei.com>
>> ---
>>   drivers/char/tpm/tpm-chip.c | 13 +++++++++----
>>   1 file changed, 9 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
>> index b009e7479b70..0a92334e8c40 100644
>> --- a/drivers/char/tpm/tpm-chip.c
>> +++ b/drivers/char/tpm/tpm-chip.c
>> @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
>>   	return 0;
>>   }
>>   
>> +static void tpm_chip_free(struct tpm_chip *chip)
>> +{
>> +	put_device(&chip->devs);
>> +	put_device(&chip->dev);
>> +}
>> +
>>   /**
>>    * tpm_chip_alloc() - allocate a new struct tpm_chip instance
>>    * @pdev: device to which the chip is associated
>> @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
>>   	return chip;
>>   
>>   out:
>> -	put_device(&chip->devs);
>> -	put_device(&chip->dev);
>> +	tpm_chip_free(chip);
>>   	return ERR_PTR(rc);
>>   }
>>   EXPORT_SYMBOL_GPL(tpm_chip_alloc);
>> @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
>>   		return chip;
>>   
>>   	rc = devm_add_action_or_reset(pdev,
>> -				      (void (*)(void *)) put_device,
>> -				      &chip->dev);
>> +				      (void (*)(void *)) tpm_chip_free,
>> +				      chip);
>>   	if (rc)
>>   		return ERR_PTR(rc);
>>   
>> -- 
>> 2.17.1
>>
> 
> Please test against the latest in
> 
> git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
> 
> and share your results.
> 
> BR, Jarkko
> .

Hi Jarkko,

I'll do that. Do we have a test set for TPM? Or do we just build and run 
it and see if everything works as expected?

This is an error handling optimization BTW.
Jarkko Sakkinen March 11, 2022, 4:34 p.m. UTC | #3
On Thu, 2022-03-10 at 11:33 +0800, Guozihua (Scott) wrote:
> 
> 
> On 2022/3/7 21:45, Jarkko Sakkinen wrote:
> > On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
> > > Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
> > > call put_device on error, while tpm->devs is left untouched. Call
> > > put_device on tpm->devs as well if devm_add_action_or_reset returns an
> > > error.
> > > 
> > > Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
> > > Signed-off-by: GUO Zihua <guozihua@huawei.com>
> > > ---
> > >   drivers/char/tpm/tpm-chip.c | 13 +++++++++----
> > >   1 file changed, 9 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> > > index b009e7479b70..0a92334e8c40 100644
> > > --- a/drivers/char/tpm/tpm-chip.c
> > > +++ b/drivers/char/tpm/tpm-chip.c
> > > @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
> > >         return 0;
> > >   }
> > >   
> > > +static void tpm_chip_free(struct tpm_chip *chip)
> > > +{
> > > +       put_device(&chip->devs);
> > > +       put_device(&chip->dev);
> > > +}
> > > +
> > >   /**
> > >    * tpm_chip_alloc() - allocate a new struct tpm_chip instance
> > >    * @pdev: device to which the chip is associated
> > > @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
> > >         return chip;
> > >   
> > >   out:
> > > -       put_device(&chip->devs);
> > > -       put_device(&chip->dev);
> > > +       tpm_chip_free(chip);
> > >         return ERR_PTR(rc);
> > >   }
> > >   EXPORT_SYMBOL_GPL(tpm_chip_alloc);
> > > @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
> > >                 return chip;
> > >   
> > >         rc = devm_add_action_or_reset(pdev,
> > > -                                     (void (*)(void *)) put_device,
> > > -                                     &chip->dev);
> > > +                                     (void (*)(void *)) tpm_chip_free,
> > > +                                     chip);
> > >         if (rc)
> > >                 return ERR_PTR(rc);
> > >   
> > > -- 
> > > 2.17.1
> > > 
> > 
> > Please test against the latest in
> > 
> > git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
> > 
> > and share your results.
> > 
> > BR, Jarkko
> > .
> 
> Hi Jarkko,
> 
> I'll do that. Do we have a test set for TPM? Or do we just build and run 
> it and see if everything works as expected?
> 
> This is an error handling optimization BTW.

There is kselftest in tools/testing/kselftes/tpm2 that you can use
but do not have to.

BR, Jarkko
Guozihua (Scott) March 14, 2022, 7:10 a.m. UTC | #4
On 2022/3/12 0:34, Jarkko Sakkinen wrote:
> On Thu, 2022-03-10 at 11:33 +0800, Guozihua (Scott) wrote:
>>
>>
>> On 2022/3/7 21:45, Jarkko Sakkinen wrote:
>>> On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
>>>> Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
>>>> call put_device on error, while tpm->devs is left untouched. Call
>>>> put_device on tpm->devs as well if devm_add_action_or_reset returns an
>>>> error.
>>>>
>>>> Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
>>>> Signed-off-by: GUO Zihua <guozihua@huawei.com>
>>>> ---
>>>>    drivers/char/tpm/tpm-chip.c | 13 +++++++++----
>>>>    1 file changed, 9 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
>>>> index b009e7479b70..0a92334e8c40 100644
>>>> --- a/drivers/char/tpm/tpm-chip.c
>>>> +++ b/drivers/char/tpm/tpm-chip.c
>>>> @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
>>>>          return 0;
>>>>    }
>>>>    
>>>> +static void tpm_chip_free(struct tpm_chip *chip)
>>>> +{
>>>> +       put_device(&chip->devs);
>>>> +       put_device(&chip->dev);
>>>> +}
>>>> +
>>>>    /**
>>>>     * tpm_chip_alloc() - allocate a new struct tpm_chip instance
>>>>     * @pdev: device to which the chip is associated
>>>> @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
>>>>          return chip;
>>>>    
>>>>    out:
>>>> -       put_device(&chip->devs);
>>>> -       put_device(&chip->dev);
>>>> +       tpm_chip_free(chip);
>>>>          return ERR_PTR(rc);
>>>>    }
>>>>    EXPORT_SYMBOL_GPL(tpm_chip_alloc);
>>>> @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
>>>>                  return chip;
>>>>    
>>>>          rc = devm_add_action_or_reset(pdev,
>>>> -                                     (void (*)(void *)) put_device,
>>>> -                                     &chip->dev);
>>>> +                                     (void (*)(void *)) tpm_chip_free,
>>>> +                                     chip);
>>>>          if (rc)
>>>>                  return ERR_PTR(rc);
>>>>    
>>>> -- 
>>>> 2.17.1
>>>>
>>>
>>> Please test against the latest in
>>>
>>> git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
>>>
>>> and share your results.
>>>
>>> BR, Jarkko
>>> .
>>
>> Hi Jarkko,
>>
>> I'll do that. Do we have a test set for TPM? Or do we just build and run
>> it and see if everything works as expected?
>>
>> This is an error handling optimization BTW.
> 
> There is kselftest in tools/testing/kselftes/tpm2 that you can use
> but do not have to.
> 
> BR, Jarkko
> 
> 

Great! Thanks Jarkko!
Jason Gunthorpe March 14, 2022, 4:37 p.m. UTC | #5
On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
> Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
> call put_device on error, while tpm->devs is left untouched. Call
> put_device on tpm->devs as well if devm_add_action_or_reset returns an
> error.
> 
> Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
> Signed-off-by: GUO Zihua <guozihua@huawei.com>
>  drivers/char/tpm/tpm-chip.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> index b009e7479b70..0a92334e8c40 100644
> +++ b/drivers/char/tpm/tpm-chip.c
> @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
>  	return 0;
>  }
>  
> +static void tpm_chip_free(struct tpm_chip *chip)
> +{
> +	put_device(&chip->devs);
> +	put_device(&chip->dev);
> +}
> +
>  /**
>   * tpm_chip_alloc() - allocate a new struct tpm_chip instance
>   * @pdev: device to which the chip is associated
> @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
>  	return chip;
>  
>  out:
> -	put_device(&chip->devs);
> -	put_device(&chip->dev);
> +	tpm_chip_free(chip);
>  	return ERR_PTR(rc);
>  }
>  EXPORT_SYMBOL_GPL(tpm_chip_alloc);
> @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
>  		return chip;
>  
>  	rc = devm_add_action_or_reset(pdev,
> -				      (void (*)(void *)) put_device,
> -				      &chip->dev);
> +				      (void (*)(void *)) tpm_chip_free,
> +				      chip);
>  	if (rc)

This looks like the same issue as was adressed by the recent discussion..

Jason
Guozihua (Scott) March 15, 2022, 1:55 a.m. UTC | #6
On 2022/3/15 0:37, Jason Gunthorpe wrote:
> On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
>> Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
>> call put_device on error, while tpm->devs is left untouched. Call
>> put_device on tpm->devs as well if devm_add_action_or_reset returns an
>> error.
>>
>> Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
>> Signed-off-by: GUO Zihua <guozihua@huawei.com>
>>   drivers/char/tpm/tpm-chip.c | 13 +++++++++----
>>   1 file changed, 9 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
>> index b009e7479b70..0a92334e8c40 100644
>> +++ b/drivers/char/tpm/tpm-chip.c
>> @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
>>   	return 0;
>>   }
>>   
>> +static void tpm_chip_free(struct tpm_chip *chip)
>> +{
>> +	put_device(&chip->devs);
>> +	put_device(&chip->dev);
>> +}
>> +
>>   /**
>>    * tpm_chip_alloc() - allocate a new struct tpm_chip instance
>>    * @pdev: device to which the chip is associated
>> @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
>>   	return chip;
>>   
>>   out:
>> -	put_device(&chip->devs);
>> -	put_device(&chip->dev);
>> +	tpm_chip_free(chip);
>>   	return ERR_PTR(rc);
>>   }
>>   EXPORT_SYMBOL_GPL(tpm_chip_alloc);
>> @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
>>   		return chip;
>>   
>>   	rc = devm_add_action_or_reset(pdev,
>> -				      (void (*)(void *)) put_device,
>> -				      &chip->dev);
>> +				      (void (*)(void *)) tpm_chip_free,
>> +				      chip);
>>   	if (rc)
> 
> This looks like the same issue as was adressed by the recent discussion..
> 
> Jason
> .

Hi Jason,

Would you mind refer me to the discussion?
Guozihua (Scott) March 15, 2022, 3:11 a.m. UTC | #7
On 2022/3/12 0:34, Jarkko Sakkinen wrote:
> On Thu, 2022-03-10 at 11:33 +0800, Guozihua (Scott) wrote:
>>
>>
>> On 2022/3/7 21:45, Jarkko Sakkinen wrote:
>>> On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
>>>> Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
>>>> call put_device on error, while tpm->devs is left untouched. Call
>>>> put_device on tpm->devs as well if devm_add_action_or_reset returns an
>>>> error.
>>>>
>>>> Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
>>>> Signed-off-by: GUO Zihua <guozihua@huawei.com>
>>>> ---
>>>>    drivers/char/tpm/tpm-chip.c | 13 +++++++++----
>>>>    1 file changed, 9 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
>>>> index b009e7479b70..0a92334e8c40 100644
>>>> --- a/drivers/char/tpm/tpm-chip.c
>>>> +++ b/drivers/char/tpm/tpm-chip.c
>>>> @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
>>>>          return 0;
>>>>    }
>>>>    
>>>> +static void tpm_chip_free(struct tpm_chip *chip)
>>>> +{
>>>> +       put_device(&chip->devs);
>>>> +       put_device(&chip->dev);
>>>> +}
>>>> +
>>>>    /**
>>>>     * tpm_chip_alloc() - allocate a new struct tpm_chip instance
>>>>     * @pdev: device to which the chip is associated
>>>> @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
>>>>          return chip;
>>>>    
>>>>    out:
>>>> -       put_device(&chip->devs);
>>>> -       put_device(&chip->dev);
>>>> +       tpm_chip_free(chip);
>>>>          return ERR_PTR(rc);
>>>>    }
>>>>    EXPORT_SYMBOL_GPL(tpm_chip_alloc);
>>>> @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
>>>>                  return chip;
>>>>    
>>>>          rc = devm_add_action_or_reset(pdev,
>>>> -                                     (void (*)(void *)) put_device,
>>>> -                                     &chip->dev);
>>>> +                                     (void (*)(void *)) tpm_chip_free,
>>>> +                                     chip);
>>>>          if (rc)
>>>>                  return ERR_PTR(rc);
>>>>    
>>>> -- 
>>>> 2.17.1
>>>>
>>>
>>> Please test against the latest in
>>>
>>> git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
>>>
>>> and share your results.
>>>
>>> BR, Jarkko
>>> .
>>
>> Hi Jarkko,
>>
>> I'll do that. Do we have a test set for TPM? Or do we just build and run
>> it and see if everything works as expected?
>>
>> This is an error handling optimization BTW.
> 
> There is kselftest in tools/testing/kselftes/tpm2 that you can use
> but do not have to.
> 
> BR, Jarkko
> 
> 

Hi Jarkko,

The code on the master branch on 
git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git 
seems to be quite different from what I saw on linux upstream. Namely 
tpm_chip->devs does not exist on linux-tpmdd. Has this member been deleted?
Jarkko Sakkinen March 17, 2022, 7:31 a.m. UTC | #8
On Mon, Mar 14, 2022 at 01:37:05PM -0300, Jason Gunthorpe wrote:
> On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
> > Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
> > call put_device on error, while tpm->devs is left untouched. Call
> > put_device on tpm->devs as well if devm_add_action_or_reset returns an
> > error.
> > 
> > Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
> > Signed-off-by: GUO Zihua <guozihua@huawei.com>
> >  drivers/char/tpm/tpm-chip.c | 13 +++++++++----
> >  1 file changed, 9 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> > index b009e7479b70..0a92334e8c40 100644
> > +++ b/drivers/char/tpm/tpm-chip.c
> > @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
> >  	return 0;
> >  }
> >  
> > +static void tpm_chip_free(struct tpm_chip *chip)
> > +{
> > +	put_device(&chip->devs);
> > +	put_device(&chip->dev);
> > +}
> > +
> >  /**
> >   * tpm_chip_alloc() - allocate a new struct tpm_chip instance
> >   * @pdev: device to which the chip is associated
> > @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
> >  	return chip;
> >  
> >  out:
> > -	put_device(&chip->devs);
> > -	put_device(&chip->dev);
> > +	tpm_chip_free(chip);
> >  	return ERR_PTR(rc);
> >  }
> >  EXPORT_SYMBOL_GPL(tpm_chip_alloc);
> > @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
> >  		return chip;
> >  
> >  	rc = devm_add_action_or_reset(pdev,
> > -				      (void (*)(void *)) put_device,
> > -				      &chip->dev);
> > +				      (void (*)(void *)) tpm_chip_free,
> > +				      chip);
> >  	if (rc)
> 
> This looks like the same issue as was adressed by the recent discussion..

Both fixes (Lino, jejb) are also part of my PR:

[*] https://lore.kernel.org/linux-integrity/Yi64TJXqto+VdoOo@iki.fi/

> Jason

BR, Jarkko
Jarkko Sakkinen March 17, 2022, 7:33 a.m. UTC | #9
On Tue, Mar 15, 2022 at 09:55:07AM +0800, Guozihua (Scott) wrote:
> 
> 
> On 2022/3/15 0:37, Jason Gunthorpe wrote:
> > On Mon, Mar 07, 2022 at 06:48:27PM +0800, GUO Zihua wrote:
> > > Fix a memory leak in tpmm_chip_alloc. devm_add_action_or_reset would
> > > call put_device on error, while tpm->devs is left untouched. Call
> > > put_device on tpm->devs as well if devm_add_action_or_reset returns an
> > > error.
> > > 
> > > Fixes: fdc915f7f719 ("tpm: expose spaces via a device link /dev/tpmrm")
> > > Signed-off-by: GUO Zihua <guozihua@huawei.com>
> > >   drivers/char/tpm/tpm-chip.c | 13 +++++++++----
> > >   1 file changed, 9 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> > > index b009e7479b70..0a92334e8c40 100644
> > > +++ b/drivers/char/tpm/tpm-chip.c
> > > @@ -308,6 +308,12 @@ static int tpm_class_shutdown(struct device *dev)
> > >   	return 0;
> > >   }
> > > +static void tpm_chip_free(struct tpm_chip *chip)
> > > +{
> > > +	put_device(&chip->devs);
> > > +	put_device(&chip->dev);
> > > +}
> > > +
> > >   /**
> > >    * tpm_chip_alloc() - allocate a new struct tpm_chip instance
> > >    * @pdev: device to which the chip is associated
> > > @@ -396,8 +402,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev,
> > >   	return chip;
> > >   out:
> > > -	put_device(&chip->devs);
> > > -	put_device(&chip->dev);
> > > +	tpm_chip_free(chip);
> > >   	return ERR_PTR(rc);
> > >   }
> > >   EXPORT_SYMBOL_GPL(tpm_chip_alloc);
> > > @@ -420,8 +425,8 @@ struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
> > >   		return chip;
> > >   	rc = devm_add_action_or_reset(pdev,
> > > -				      (void (*)(void *)) put_device,
> > > -				      &chip->dev);
> > > +				      (void (*)(void *)) tpm_chip_free,
> > > +				      chip);
> > >   	if (rc)
> > 
> > This looks like the same issue as was adressed by the recent discussion..
> > 
> > Jason
> > .
> 
> Hi Jason,
> 
> Would you mind refer me to the discussion?

Please test: git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git

And use tag tpmdd-next-v5.18-v2

If issues persists, let us know or send a fix.

BR, Jarkko
diff mbox series

Patch

diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index b009e7479b70..0a92334e8c40 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -308,6 +308,12 @@  static int tpm_class_shutdown(struct device *dev)
 	return 0;
 }
 
+static void tpm_chip_free(struct tpm_chip *chip)
+{
+	put_device(&chip->devs);
+	put_device(&chip->dev);
+}
+
 /**
  * tpm_chip_alloc() - allocate a new struct tpm_chip instance
  * @pdev: device to which the chip is associated
@@ -396,8 +402,7 @@  struct tpm_chip *tpm_chip_alloc(struct device *pdev,
 	return chip;
 
 out:
-	put_device(&chip->devs);
-	put_device(&chip->dev);
+	tpm_chip_free(chip);
 	return ERR_PTR(rc);
 }
 EXPORT_SYMBOL_GPL(tpm_chip_alloc);
@@ -420,8 +425,8 @@  struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
 		return chip;
 
 	rc = devm_add_action_or_reset(pdev,
-				      (void (*)(void *)) put_device,
-				      &chip->dev);
+				      (void (*)(void *)) tpm_chip_free,
+				      chip);
 	if (rc)
 		return ERR_PTR(rc);