• Matt Fleming's avatar
    perf/x86/intel: Perform rotation on Intel CQM RMIDs · bff671db
    Matt Fleming authored
    There are many use cases where people will want to monitor more tasks
    than there exist RMIDs in the hardware, meaning that we have to perform
    some kind of multiplexing.
    
    We do this by "rotating" the RMIDs in a workqueue, and assigning an RMID
    to a waiting event when the RMID becomes unused.
    
    This scheme reserves one RMID at all times for rotation. When we need to
    schedule a new event we give it the reserved RMID, pick a victim event
    from the front of the global CQM list and wait for the victim's RMID to
    drop to zero occupancy, before it becomes the new reserved RMID.
    
    We put the victim's RMID onto the limbo list, where it resides for a
    "minimum queue time", which is intended to save ourselves an expensive
    smp IPI when the RMID is unlikely to have a occupancy value below
    __intel_cqm_threshold.
    
    If we fail to recycle an RMID, even after waiting the minimum queue time
    then we need to increment __intel_cqm_threshold. There is an upper bound
    on this threshold, __intel_cqm_max_threshold, which is programmable from
    userland as /sys/devices/intel_cqm/max_recycling_threshold.
    
    The comments above __intel_cqm_rmid_rotate() have more details.
    Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Kanaka Juvva <kanaka.d.juvva@intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Vikas Shivappa <vikas.shivappa@linux.intel.com>
    Link: http://lkml.kernel.org/r/1422038748-21397-9-git-send-email-matt@codeblueprint.co.ukSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    bff671db
perf_event_intel_cqm.c 32 KB