s390/cpum_sf: remove flag PERF_CPUM_SF_FULL_BLOCKS
authorThomas Richter <tmricht@linux.ibm.com>
Thu, 16 Mar 2023 15:34:46 +0000 (16:34 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Mon, 27 Mar 2023 15:19:52 +0000 (17:19 +0200)
This flag is used to process only fully populated sampling buffers
when an sampling event is stopped on a CPU. By default the last sampling
buffer is also scanned for samples even if the sampling block full
indicator is not set in the trailer entry of a sampling buffer page.

This flag can be set via perf_event_attr::config1 field. It was never
used and never documented. It is useless now.

With PERF_CPUM_SF_FULL_BLOCKS:
When a process is scheduled off the CPU, the sampling is stopped and
the samples are copied to the perf ring buffer and marked invalid.
When stopped at the last full sample buffer page (which is
achieved with the PERF_CPUM_SF_FULL_BLOCKS options), the hardware
sampling will resume at the first free sample entry in the current,
partially filled sample buffer.

Without PERF_CPUM_SF_FULL_BLOCKS (default behavior):
The partially filled last sample buffer is scanned and valid samples
are saved to the perf ring buffer. The valid samples are marked invalid.
The sampling is resumed when the process is scheduled on this CPU.
Again the hardware sampling will resume at the first free sample entry in
the current, partially filled sample buffer.

Now the next interrupt handler invocation scans the
full sample block and saves the valid samples to the ring buffer.
It omits the invalid samples at the top of the buffer.
The default behavior is fully sufficient, therefore remove this feature.

Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Acked-by: Hendrik Brueckner <brueckner@linux.ibm.com>
Acked-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/perf_event.h
arch/s390/kernel/perf_cpum_sf.c

index b9da716..9917e27 100644 (file)
@@ -60,7 +60,6 @@ struct perf_sf_sde_regs {
 #define PERF_CPUM_SF_DIAG_MODE         0x0002    /* Diagnostic-sampling flag */
 #define PERF_CPUM_SF_MODE_MASK         (PERF_CPUM_SF_BASIC_MODE| \
                                         PERF_CPUM_SF_DIAG_MODE)
-#define PERF_CPUM_SF_FULL_BLOCKS       0x0004    /* Process full SDBs only */
 #define PERF_CPUM_SF_FREQ_MODE         0x0008    /* Sampling with frequency */
 
 #define REG_NONE               0
@@ -71,7 +70,6 @@ struct perf_sf_sde_regs {
 #define SAMPL_RATE(hwc)                ((hwc)->event_base)
 #define SAMPL_FLAGS(hwc)       ((hwc)->config_base)
 #define SAMPL_DIAG_MODE(hwc)   (SAMPL_FLAGS(hwc) & PERF_CPUM_SF_DIAG_MODE)
-#define SDB_FULL_BLOCKS(hwc)   (SAMPL_FLAGS(hwc) & PERF_CPUM_SF_FULL_BLOCKS)
 #define SAMPLE_FREQ_MODE(hwc)  (SAMPL_FLAGS(hwc) & PERF_CPUM_SF_FREQ_MODE)
 
 #define perf_arch_fetch_caller_regs(regs, __ip) do {                   \
index e7b867e..7ef72f5 100644 (file)
@@ -882,10 +882,6 @@ static int __hw_perf_event_init(struct perf_event *event)
                SAMPL_FLAGS(hwc) |= PERF_CPUM_SF_DIAG_MODE;
        }
 
-       /* Check and set other sampling flags */
-       if (attr->config1 & PERF_CPUM_SF_FULL_BLOCKS)
-               SAMPL_FLAGS(hwc) |= PERF_CPUM_SF_FULL_BLOCKS;
-
        err =  __hw_perf_event_init_rate(event, &si);
        if (err)
                goto out;
@@ -1293,11 +1289,8 @@ static inline __uint128_t __cdsg(__uint128_t *ptr, __uint128_t old, __uint128_t
  * The sampling buffer position are retrieved and saved in the TEAR_REG
  * register of the specified perf event.
  *
- * Only full sample-data-blocks are processed. Specify the flash_all flag
- * to also walk through partially filled sample-data-blocks.  It is ignored
- * if PERF_CPUM_SF_FULL_BLOCKS is set. The PERF_CPUM_SF_FULL_BLOCKS flag
- * enforces the processing of full sample-data-blocks only (trailer entries
- * with the block-full-indicator bit set).
+ * Only full sample-data-blocks are processed. Specify the flush_all flag
+ * to also walk through partially filled sample-data-blocks.
  */
 static void hw_perf_event_update(struct perf_event *event, int flush_all)
 {
@@ -1315,9 +1308,6 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)
        if (SAMPL_DIAG_MODE(&event->hw))
                return;
 
-       if (flush_all && SDB_FULL_BLOCKS(hwc))
-               flush_all = 0;
-
        sdbt = (unsigned long *) TEAR_REG(hwc);
        done = event_overflow = sampl_overflow = num_sdb = 0;
        while (!done) {