lkml.org 
[lkml]   [2016]   [Mar]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 4/4] perf core: Add backward attribute to perf event
    From
    Date


    On 2016/3/28 14:41, Wang Nan wrote:

    [SNIP]

    >
    > To prevent this problem, we need to find a way to ensure the ring buffer
    > is stable during reading. ioctl(PERF_EVENT_IOC_PAUSE_OUTPUT) is
    > suggested because its overhead is lower than
    > ioctl(PERF_EVENT_IOC_ENABLE).
    >

    Add comment:

    By carefully verifying 'header' pointer, reader can avoid pausing the
    ring-buffer. For example:

    /* A union of all possible events */
    union perf_event event;

    p = head = perf_mmap__read_head();
    while (true) {
    /* copy header of next event */
    fetch(&event.header, p, sizeof(event.header));

    /* read 'head' pointer */
    head = perf_mmap__read_head();

    /* check overwritten: is the header good? */
    if (!verify(sizeof(event.header), p, head))
    break;

    /* copy the whole event */
    fetch(&event, p, event.header.size);

    /* read 'head' pointer again */
    head = perf_mmap__read_head();

    /* is the whole event good? */
    if (!verify(event.header.size, p, head))
    break;
    p += event.header.size;
    }

    However, the overhead is high because:

    a) In-place decoding is unsafe. Copy-verifying-decode is required.
    b) Fetching 'head' pointer requires additional synchronization.



    \
     
     \ /
      Last update: 2016-03-29 04:21    [W:3.868 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site