lkml.org 
[lkml]   [2011]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] sched_stats: use the new seq_reserve function
    Date
    Instead of writing directly to private members of the seq_file struct,
    use the new seq_reserve function to specify the predicted size of the
    seq buffer.

    Signed-off-by: Colin Cross <ccross@android.com>
    ---
    fs/proc/stat.c | 23 ++++++++---------------
    kernel/sched_stats.h | 18 +++++++++---------
    2 files changed, 17 insertions(+), 24 deletions(-)

    diff --git a/fs/proc/stat.c b/fs/proc/stat.c
    index 9758b65..1fdf158 100644
    --- a/fs/proc/stat.c
    +++ b/fs/proc/stat.c
    @@ -6,7 +6,6 @@
    #include <linux/proc_fs.h>
    #include <linux/sched.h>
    #include <linux/seq_file.h>
    -#include <linux/slab.h>
    #include <linux/time.h>
    #include <linux/irqnr.h>
    #include <asm/cputime.h>
    @@ -134,24 +133,18 @@ static int show_stat(struct seq_file *p, void *v)
    static int stat_open(struct inode *inode, struct file *file)
    {
    unsigned size = 4096 * (1 + num_possible_cpus() / 32);
    - char *buf;
    struct seq_file *m;
    int res;

    - /* don't ask for more than the kmalloc() max size */
    - if (size > KMALLOC_MAX_SIZE)
    - size = KMALLOC_MAX_SIZE;
    - buf = kmalloc(size, GFP_KERNEL);
    - if (!buf)
    - return -ENOMEM;
    -
    res = single_open(file, show_stat, NULL);
    - if (!res) {
    - m = file->private_data;
    - m->buf = buf;
    - m->size = size;
    - } else
    - kfree(buf);
    + if (res)
    + return res;
    +
    + m = file->private_data;
    + res = seq_reserve(m, size);
    + if (res)
    + single_release(inode, file);
    +
    return res;
    }

    diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h
    index 331e01b..ee05143 100644
    --- a/kernel/sched_stats.h
    +++ b/kernel/sched_stats.h
    @@ -74,19 +74,19 @@ static int show_schedstat(struct seq_file *seq, void *v)
    static int schedstat_open(struct inode *inode, struct file *file)
    {
    unsigned int size = PAGE_SIZE * (1 + num_online_cpus() / 32);
    - char *buf = kmalloc(size, GFP_KERNEL);
    struct seq_file *m;
    int res;

    - if (!buf)
    - return -ENOMEM;
    res = single_open(file, show_schedstat, NULL);
    - if (!res) {
    - m = file->private_data;
    - m->buf = buf;
    - m->size = size;
    - } else
    - kfree(buf);
    + if (res)
    + return res;
    +
    +
    + m = file->private_data;
    + res = seq_reserve(m, size);
    + if (res)
    + single_release(inode, file);
    +
    return res;
    }

    --
    1.7.4.1


    \
     
     \ /
      Last update: 2011-09-22 23:01    [W:0.024 / U:29.712 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site