lkml.org 
[lkml]   [2009]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC v17][PATCH 11/60] pids 1/7: Factor out code to allocate pidmap page
    Date
    From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>

    To implement support for clone_with_pids() system call we would
    need to allocate pidmap page in more than one place. Move this
    code to a new function alloc_pidmap_page().

    Changelog[v2]:
    - (Matt Helsley, Dave Hansen) Have alloc_pidmap_page() return
    -ENOMEM on error instead of -1.

    Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Acked-by: Serge Hallyn <serue@us.ibm.com>
    Reviewed-by: Oren Laadan <orenl@cs.columbia.edu>
    ---
    kernel/pid.c | 46 ++++++++++++++++++++++++++++++----------------
    1 files changed, 30 insertions(+), 16 deletions(-)

    diff --git a/kernel/pid.c b/kernel/pid.c
    index 31310b5..f618096 100644
    --- a/kernel/pid.c
    +++ b/kernel/pid.c
    @@ -122,9 +122,34 @@ static void free_pidmap(struct upid *upid)
    atomic_inc(&map->nr_free);
    }

    +static int alloc_pidmap_page(struct pidmap *map)
    +{
    + void *page;
    +
    + if (likely(map->page))
    + return 0;
    +
    + page = kzalloc(PAGE_SIZE, GFP_KERNEL);
    +
    + /*
    + * Free the page if someone raced with us installing it:
    + */
    + spin_lock_irq(&pidmap_lock);
    + if (map->page)
    + kfree(page);
    + else
    + map->page = page;
    + spin_unlock_irq(&pidmap_lock);
    +
    + if (unlikely(!map->page))
    + return -ENOMEM;
    +
    + return 0;
    +}
    +
    static int alloc_pidmap(struct pid_namespace *pid_ns)
    {
    - int i, offset, max_scan, pid, last = pid_ns->last_pid;
    + int i, rc, offset, max_scan, pid, last = pid_ns->last_pid;
    struct pidmap *map;

    pid = last + 1;
    @@ -134,21 +159,10 @@ static int alloc_pidmap(struct pid_namespace *pid_ns)
    map = &pid_ns->pidmap[pid/BITS_PER_PAGE];
    max_scan = (pid_max + BITS_PER_PAGE - 1)/BITS_PER_PAGE - !offset;
    for (i = 0; i <= max_scan; ++i) {
    - if (unlikely(!map->page)) {
    - void *page = kzalloc(PAGE_SIZE, GFP_KERNEL);
    - /*
    - * Free the page if someone raced with us
    - * installing it:
    - */
    - spin_lock_irq(&pidmap_lock);
    - if (map->page)
    - kfree(page);
    - else
    - map->page = page;
    - spin_unlock_irq(&pidmap_lock);
    - if (unlikely(!map->page))
    - break;
    - }
    + rc = alloc_pidmap_page(map);
    + if (rc)
    + break;
    +
    if (likely(atomic_read(&map->nr_free))) {
    do {
    if (!test_and_set_bit(offset, map->page)) {
    --
    1.6.0.4


    \
     
     \ /
      Last update: 2009-07-22 12:33    [W:0.023 / U:35.464 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site