• P
    perf: Fix capabilities bitfield compatibility in 'struct perf_event_mmap_page' · fa731587
    Peter Zijlstra 提交于
    Solve the problems around the broken definition of perf_event_mmap_page::
    cap_usr_time and cap_usr_rdpmc fields which used to overlap, partially
    fixed by:
    
      860f085b ("perf: Fix broken union in 'struct perf_event_mmap_page'")
    
    The problem with the fix (merged in v3.12-rc1 and not yet released
    officially), noticed by Vince Weaver is that the new behavior is
    not detectable by new user-space, and that due to the reuse of the
    field names it's easy to mis-compile a binary if old headers are used
    on a new kernel or new headers are used on an old kernel.
    
    To solve all that make this change explicit, detectable and self-contained,
    by iterating the ABI the following way:
    
     - Always clear bit 0, and rename it to usrpage->cap_bit0, to at least not
       confuse old user-space binaries. RDPMC will be marked as unavailable
       to old binaries but that's within the ABI, this is a capability bit.
    
     - Rename bit 1 to ->cap_bit0_is_deprecated and always set it to 1, so new
       libraries can reliably detect that bit 0 is deprecated and perma-zero
       without having to check the kernel version.
    
     - Use bits 2, 3, 4 for the newly defined, correct functionality:
    
    	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_zero	: 1, /* The time_zero field is used */
    
     - Rename all the bitfield names in perf_event.h to be different from the
       old names, to make sure it's not possible to mis-compile it
       accidentally with old assumptions.
    
    The 'size' field can then be used in the future to add new fields and it
    will act as a natural ABI version indicator as well.
    
    Also adjust tools/perf/ userspace for the new definitions, noticed by
    Adrian Hunter.
    Reported-by: NVince Weaver <vincent.weaver@maine.edu>
    Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
    Also-Fixed-by: NAdrian Hunter <adrian.hunter@intel.com>
    Link: http://lkml.kernel.org/n/tip-zr03yxjrpXesOzzupszqglbv@git.kernel.orgSigned-off-by: NIngo Molnar <mingo@kernel.org>
    fa731587
perf_event.h 21.8 KB