mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
platform/x86/amd/pmc: Handle overflow cases where the num_samples range is higher
In amd_pmc_stb_debugfs_open_v2(), the stb buffer is created based on the num_samples and the read/write pointer offset. This holds good when the num_samples reported by PMFW is less than S2D_TELEMETRY_BYTES_MAX; where the stb buffer gets filled from 0th position until S2D_TELEMETRY_BYTES_MAX - 1 based on the read/write pointer offset. But when the num_samples exceeds the S2D_TELEMETRY_BYTES_MAX, the current code does not handle it well as it does not account for the cases where the stb buffer has to filled up as a circular buffer. Handle this scenario into two cases, where first memcpy will have the samples from location: (num_samples % S2D_TELEMETRY_BYTES_MAX) - (S2D_TELEMETRY_BYTES_MAX - 1) and next memcpy will have the newest ones i.e. 0 - (num_samples % S2D_TELEMETRY_BYTES_MAX - 1) Suggested-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Sanket Goswami <Sanket.Goswami@amd.com> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> Link: https://lore.kernel.org/r/20231010145003.139932-2-Shyam-sundar.S-k@amd.com [ij: renamed flex_arr -> stb_data_arr] Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
d9f421da6b
commit
b136225746
1 changed files with 13 additions and 6 deletions
|
@ -276,16 +276,23 @@ static int amd_pmc_stb_debugfs_open_v2(struct inode *inode, struct file *filp)
|
|||
|
||||
stb_data_arr->size = fsize;
|
||||
|
||||
/* Start capturing data from the last push location */
|
||||
/*
|
||||
* Start capturing data from the last push location.
|
||||
* This is for general cases, where the stb limits
|
||||
* are meant for standard usage.
|
||||
*/
|
||||
if (num_samples > S2D_TELEMETRY_BYTES_MAX) {
|
||||
fsize = S2D_TELEMETRY_BYTES_MAX;
|
||||
stb_rdptr_offset = num_samples - fsize;
|
||||
/* First read oldest data starting 1 behind last write till end of ringbuffer */
|
||||
stb_rdptr_offset = num_samples % S2D_TELEMETRY_BYTES_MAX;
|
||||
fsize = S2D_TELEMETRY_BYTES_MAX - stb_rdptr_offset;
|
||||
|
||||
memcpy_fromio(stb_data_arr->data, dev->stb_virt_addr + stb_rdptr_offset, fsize);
|
||||
/* Second copy the newer samples from offset 0 - last write */
|
||||
memcpy_fromio(stb_data_arr->data + fsize, dev->stb_virt_addr, stb_rdptr_offset);
|
||||
} else {
|
||||
fsize = num_samples;
|
||||
stb_rdptr_offset = 0;
|
||||
memcpy_fromio(stb_data_arr->data, dev->stb_virt_addr, fsize);
|
||||
}
|
||||
|
||||
memcpy_fromio(stb_data_arr->data, dev->stb_virt_addr + stb_rdptr_offset, fsize);
|
||||
filp->private_data = stb_data_arr;
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue