xfs
[Top] [All Lists]

Re: [PATCH] re-remove xfs custom bitops

To: xfs-oss <xfs@xxxxxxxxxxx>
Subject: Re: [PATCH] re-remove xfs custom bitops
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Tue, 13 May 2008 11:35:44 -0500
In-reply-to: <480EB397.1040304@sandeen.net>
References: <480EB397.1040304@sandeen.net>
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Thunderbird 2.0.0.14 (Macintosh/20080421)
Eric Sandeen wrote:
> Once more, with feeling!
> 
> This re-instates the reverted mod after the ppc panic of
> Feb '08.  You guys do have ppc boxes in the test farm now right? :)
> 
> This keeps xfs_lowbit64 as it was since there aren't good
> generic helpers there ...
> 
> This should probably keep Dave's signed-off line, there's
> a bit of my (userspace) testing here but no original work. 
> 
> This exact patch isn't tested but it's based on a conglomeration
> of prior testing...

SGI guys, any takers on this one?
-Eric

> Thanks,
> -Eric
> 
> Index: linux-2.6-xfs/fs/xfs/xfs_bit.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_bit.c
> +++ linux-2.6-xfs/fs/xfs/xfs_bit.c
> @@ -25,109 +25,6 @@
>   * XFS bit manipulation routines, used in non-realtime code.
>   */
>  
> -#ifndef HAVE_ARCH_HIGHBIT
> -/*
> - * Index of high bit number in byte, -1 for none set, 0..7 otherwise.
> - */
> -static const char xfs_highbit[256] = {
> -       -1, 0, 1, 1, 2, 2, 2, 2,                      /* 00 .. 07 */
> -     3, 3, 3, 3, 3, 3, 3, 3,                 /* 08 .. 0f */
> -     4, 4, 4, 4, 4, 4, 4, 4,                 /* 10 .. 17 */
> -     4, 4, 4, 4, 4, 4, 4, 4,                 /* 18 .. 1f */
> -     5, 5, 5, 5, 5, 5, 5, 5,                 /* 20 .. 27 */
> -     5, 5, 5, 5, 5, 5, 5, 5,                 /* 28 .. 2f */
> -     5, 5, 5, 5, 5, 5, 5, 5,                 /* 30 .. 37 */
> -     5, 5, 5, 5, 5, 5, 5, 5,                 /* 38 .. 3f */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 40 .. 47 */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 48 .. 4f */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 50 .. 57 */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 58 .. 5f */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 60 .. 67 */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 68 .. 6f */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 70 .. 77 */
> -     6, 6, 6, 6, 6, 6, 6, 6,                 /* 78 .. 7f */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* 80 .. 87 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* 88 .. 8f */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* 90 .. 97 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* 98 .. 9f */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* a0 .. a7 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* a8 .. af */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* b0 .. b7 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* b8 .. bf */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* c0 .. c7 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* c8 .. cf */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* d0 .. d7 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* d8 .. df */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* e0 .. e7 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* e8 .. ef */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* f0 .. f7 */
> -     7, 7, 7, 7, 7, 7, 7, 7,                 /* f8 .. ff */
> -};
> -#endif
> -
> -/*
> - * xfs_highbit32: get high bit set out of 32-bit argument, -1 if none set.
> - */
> -inline int
> -xfs_highbit32(
> -     __uint32_t      v)
> -{
> -#ifdef HAVE_ARCH_HIGHBIT
> -     return highbit32(v);
> -#else
> -     int             i;
> -
> -     if (v & 0xffff0000)
> -             if (v & 0xff000000)
> -                     i = 24;
> -             else
> -                     i = 16;
> -     else if (v & 0x0000ffff)
> -             if (v & 0x0000ff00)
> -                     i = 8;
> -             else
> -                     i = 0;
> -     else
> -             return -1;
> -     return i + xfs_highbit[(v >> i) & 0xff];
> -#endif
> -}
> -
> -/*
> - * xfs_lowbit64: get low bit set out of 64-bit argument, -1 if none set.
> - */
> -int
> -xfs_lowbit64(
> -     __uint64_t      v)
> -{
> -     __uint32_t      w = (__uint32_t)v;
> -     int             n = 0;
> -
> -     if (w) {        /* lower bits */
> -             n = ffs(w);
> -     } else {        /* upper bits */
> -             w = (__uint32_t)(v >> 32);
> -             if (w && (n = ffs(w)))
> -                     n += 32;
> -     }
> -     return n - 1;
> -}
> -
> -/*
> - * xfs_highbit64: get high bit set out of 64-bit argument, -1 if none set.
> - */
> -int
> -xfs_highbit64(
> -     __uint64_t      v)
> -{
> -     __uint32_t      h = (__uint32_t)(v >> 32);
> -
> -     if (h)
> -             return xfs_highbit32(h) + 32;
> -     return xfs_highbit32((__uint32_t)v);
> -}
> -
> -
>  /*
>   * Return whether bitmap is empty.
>   * Size is number of words in the bitmap, which is padded to word boundary
> Index: linux-2.6-xfs/fs/xfs/xfs_bit.h
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_bit.h
> +++ linux-2.6-xfs/fs/xfs/xfs_bit.h
> @@ -47,13 +47,39 @@ static inline __uint64_t xfs_mask64lo(in
>  }
>  
>  /* Get high bit set out of 32-bit argument, -1 if none set */
> -extern int xfs_highbit32(__uint32_t v);
> -
> -/* Get low bit set out of 64-bit argument, -1 if none set */
> -extern int xfs_lowbit64(__uint64_t v);
> +static inline int xfs_highbit32(__uint32_t v)
> +{
> +     return fls(v) - 1;
> +}
>  
>  /* Get high bit set out of 64-bit argument, -1 if none set */
> -extern int xfs_highbit64(__uint64_t);
> +static inline int xfs_highbit64(__uint64_t v)
> +{
> +     return fls64(v) - 1;
> +}
> +
> +/* Get low bit set out of 32-bit argument, -1 if none set */
> +static inline int xfs_lowbit32(__uint32_t v)
> +{
> +     unsigned long   t = v;
> +     return (v) ? find_first_bit(&t, 32) : -1;
> +}
> +
> +/* Get low bit set out of 64-bit argument, -1 if none set */
> +static inline int xfs_lowbit64(__uint64_t v)
> +{
> +     __uint32_t      w = (__uint32_t)v;
> +     int             n = 0;
> +
> +     if (w) {        /* lower bits */
> +             n = ffs(w);
> +     } else {        /* upper bits */
> +             w = (__uint32_t)(v >> 32);
> +             if (w && (n = ffs(w)))
> +             n += 32;
> +     }
> +     return n - 1;
> +}
>  
>  /* Return whether bitmap is empty (1 == empty) */
>  extern int xfs_bitmap_empty(uint *map, uint size);
> Index: linux-2.6-xfs/fs/xfs/xfs_rtalloc.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/xfs_rtalloc.c
> +++ linux-2.6-xfs/fs/xfs/xfs_rtalloc.c
> @@ -74,18 +74,6 @@ STATIC int xfs_rtmodify_summary(xfs_moun
>   */
>  
>  /*
> - * xfs_lowbit32: get low bit set out of 32-bit argument, -1 if none set.
> - */
> -STATIC int
> -xfs_lowbit32(
> -     __uint32_t      v)
> -{
> -     if (v)
> -             return ffs(v) - 1;
> -     return -1;
> -}
> -
> -/*
>   * Allocate space to the bitmap or summary file, and zero it, for growfs.
>   */
>  STATIC int                           /* error */
> @@ -450,6 +438,7 @@ xfs_rtallocate_extent_near(
>       }
>       bbno = XFS_BITTOBLOCK(mp, bno);
>       i = 0;
> +     ASSERT(minlen != 0);
>       log2len = xfs_highbit32(minlen);
>       /*
>        * Loop over all bitmap blocks (bbno + i is current block).
> @@ -618,6 +607,8 @@ xfs_rtallocate_extent_size(
>       xfs_suminfo_t   sum;            /* summary information for extents */
>  
>       ASSERT(minlen % prod == 0 && maxlen % prod == 0);
> +     ASSERT(maxlen != 0);
> +
>       /*
>        * Loop over all the levels starting with maxlen.
>        * At each level, look at all the bitmap blocks, to see if there
> @@ -675,6 +666,9 @@ xfs_rtallocate_extent_size(
>               *rtblock = NULLRTBLOCK;
>               return 0;
>       }
> +     ASSERT(minlen != 0);
> +     ASSERT(maxlen != 0);
> +
>       /*
>        * Loop over sizes, from maxlen down to minlen.
>        * This time, when we do the allocations, allow smaller ones
> @@ -1961,6 +1955,7 @@ xfs_growfs_rt(
>                                 nsbp->sb_blocksize * nsbp->sb_rextsize);
>               nsbp->sb_rextents = nsbp->sb_rblocks;
>               do_div(nsbp->sb_rextents, nsbp->sb_rextsize);
> +             ASSERT(nsbp->sb_rextents != 0);
>               nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents);
>               nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1;
>               nrsumsize =
> 
> 
> 


<Prev in Thread] Current Thread [Next in Thread>