coresight: tmc: Decouple the perf buffer allocation from sysfs mode

Currently the perf buffer allocation follows the below logic:
- if the required AUX buffer size if larger, allocate the buffer with
  the required size
- otherwise allocate the size reference to the sysfs buffer size

This is not useful as we only collect to one AUX data, so just try to
allocate the buffer match the AUX buffer size.

Suggested-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/linux-arm-kernel/df8967cd-2157-46a2-97d9-a1aea883cf63@arm.com/
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Junhao He <hejunhao3@h-partners.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20260121101543.2017014-4-wangyushan12@huawei.com
This commit is contained in:
Yicong Yang
2026-01-21 18:15:43 +08:00
committed by Suzuki K Poulose
parent e6e43e82c7
commit eebe8dbd86

View File

@@ -1367,9 +1367,7 @@ EXPORT_SYMBOL_GPL(tmc_etr_get_buffer);
/* /*
* alloc_etr_buf: Allocate ETR buffer for use by perf. * alloc_etr_buf: Allocate ETR buffer for use by perf.
* The size of the hardware buffer is dependent on the size configured * Allocate the largest possible size, scaling down the size by half until it
* via sysfs and the perf ring buffer size. We prefer to allocate the
* largest possible size, scaling down the size by half until it
* reaches a minimum limit (1M), beyond which we give up. * reaches a minimum limit (1M), beyond which we give up.
*/ */
static struct etr_buf * static struct etr_buf *
@@ -1378,36 +1376,26 @@ alloc_etr_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
{ {
int node; int node;
struct etr_buf *etr_buf; struct etr_buf *etr_buf;
unsigned long size; ssize_t size;
node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu);
/*
* Try to match the perf ring buffer size if it is larger /* Use the minimum limit if the required size is smaller */
* than the size requested via sysfs. size = nr_pages << PAGE_SHIFT;
*/ size = max_t(ssize_t, size, TMC_ETR_PERF_MIN_BUF_SIZE);
if ((nr_pages << PAGE_SHIFT) > drvdata->size) {
etr_buf = tmc_alloc_etr_buf(drvdata, ((ssize_t)nr_pages << PAGE_SHIFT),
0, node, NULL);
if (!IS_ERR(etr_buf))
goto done;
}
/* /*
* Else switch to configured size for this ETR * Try to allocate the required size for this ETR, if failed scale
* and scale down until we hit the minimum limit. * down until we hit the minimum limit.
*/ */
size = drvdata->size;
do { do {
etr_buf = tmc_alloc_etr_buf(drvdata, size, 0, node, NULL); etr_buf = tmc_alloc_etr_buf(drvdata, size, 0, node, NULL);
if (!IS_ERR(etr_buf)) if (!IS_ERR(etr_buf))
goto done; return etr_buf;
size /= 2; size /= 2;
} while (size >= TMC_ETR_PERF_MIN_BUF_SIZE); } while (size >= TMC_ETR_PERF_MIN_BUF_SIZE);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
done:
return etr_buf;
} }
static struct etr_buf * static struct etr_buf *