lkml.org 
[lkml]   [2009]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 03/15] perf_counter: SIGIO support
    provide support for fcntl() I/O availability signals.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    ---
    include/linux/perf_counter.h | 2 ++
    kernel/perf_counter.c | 20 +++++++++++++++++++-
    2 files changed, 21 insertions(+), 1 deletion(-)

    Index: linux-2.6/include/linux/perf_counter.h
    ===================================================================
    --- linux-2.6.orig/include/linux/perf_counter.h
    +++ linux-2.6/include/linux/perf_counter.h
    @@ -238,6 +238,7 @@ enum perf_event_type {
    #include <linux/rcupdate.h>
    #include <linux/spinlock.h>
    #include <linux/hrtimer.h>
    +#include <linux/fs.h>
    #include <asm/atomic.h>

    struct task_struct;
    @@ -397,6 +398,7 @@ struct perf_counter {

    /* poll related */
    wait_queue_head_t waitq;
    + struct fasync_struct *fasync;
    /* optional: for NMIs */
    struct perf_wakeup_entry wakeup;

    Index: linux-2.6/kernel/perf_counter.c
    ===================================================================
    --- linux-2.6.orig/kernel/perf_counter.c
    +++ linux-2.6/kernel/perf_counter.c
    @@ -1526,6 +1526,22 @@ out:
    return ret;
    }

    +static int perf_fasync(int fd, struct file *filp, int on)
    +{
    + struct perf_counter *counter = filp->private_data;
    + struct inode *inode = filp->f_path.dentry->d_inode;
    + int retval;
    +
    + mutex_lock(&inode->i_mutex);
    + retval = fasync_helper(fd, filp, on, &counter->fasync);
    + mutex_unlock(&inode->i_mutex);
    +
    + if (retval < 0)
    + return retval;
    +
    + return 0;
    +}
    +
    static const struct file_operations perf_fops = {
    .release = perf_release,
    .read = perf_read,
    @@ -1533,6 +1549,7 @@ static const struct file_operations perf
    .unlocked_ioctl = perf_ioctl,
    .compat_ioctl = perf_ioctl,
    .mmap = perf_mmap,
    + .fasync = perf_fasync,
    };

    /*
    @@ -1549,7 +1566,7 @@ void perf_counter_wakeup(struct perf_cou
    rcu_read_lock();
    data = rcu_dereference(counter->data);
    if (data) {
    - (void)atomic_xchg(&data->wakeup, POLL_IN);
    + atomic_set(&data->wakeup, POLL_IN);
    /*
    * Ensure all data writes are issued before updating the
    * user-space data head information. The matching rmb()
    @@ -1561,6 +1578,7 @@ void perf_counter_wakeup(struct perf_cou
    rcu_read_unlock();

    wake_up_all(&counter->waitq);
    + kill_fasync(&counter->fasync, SIGIO, POLL_IN);
    }

    /*
    --



    \
     
     \ /
      Last update: 2009-04-06 11:49    [W:0.034 / U:0.648 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site