lkml.org 
[lkml]   [2020]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 4/5] perf: Add perf_event_mmap_page::cap_user_time_short ABI
    In order to support short clock counters, provide an ABI extention.

    As a whole:

    u64 time, delta, cyc = read_cycle_counter();

    + if (cap_user_time_short)
    + cyc = time_cycle + ((cyc - time_cycle) & time_mask);

    delta = mul_u64_u32_shr(cyc, time_mult, time_shift);

    if (cap_user_time_zero)
    time = time_zero + delta;

    delta += time_offset;

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    include/uapi/linux/perf_event.h | 23 ++++++++++++++++++++---
    1 file changed, 20 insertions(+), 3 deletions(-)

    --- a/include/uapi/linux/perf_event.h
    +++ b/include/uapi/linux/perf_event.h
    @@ -532,9 +532,10 @@ struct perf_event_mmap_page {
    cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */

    cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */
    - cap_user_time : 1, /* The time_* fields are used */
    + cap_user_time : 1, /* The time_{shift,mult,offset} fields are used */
    cap_user_time_zero : 1, /* The time_zero field is used */
    - cap_____res : 59;
    + cap_user_time_short : 1, /* the time_{cycle,mask} fields are used */
    + cap_____res : 58;
    };
    };

    @@ -593,13 +594,29 @@ struct perf_event_mmap_page {
    * ((rem * time_mult) >> time_shift);
    */
    __u64 time_zero;
    +
    __u32 size; /* Header size up to __reserved[] fields. */
    + __u32 __reserved_1;
    +
    + /*
    + * If cap_usr_time_short, the hardware clock is less than 64bit wide
    + * and we must compute the 'cyc' value, as used by cap_usr_time, as:
    + *
    + * cyc = time_cycles + ((cyc - time_cycles) & time_mask)
    + *
    + * NOTE: this form is explicitly chosen such that cap_usr_time_short
    + * is a correction on top of cap_usr_time, and code that doesn't
    + * know about cap_usr_time_short still works under the assumption
    + * the counter doesn't wrap.
    + */
    + __u64 time_cycles;
    + __u64 time_mask;

    /*
    * Hole for extension of the self monitor capabilities
    */

    - __u8 __reserved[118*8+4]; /* align to 1k. */
    + __u8 __reserved[116*8]; /* align to 1k. */

    /*
    * Control data for the mmap() data buffer.

    \
     
     \ /
      Last update: 2020-05-12 14:48    [W:2.863 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site