lkml.org 
[lkml]   [2009]   [Sep]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC][v6][PATCH 1/9]: Factor out code to allocate pidmap page


    Subject: [RFC][v6][PATCH 1/9]: Factor out code to allocate pidmap page

    To simplify alloc_pidmap(), move code to allocate a pid map page to a
    separate function.

    Changelog[v3]:
    - Earlier version of patchset called alloc_pidmap_page() from two
    places. But now its called from only one place. Even so, moving
    this code out into a separate function simplifies alloc_pidmap().
    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 | 45 ++++++++++++++++++++++++++++++---------------
    1 file changed, 30 insertions(+), 15 deletions(-)

    Index: linux-2.6/kernel/pid.c
    ===================================================================
    --- linux-2.6.orig/kernel/pid.c 2009-09-09 19:06:21.000000000 -0700
    +++ linux-2.6/kernel/pid.c 2009-09-09 19:06:25.000000000 -0700
    @@ -122,9 +122,35 @@ static void free_pidmap(struct upid *upi
    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 rc;
    struct pidmap *map;

    pid = last + 1;
    @@ -134,21 +160,10 @@ static int alloc_pidmap(struct pid_names
    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)) {

    \
     
     \ /
      Last update: 2009-09-10 08:07    [W:0.055 / U:31.040 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site