Since the bios event log is freed in the device release function,
let devres handle the deallocation. This will allow other memory
allocation/mapping functions to be used for the bios event log.
Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
drivers/char/tpm/eventlog/acpi.c | 5 +++--
drivers/char/tpm/eventlog/efi.c | 13 +++++++------
drivers/char/tpm/eventlog/of.c | 3 ++-
drivers/char/tpm/tpm-chip.c | 1 -
4 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c
index 0913d3eb8d51..40360e599bc3 100644
--- a/drivers/char/tpm/eventlog/acpi.c
+++ b/drivers/char/tpm/eventlog/acpi.c
@@ -14,6 +14,7 @@
* Access to the event log extended by the TCG BIOS of PC platform
*/
+#include <linux/device.h>
#include <linux/seq_file.h>
#include <linux/fs.h>
#include <linux/security.h>
@@ -135,7 +136,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
}
/* malloc EventLog space */
- log->bios_event_log = kmalloc(len, GFP_KERNEL);
+ log->bios_event_log = devm_kmalloc(&chip->dev, len, GFP_KERNEL);
if (!log->bios_event_log)
return -ENOMEM;
@@ -160,7 +161,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
return format;
err:
- kfree(log->bios_event_log);
+ devm_kfree(&chip->dev, log->bios_event_log);
log->bios_event_log = NULL;
return ret;
}
diff --git a/drivers/char/tpm/eventlog/efi.c b/drivers/char/tpm/eventlog/efi.c
index e6cb9d525e30..4e9d7c2bf32e 100644
--- a/drivers/char/tpm/eventlog/efi.c
+++ b/drivers/char/tpm/eventlog/efi.c
@@ -6,6 +6,7 @@
* Thiebaud Weksteen <tweek@google.com>
*/
+#include <linux/device.h>
#include <linux/efi.h>
#include <linux/tpm_eventlog.h>
@@ -55,7 +56,7 @@ int tpm_read_log_efi(struct tpm_chip *chip)
}
/* malloc EventLog space */
- log->bios_event_log = kmemdup(log_tbl->log, log_size, GFP_KERNEL);
+ log->bios_event_log = devm_kmemdup(&chip->dev, log_tbl->log, log_size, GFP_KERNEL);
if (!log->bios_event_log) {
ret = -ENOMEM;
goto out;
@@ -76,7 +77,7 @@ int tpm_read_log_efi(struct tpm_chip *chip)
MEMREMAP_WB);
if (!final_tbl) {
pr_err("Could not map UEFI TPM final log\n");
- kfree(log->bios_event_log);
+ devm_kfree(&chip->dev, log->bios_event_log);
ret = -ENOMEM;
goto out;
}
@@ -91,11 +92,11 @@ int tpm_read_log_efi(struct tpm_chip *chip)
* Allocate memory for the 'combined log' where we will append the
* 'final events log' to.
*/
- tmp = krealloc(log->bios_event_log,
- log_size + final_events_log_size,
- GFP_KERNEL);
+ tmp = devm_krealloc(&chip->dev, log->bios_event_log,
+ log_size + final_events_log_size,
+ GFP_KERNEL);
if (!tmp) {
- kfree(log->bios_event_log);
+ devm_kfree(&chip->dev, log->bios_event_log);
ret = -ENOMEM;
goto out;
}
diff --git a/drivers/char/tpm/eventlog/of.c b/drivers/char/tpm/eventlog/of.c
index a9ce66d09a75..741ab2204b11 100644
--- a/drivers/char/tpm/eventlog/of.c
+++ b/drivers/char/tpm/eventlog/of.c
@@ -10,6 +10,7 @@
* Read the event log created by the firmware on PPC64
*/
+#include <linux/device.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/tpm_eventlog.h>
@@ -65,7 +66,7 @@ int tpm_read_log_of(struct tpm_chip *chip)
return -EIO;
}
- log->bios_event_log = kmemdup(__va(base), size, GFP_KERNEL);
+ log->bios_event_log = devm_kmemdup(&chip->dev, __va(base), size, GFP_KERNEL);
if (!log->bios_event_log)
return -ENOMEM;
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
index 741d8f3e8fb3..b99f55f2d4fd 100644
--- a/drivers/char/tpm/tpm-chip.c
+++ b/drivers/char/tpm/tpm-chip.c
@@ -267,7 +267,6 @@ static void tpm_dev_release(struct device *dev)
idr_remove(&dev_nums_idr, chip->dev_num);
mutex_unlock(&idr_lock);
- kfree(chip->log.bios_event_log);
kfree(chip->work_space.context_buf);
kfree(chip->work_space.session_buf);
kfree(chip->allocated_banks);
--
2.31.1
On Fri, Jan 13, 2023 at 10:10:16AM -0600, Eddie James wrote:
> Since the bios event log is freed in the device release function,
> let devres handle the deallocation. This will allow other memory
> allocation/mapping functions to be used for the bios event log.
>
> Signed-off-by: Eddie James <eajames@linux.ibm.com>
> ---
> drivers/char/tpm/eventlog/acpi.c | 5 +++--
> drivers/char/tpm/eventlog/efi.c | 13 +++++++------
> drivers/char/tpm/eventlog/of.c | 3 ++-
> drivers/char/tpm/tpm-chip.c | 1 -
> 4 files changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c
> index 0913d3eb8d51..40360e599bc3 100644
> --- a/drivers/char/tpm/eventlog/acpi.c
> +++ b/drivers/char/tpm/eventlog/acpi.c
> @@ -14,6 +14,7 @@
> * Access to the event log extended by the TCG BIOS of PC platform
> */
>
> +#include <linux/device.h>
> #include <linux/seq_file.h>
> #include <linux/fs.h>
> #include <linux/security.h>
> @@ -135,7 +136,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
> }
>
> /* malloc EventLog space */
> - log->bios_event_log = kmalloc(len, GFP_KERNEL);
> + log->bios_event_log = devm_kmalloc(&chip->dev, len, GFP_KERNEL);
> if (!log->bios_event_log)
> return -ENOMEM;
>
> @@ -160,7 +161,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
> return format;
>
> err:
> - kfree(log->bios_event_log);
> + devm_kfree(&chip->dev, log->bios_event_log);
I wonder do we want to do devm_kfree's at all as the memory is freed during
detach, i.e. taken care by devres.
> log->bios_event_log = NULL;
> return ret;
> }
> diff --git a/drivers/char/tpm/eventlog/efi.c b/drivers/char/tpm/eventlog/efi.c
> index e6cb9d525e30..4e9d7c2bf32e 100644
> --- a/drivers/char/tpm/eventlog/efi.c
> +++ b/drivers/char/tpm/eventlog/efi.c
> @@ -6,6 +6,7 @@
> * Thiebaud Weksteen <tweek@google.com>
> */
>
> +#include <linux/device.h>
> #include <linux/efi.h>
> #include <linux/tpm_eventlog.h>
>
> @@ -55,7 +56,7 @@ int tpm_read_log_efi(struct tpm_chip *chip)
> }
>
> /* malloc EventLog space */
> - log->bios_event_log = kmemdup(log_tbl->log, log_size, GFP_KERNEL);
> + log->bios_event_log = devm_kmemdup(&chip->dev, log_tbl->log, log_size, GFP_KERNEL);
> if (!log->bios_event_log) {
> ret = -ENOMEM;
> goto out;
> @@ -76,7 +77,7 @@ int tpm_read_log_efi(struct tpm_chip *chip)
> MEMREMAP_WB);
> if (!final_tbl) {
> pr_err("Could not map UEFI TPM final log\n");
> - kfree(log->bios_event_log);
> + devm_kfree(&chip->dev, log->bios_event_log);
> ret = -ENOMEM;
> goto out;
> }
> @@ -91,11 +92,11 @@ int tpm_read_log_efi(struct tpm_chip *chip)
> * Allocate memory for the 'combined log' where we will append the
> * 'final events log' to.
> */
> - tmp = krealloc(log->bios_event_log,
> - log_size + final_events_log_size,
> - GFP_KERNEL);
> + tmp = devm_krealloc(&chip->dev, log->bios_event_log,
> + log_size + final_events_log_size,
> + GFP_KERNEL);
> if (!tmp) {
> - kfree(log->bios_event_log);
> + devm_kfree(&chip->dev, log->bios_event_log);
> ret = -ENOMEM;
> goto out;
> }
> diff --git a/drivers/char/tpm/eventlog/of.c b/drivers/char/tpm/eventlog/of.c
> index a9ce66d09a75..741ab2204b11 100644
> --- a/drivers/char/tpm/eventlog/of.c
> +++ b/drivers/char/tpm/eventlog/of.c
> @@ -10,6 +10,7 @@
> * Read the event log created by the firmware on PPC64
> */
>
> +#include <linux/device.h>
> #include <linux/slab.h>
> #include <linux/of.h>
> #include <linux/tpm_eventlog.h>
> @@ -65,7 +66,7 @@ int tpm_read_log_of(struct tpm_chip *chip)
> return -EIO;
> }
>
> - log->bios_event_log = kmemdup(__va(base), size, GFP_KERNEL);
> + log->bios_event_log = devm_kmemdup(&chip->dev, __va(base), size, GFP_KERNEL);
> if (!log->bios_event_log)
> return -ENOMEM;
>
> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
> index 741d8f3e8fb3..b99f55f2d4fd 100644
> --- a/drivers/char/tpm/tpm-chip.c
> +++ b/drivers/char/tpm/tpm-chip.c
> @@ -267,7 +267,6 @@ static void tpm_dev_release(struct device *dev)
> idr_remove(&dev_nums_idr, chip->dev_num);
> mutex_unlock(&idr_lock);
>
> - kfree(chip->log.bios_event_log);
> kfree(chip->work_space.context_buf);
> kfree(chip->work_space.session_buf);
> kfree(chip->allocated_banks);
> --
> 2.31.1
>
BR, Jarkko
On 1/20/23 18:11, Jarkko Sakkinen wrote:
> On Fri, Jan 13, 2023 at 10:10:16AM -0600, Eddie James wrote:
>> Since the bios event log is freed in the device release function,
>> let devres handle the deallocation. This will allow other memory
>> allocation/mapping functions to be used for the bios event log.
>>
>> Signed-off-by: Eddie James <eajames@linux.ibm.com>
>> ---
>> drivers/char/tpm/eventlog/acpi.c | 5 +++--
>> drivers/char/tpm/eventlog/efi.c | 13 +++++++------
>> drivers/char/tpm/eventlog/of.c | 3 ++-
>> drivers/char/tpm/tpm-chip.c | 1 -
>> 4 files changed, 12 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c
>> index 0913d3eb8d51..40360e599bc3 100644
>> --- a/drivers/char/tpm/eventlog/acpi.c
>> +++ b/drivers/char/tpm/eventlog/acpi.c
>> @@ -14,6 +14,7 @@
>> * Access to the event log extended by the TCG BIOS of PC platform
>> */
>>
>> +#include <linux/device.h>
>> #include <linux/seq_file.h>
>> #include <linux/fs.h>
>> #include <linux/security.h>
>> @@ -135,7 +136,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
>> }
>>
>> /* malloc EventLog space */
>> - log->bios_event_log = kmalloc(len, GFP_KERNEL);
>> + log->bios_event_log = devm_kmalloc(&chip->dev, len, GFP_KERNEL);
>> if (!log->bios_event_log)
>> return -ENOMEM;
>>
>> @@ -160,7 +161,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
>> return format;
>>
>> err:
>> - kfree(log->bios_event_log);
>> + devm_kfree(&chip->dev, log->bios_event_log);
> I wonder do we want to do devm_kfree's at all as the memory is freed during
> detach, i.e. taken care by devres.
I think we should since the chip/tpm driver will continue to probe
without the bios event log. Therefore that memory will be wasted if
there is some error during bios log setup.
Thanks,
Eddie
>
>> log->bios_event_log = NULL;
>> return ret;
>> }
>> diff --git a/drivers/char/tpm/eventlog/efi.c b/drivers/char/tpm/eventlog/efi.c
>> index e6cb9d525e30..4e9d7c2bf32e 100644
>> --- a/drivers/char/tpm/eventlog/efi.c
>> +++ b/drivers/char/tpm/eventlog/efi.c
>> @@ -6,6 +6,7 @@
>> * Thiebaud Weksteen <tweek@google.com>
>> */
>>
>> +#include <linux/device.h>
>> #include <linux/efi.h>
>> #include <linux/tpm_eventlog.h>
>>
>> @@ -55,7 +56,7 @@ int tpm_read_log_efi(struct tpm_chip *chip)
>> }
>>
>> /* malloc EventLog space */
>> - log->bios_event_log = kmemdup(log_tbl->log, log_size, GFP_KERNEL);
>> + log->bios_event_log = devm_kmemdup(&chip->dev, log_tbl->log, log_size, GFP_KERNEL);
>> if (!log->bios_event_log) {
>> ret = -ENOMEM;
>> goto out;
>> @@ -76,7 +77,7 @@ int tpm_read_log_efi(struct tpm_chip *chip)
>> MEMREMAP_WB);
>> if (!final_tbl) {
>> pr_err("Could not map UEFI TPM final log\n");
>> - kfree(log->bios_event_log);
>> + devm_kfree(&chip->dev, log->bios_event_log);
>> ret = -ENOMEM;
>> goto out;
>> }
>> @@ -91,11 +92,11 @@ int tpm_read_log_efi(struct tpm_chip *chip)
>> * Allocate memory for the 'combined log' where we will append the
>> * 'final events log' to.
>> */
>> - tmp = krealloc(log->bios_event_log,
>> - log_size + final_events_log_size,
>> - GFP_KERNEL);
>> + tmp = devm_krealloc(&chip->dev, log->bios_event_log,
>> + log_size + final_events_log_size,
>> + GFP_KERNEL);
>> if (!tmp) {
>> - kfree(log->bios_event_log);
>> + devm_kfree(&chip->dev, log->bios_event_log);
>> ret = -ENOMEM;
>> goto out;
>> }
>> diff --git a/drivers/char/tpm/eventlog/of.c b/drivers/char/tpm/eventlog/of.c
>> index a9ce66d09a75..741ab2204b11 100644
>> --- a/drivers/char/tpm/eventlog/of.c
>> +++ b/drivers/char/tpm/eventlog/of.c
>> @@ -10,6 +10,7 @@
>> * Read the event log created by the firmware on PPC64
>> */
>>
>> +#include <linux/device.h>
>> #include <linux/slab.h>
>> #include <linux/of.h>
>> #include <linux/tpm_eventlog.h>
>> @@ -65,7 +66,7 @@ int tpm_read_log_of(struct tpm_chip *chip)
>> return -EIO;
>> }
>>
>> - log->bios_event_log = kmemdup(__va(base), size, GFP_KERNEL);
>> + log->bios_event_log = devm_kmemdup(&chip->dev, __va(base), size, GFP_KERNEL);
>> if (!log->bios_event_log)
>> return -ENOMEM;
>>
>> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c
>> index 741d8f3e8fb3..b99f55f2d4fd 100644
>> --- a/drivers/char/tpm/tpm-chip.c
>> +++ b/drivers/char/tpm/tpm-chip.c
>> @@ -267,7 +267,6 @@ static void tpm_dev_release(struct device *dev)
>> idr_remove(&dev_nums_idr, chip->dev_num);
>> mutex_unlock(&idr_lock);
>>
>> - kfree(chip->log.bios_event_log);
>> kfree(chip->work_space.context_buf);
>> kfree(chip->work_space.session_buf);
>> kfree(chip->allocated_banks);
>> --
>> 2.31.1
>>
> BR, Jarkko
On Wed, Jan 25, 2023 at 01:06:31PM -0600, Eddie James wrote: > > On 1/20/23 18:11, Jarkko Sakkinen wrote: > > On Fri, Jan 13, 2023 at 10:10:16AM -0600, Eddie James wrote: > > > Since the bios event log is freed in the device release function, > > > let devres handle the deallocation. This will allow other memory > > > allocation/mapping functions to be used for the bios event log. > > > > > > Signed-off-by: Eddie James <eajames@linux.ibm.com> > > > --- > > > drivers/char/tpm/eventlog/acpi.c | 5 +++-- > > > drivers/char/tpm/eventlog/efi.c | 13 +++++++------ > > > drivers/char/tpm/eventlog/of.c | 3 ++- > > > drivers/char/tpm/tpm-chip.c | 1 - > > > 4 files changed, 12 insertions(+), 10 deletions(-) > > > > > > diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c > > > index 0913d3eb8d51..40360e599bc3 100644 > > > --- a/drivers/char/tpm/eventlog/acpi.c > > > +++ b/drivers/char/tpm/eventlog/acpi.c > > > @@ -14,6 +14,7 @@ > > > * Access to the event log extended by the TCG BIOS of PC platform > > > */ > > > +#include <linux/device.h> > > > #include <linux/seq_file.h> > > > #include <linux/fs.h> > > > #include <linux/security.h> > > > @@ -135,7 +136,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip) > > > } > > > /* malloc EventLog space */ > > > - log->bios_event_log = kmalloc(len, GFP_KERNEL); > > > + log->bios_event_log = devm_kmalloc(&chip->dev, len, GFP_KERNEL); > > > if (!log->bios_event_log) > > > return -ENOMEM; > > > @@ -160,7 +161,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip) > > > return format; > > > err: > > > - kfree(log->bios_event_log); > > > + devm_kfree(&chip->dev, log->bios_event_log); > > I wonder do we want to do devm_kfree's at all as the memory is freed during > > detach, i.e. taken care by devres. > > > I think we should since the chip/tpm driver will continue to probe without > the bios event log. Therefore that memory will be wasted if there is some > error during bios log setup. OK, I buy this! For this patch: Tested-by: Jarkko Sakkinen <jarkko@kernel.org> Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> If you could refine the description for the 2nd, then these would be ready to be picked. > Thanks, > > Eddie BR, Jarkko
© 2016 - 2026 Red Hat, Inc.