Patch "s390/cpum_sf: Avoid SBD overflow condition in irq handler" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    s390/cpum_sf: Avoid SBD overflow condition in irq handler

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     s390-cpum_sf-avoid-sbd-overflow-condition-in-irq-han.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a6cda674635e422b565e2b66b009f9ad6e6c7c5a
Author: Thomas Richter <tmricht@xxxxxxxxxxxxx>
Date:   Fri Nov 29 15:24:25 2019 +0100

    s390/cpum_sf: Avoid SBD overflow condition in irq handler
    
    [ Upstream commit 0539ad0b22877225095d8adef0c376f52cc23834 ]
    
    The s390 CPU Measurement sampling facility has an overflow condition
    which fires when all entries in a SBD are used.
    The measurement alert interrupt is triggered and reads out all samples
    in this SDB. It then tests the successor SDB, if this SBD is not full,
    the interrupt handler does not read any samples at all from this SDB
    The design waits for the hardware to fill this SBD and then trigger
    another meassurement alert interrupt.
    
    This scheme works nicely until
    an perf_event_overflow() function call discards the sample due to
    a too high sampling rate.
    The interrupt handler has logic to read out a partially filled SDB
    when the perf event overflow condition in linux common code is met.
    This causes the CPUM sampling measurement hardware and the PMU
    device driver to operate on the same SBD's trailer entry.
    This should not happen.
    
    This can be seen here using this trace:
       cpumsf_pmu_add: tear:0xb5286000
       hw_perf_event_update: sdbt 0xb5286000 full 1 over 0 flush_all:0
       hw_perf_event_update: sdbt 0xb5286008 full 0 over 0 flush_all:0
            above shows 1. interrupt
       hw_perf_event_update: sdbt 0xb5286008 full 1 over 0 flush_all:0
       hw_perf_event_update: sdbt 0xb5286008 full 0 over 0 flush_all:0
            above shows 2. interrupt
            ... this goes on fine until...
       hw_perf_event_update: sdbt 0xb5286068 full 1 over 0 flush_all:0
       perf_push_sample1: overflow
          one or more samples read from the IRQ handler are rejected by
          perf_event_overflow() and the IRQ handler advances to the next SDB
          and modifies the trailer entry of a partially filled SDB.
       hw_perf_event_update: sdbt 0xb5286070 full 0 over 0 flush_all:1
          timestamp: 14:32:52.519953
    
    Next time the IRQ handler is called for this SDB the trailer entry shows
    an overflow count of 19 missed entries.
       hw_perf_event_update: sdbt 0xb5286070 full 1 over 19 flush_all:1
          timestamp: 14:32:52.970058
    
    Remove access to a follow on SDB when event overflow happened.
    
    Signed-off-by: Thomas Richter <tmricht@xxxxxxxxxxxxx>
    Signed-off-by: Vasily Gorbik <gor@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
index 0b0958530552..8ba440ba8462 100644
--- a/arch/s390/kernel/perf_cpum_sf.c
+++ b/arch/s390/kernel/perf_cpum_sf.c
@@ -1248,12 +1248,6 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)
 		 */
 		if (flush_all && done)
 			break;
-
-		/* If an event overflow happened, discard samples by
-		 * processing any remaining sample-data-blocks.
-		 */
-		if (event_overflow)
-			flush_all = 1;
 	}
 
 	/* Account sample overflows in the event hardware structure */



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux