lkml.org 
[lkml]   [2004]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[Patch 3 of 17] cpumask v4 - New bitmap operators and two op complement
    mask3-bitmap-newops - New bitmap operators and two op complement
    Add intersects, subset, xor and andnot operators.
    Change bitmap_complement to take two operands.

    Index: 2.6.5.bitmap/include/asm-generic/cpumask_array.h
    ===================================================================
    --- 2.6.5.bitmap.orig/include/asm-generic/cpumask_array.h 2004-04-07 20:58:38.000000000 -0700
    +++ 2.6.5.bitmap/include/asm-generic/cpumask_array.h 2004-04-07 21:14:12.000000000 -0700
    @@ -17,7 +17,7 @@
    #define cpus_and(dst,src1,src2) bitmap_and((dst).mask,(src1).mask, (src2).mask, NR_CPUS)
    #define cpus_or(dst,src1,src2) bitmap_or((dst).mask, (src1).mask, (src2).mask, NR_CPUS)
    #define cpus_clear(map) bitmap_clear((map).mask, NR_CPUS)
    -#define cpus_complement(map) bitmap_complement((map).mask, NR_CPUS)
    +#define cpus_complement(map) bitmap_complement((map).mask, (map).mask, NR_CPUS)
    #define cpus_equal(map1, map2) bitmap_equal((map1).mask, (map2).mask, NR_CPUS)
    #define cpus_empty(map) bitmap_empty(map.mask, NR_CPUS)
    #define cpus_addr(map) ((map).mask)
    Index: 2.6.5.bitmap/include/asm-i386/mpspec.h
    ===================================================================
    --- 2.6.5.bitmap.orig/include/asm-i386/mpspec.h 2004-04-07 20:58:38.000000000 -0700
    +++ 2.6.5.bitmap/include/asm-i386/mpspec.h 2004-04-07 20:58:41.000000000 -0700
    @@ -53,7 +53,7 @@
    #define physids_and(dst, src1, src2) bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
    #define physids_or(dst, src1, src2) bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
    #define physids_clear(map) bitmap_clear((map).mask, MAX_APICS)
    -#define physids_complement(map) bitmap_complement((map).mask, MAX_APICS)
    +#define physids_complement(map) bitmap_complement((map).mask, (map).mask, MAX_APICS)
    #define physids_empty(map) bitmap_empty((map).mask, MAX_APICS)
    #define physids_equal(map1, map2) bitmap_equal((map1).mask, (map2).mask, MAX_APICS)
    #define physids_weight(map) bitmap_weight((map).mask, MAX_APICS)
    Index: 2.6.5.bitmap/include/asm-x86_64/mpspec.h
    ===================================================================
    --- 2.6.5.bitmap.orig/include/asm-x86_64/mpspec.h 2004-04-07 20:58:38.000000000 -0700
    +++ 2.6.5.bitmap/include/asm-x86_64/mpspec.h 2004-04-07 20:58:41.000000000 -0700
    @@ -212,7 +212,7 @@
    #define physids_and(dst, src1, src2) bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
    #define physids_or(dst, src1, src2) bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
    #define physids_clear(map) bitmap_clear((map).mask, MAX_APICS)
    -#define physids_complement(map) bitmap_complement((map).mask, MAX_APICS)
    +#define physids_complement(map) bitmap_complement((map).mask, (map).mask, MAX_APICS)
    #define physids_empty(map) bitmap_empty((map).mask, MAX_APICS)
    #define physids_equal(map1, map2) bitmap_equal((map1).mask, (map2).mask, MAX_APICS)
    #define physids_weight(map) bitmap_weight((map).mask, MAX_APICS)
    Index: 2.6.5.bitmap/include/linux/bitmap.h
    ===================================================================
    --- 2.6.5.bitmap.orig/include/linux/bitmap.h 2004-04-07 20:58:38.000000000 -0700
    +++ 2.6.5.bitmap/include/linux/bitmap.h 2004-04-07 21:14:15.000000000 -0700
    @@ -13,8 +13,8 @@
    int bitmap_empty(const unsigned long *bitmap, int bits);
    int bitmap_full(const unsigned long *bitmap, int bits);
    int bitmap_equal(const unsigned long *bitmap1,
    - unsigned long *bitmap2, int bits);
    -void bitmap_complement(unsigned long *bitmap, int bits);
    + const unsigned long *bitmap2, int bits);
    +void bitmap_complement(unsigned long *dst, const unsigned long *src, int bits);

    static inline void bitmap_clear(unsigned long *bitmap, int bits)
    {
    @@ -40,6 +40,14 @@
    const unsigned long *bitmap2, int bits);
    void bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
    const unsigned long *bitmap2, int bits);
    +void bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits);
    +void bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits);
    +int bitmap_intersects(const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits);
    +int bitmap_subset(const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits);
    int bitmap_weight(const unsigned long *bitmap, int bits);
    int bitmap_scnprintf(char *buf, unsigned int buflen,
    const unsigned long *maskp, int bits);
    Index: 2.6.5.bitmap/lib/bitmap.c
    ===================================================================
    --- 2.6.5.bitmap.orig/lib/bitmap.c 2004-04-07 20:58:41.000000000 -0700
    +++ 2.6.5.bitmap/lib/bitmap.c 2004-04-07 21:14:18.000000000 -0700
    @@ -81,14 +81,14 @@
    }
    EXPORT_SYMBOL(bitmap_equal);

    -void bitmap_complement(unsigned long *bitmap, int bits)
    +void bitmap_complement(unsigned long *dst, const unsigned long *src, int bits)
    {
    int k, lim = bits/BITS_PER_LONG;
    for (k = 0; k < lim; ++k)
    - bitmap[k] = ~bitmap[k];
    + dst[k] = ~src[k];

    if (bits % BITS_PER_LONG)
    - bitmap[k] = ~bitmap[k] & ((1UL << (bits % BITS_PER_LONG)) - 1);
    + dst[k] = ~src[k] & ((1UL << (bits % BITS_PER_LONG)) - 1);
    }
    EXPORT_SYMBOL(bitmap_complement);

    @@ -144,6 +144,60 @@
    }
    EXPORT_SYMBOL(bitmap_or);

    +void bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits)
    +{
    + int k;
    + int nr = BITS_TO_LONGS(bits);
    +
    + for (k = 0; k < nr; k++)
    + dst[k] = bitmap1[k] ^ bitmap2[k];
    +}
    +EXPORT_SYMBOL(bitmap_xor);
    +
    +void bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits)
    +{
    + int k;
    + int nr = BITS_TO_LONGS(bits);
    +
    + for (k = 0; k < nr; k++)
    + dst[k] = bitmap1[k] & ~bitmap2[k];
    +}
    +EXPORT_SYMBOL(bitmap_andnot);
    +
    +int bitmap_intersects(const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits)
    +{
    + int k, lim = bits/BITS_PER_LONG;
    + for (k = 0; k < lim; ++k)
    + if (bitmap1[k] & bitmap2[k])
    + return 1;
    +
    + if (bits % BITS_PER_LONG)
    + if ((bitmap1[k] & bitmap2[k]) &
    + ((1UL << (bits % BITS_PER_LONG)) - 1))
    + return 1;
    + return 0;
    +}
    +EXPORT_SYMBOL(bitmap_intersects);
    +
    +int bitmap_subset(const unsigned long *bitmap1,
    + const unsigned long *bitmap2, int bits)
    +{
    + int k, lim = bits/BITS_PER_LONG;
    + for (k = 0; k < lim; ++k)
    + if (bitmap1[k] & ~bitmap2[k])
    + return 0;
    +
    + if (bits % BITS_PER_LONG)
    + if ((bitmap1[k] & ~bitmap2[k]) &
    + ((1UL << (bits % BITS_PER_LONG)) - 1))
    + return 0;
    + return 1;
    +}
    +EXPORT_SYMBOL(bitmap_subset);
    +
    #if BITS_PER_LONG == 32
    int bitmap_weight(const unsigned long *bitmap, int bits)
    {

    --
    I won't rest till it's the best ...
    Programmer, Linux Scalability
    Paul Jackson <pj@sgi.com> 1.650.933.1373
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:02    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean