• Hendrik Brueckner's avatar
    s390/cpum_cf: Add minimal in-kernel interface for counter measurements · 17bebcc6
    Hendrik Brueckner authored
    Introduce a minimal interface for doing counter measurements of small
    units of work within the kernel.  Use the kernel_cpumcf_begin() function
    start a measurement session and, later, stop it with kernel_cpumcf_end().
    
    During the measreument session, you can enable and start/stop counter sets
    by using ctr_set_* functions.  To make these changes effective use the
    lcctl() function.  You can then use the ecctr() function to extract counters
    from the different counter sets.
    Please note that you have to check whether the counter sets to be enabled
    are authorized.
    
    Note that when a measurement session is active, other users cannot perform
    counter measurements.  In such cases, kernel_cpumcf_begin() indicates this
    with returning -EBUSY.  If the counter facility is not available,
    kernel_cpumcf_begin() returns -ENODEV.
    
    Note that this interface is restricted to the current CPU and, thus,
    preemption must be turned off.
    
    Example:
    
    	u32 state, err;
    	u64 cycles, insn;
    
    	err = kernel_cpumcf_begin();
    	if (err)
    		goto out_busy;
    
    	state = 0;
    	ctr_set_enable(&state, CPUMF_CTR_SET_BASIC);
    	ctr_set_start(&state, CPUMF_CTR_SET_BASIC);
    
    	err = lcctl(state);
    	if (err)
    		goto ;
    
    	/* ... do your work ... */
    
    	ctr_set_stop(&state, CPUMF_CTR_SET_BASIC);
    	err = lcctl(state);
    	if (err)
    		goto out;
    
    	cycles = insn = 0;
    	ecctr(0, &cycles);
    	ecctr(1, &insn);
    
    	/* ... */
    
    	kernel_cpumcf_end();
    out_busy:
    Signed-off-by: default avatarHendrik Brueckner <brueckner@linux.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    17bebcc6
cpu_mcf.h 2.06 KB