Commit 0d6f1693 authored by Thomas Richter's avatar Thomas Richter Committed by Vasily Gorbik

s390/cpum_sf: Rework sampling buffer allocation

Adjust sampling buffer allocation depending on
frequency and correct comments. Investigation on the
interrupt handler revealed that almost always one interupt
services one SDB, even when running with the maximum frequency
of 100000. Very rarely there have been 2 SBD serviced per
interrupt.

Therefore reduce the number of SBD per CPU. Each SDB is one
page in size. The new formula results in
freq:4000	n_sdb:32	new:16
freq:10000	n_sdb:80	new:16
freq:20000	n_sdb:159	new:17
freq:40000	n_sdb:318	new:19
freq:50000	n_sdb:397	new:20
freq:62500	n_sdb:497	new:22
freq:83333	n_sdb:662	new:24
freq:100000	n_sdb:794	new:25
Signed-off-by: default avatarThomas Richter <tmricht@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 11a48a5a
...@@ -372,28 +372,33 @@ static void deallocate_buffers(struct cpu_hw_sf *cpuhw) ...@@ -372,28 +372,33 @@ static void deallocate_buffers(struct cpu_hw_sf *cpuhw)
static int allocate_buffers(struct cpu_hw_sf *cpuhw, struct hw_perf_event *hwc) static int allocate_buffers(struct cpu_hw_sf *cpuhw, struct hw_perf_event *hwc)
{ {
unsigned long n_sdb, freq, factor; unsigned long n_sdb, freq;
size_t sample_size; size_t sample_size;
/* Calculate sampling buffers using 4K pages /* Calculate sampling buffers using 4K pages
* *
* 1. Determine the sample data size which depends on the used * 1. The sampling size is 32 bytes for basic sampling. This size
* sampling functions, for example, basic-sampling or * is the same for all machine types. Diagnostic
* basic-sampling with diagnostic-sampling. * sampling uses auxlilary data buffer setup which provides the
* memory for SDBs using linux common code auxiliary trace
* setup.
* *
* 2. Use the sampling frequency as input. The sampling buffer is * 2. Function alloc_sampling_buffer() sets the Alert Request
* designed for almost one second. This can be adjusted through
* the "factor" variable.
* In any case, alloc_sampling_buffer() sets the Alert Request
* Control indicator to trigger a measurement-alert to harvest * Control indicator to trigger a measurement-alert to harvest
* sample-data-blocks (sdb). * sample-data-blocks (SDB). This is done per SDB. This
* measurement alert interrupt fires quick enough to handle
* one SDB, on very high frequency and work loads there might
* be 2 to 3 SBDs available for sample processing.
* Currently there is no need for setup alert request on every
* n-th page. This is counterproductive as one IRQ triggers
* a very high number of samples to be processed at one IRQ.
* *
* 3. Compute the number of sample-data-blocks and ensure a minimum * 3. Use the sampling frequency as input.
* of CPUM_SF_MIN_SDB. Also ensure the upper limit does not * Compute the number of SDBs and ensure a minimum
* exceed a "calculated" maximum. The symbolic maximum is * of CPUM_SF_MIN_SDB. Depending on frequency add some more
* designed for basic-sampling only and needs to be increased if * SDBs to handle a higher sampling rate.
* diagnostic-sampling is active. * Use a minimum of CPUM_SF_MIN_SDB and allow for 100 samples
* See also the remarks for these symbolic constants. * (one SDB) for every 10000 HZ frequency increment.
* *
* 4. Compute the number of sample-data-block-tables (SDBT) and * 4. Compute the number of sample-data-block-tables (SDBT) and
* ensure a minimum of CPUM_SF_MIN_SDBT (one table can manage up * ensure a minimum of CPUM_SF_MIN_SDBT (one table can manage up
...@@ -401,10 +406,7 @@ static int allocate_buffers(struct cpu_hw_sf *cpuhw, struct hw_perf_event *hwc) ...@@ -401,10 +406,7 @@ static int allocate_buffers(struct cpu_hw_sf *cpuhw, struct hw_perf_event *hwc)
*/ */
sample_size = sizeof(struct hws_basic_entry); sample_size = sizeof(struct hws_basic_entry);
freq = sample_rate_to_freq(&cpuhw->qsi, SAMPL_RATE(hwc)); freq = sample_rate_to_freq(&cpuhw->qsi, SAMPL_RATE(hwc));
factor = 1; n_sdb = CPUM_SF_MIN_SDB + DIV_ROUND_UP(freq, 10000);
n_sdb = DIV_ROUND_UP(freq, factor * ((PAGE_SIZE-64) / sample_size));
if (n_sdb < CPUM_SF_MIN_SDB)
n_sdb = CPUM_SF_MIN_SDB;
/* If there is already a sampling buffer allocated, it is very likely /* If there is already a sampling buffer allocated, it is very likely
* that the sampling facility is enabled too. If the event to be * that the sampling facility is enabled too. If the event to be
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment