lkml.org 
[lkml]   [2008]   [Aug]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [Bug #11342] Linux 2.6.27-rc3: kernel BUG at mm/vmalloc.c - bisected


    On Tue, 26 Aug 2008, Yinghai Lu wrote:
    >
    > wonder if could use "unsigned long *" directly.

    I would actually suggest something like this:

    - we continue to have a magic "cpumask_t".

    - we do different cases for big and small NR_CPUS:

    #if NR_CPUS <= BITS_PER_LONG

    /*
    * Make it an array - that way passing it as an argument will
    * always pass it as a pointer!
    */
    typedef unsigned long cpumask_t[1];

    static inline void create_cpumask(cpumask_t *p)
    {
    *p = 0;
    }
    static inline void free_cpumask(cpumask_t *p)
    {
    }

    #else

    typedef unsigned long *cpumask_t;

    static inline void create_cpumask(cpumask_t *p)
    {
    *p = kcalloc(..);
    }

    static inline void free_cpumask(cpumask_t *p)
    {
    kfree(*p);
    }

    #endif

    and now after you do this, you can just do something like

    cpumask_t mycpu;

    create_cpumask(&mycpu);
    ..
    free_cpumask(&mycpu);

    and in between, you can use 'cpumask' as a pointer, because even when it
    is an array directly allocated on the stack, the array can always
    degenerate into a pointer by C type rules!

    And for the small-NR_CPUS case there is zero overhead.

    Linus


    \
     
     \ /
      Last update: 2008-08-26 18:57    [W:0.021 / U:245.508 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site