From: Donald Douwsma <donaldd@sgi.com>
To: Eric Sandeen <sandeen@sandeen.net>
Cc: xfs-oss <xfs@oss.sgi.com>
Subject: Re: [PATCH] re-remove xfs custom bitops
Date: Thu, 15 May 2008 18:45:53 +1000 [thread overview]
Message-ID: <482BF841.8050704@sgi.com> (raw)
In-Reply-To: <4829C360.5060500@sandeen.net>
Eric Sandeen wrote:
> 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
Sorry Eric, havent had chance to run this on all platforms yet.
I want to test it on ppc as well as the usual x86_64/ia64 combinations,
then I'll get it committed.
Don
>
>> 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 =
>>
>>
>>
>
next prev parent reply other threads:[~2008-05-15 8:45 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-23 3:57 [PATCH] re-remove xfs custom bitops Eric Sandeen
2008-05-13 16:35 ` Eric Sandeen
2008-05-15 8:45 ` Donald Douwsma [this message]
2008-06-28 20:08 ` Eric Sandeen
2008-06-30 9:02 ` Donald Douwsma
2008-07-03 1:58 ` Eric Sandeen
2008-07-03 6:46 ` Donald Douwsma
2008-07-03 15:02 ` Eric Sandeen
2008-07-10 5:03 ` Donald Douwsma
2008-07-10 5:10 ` Eric Sandeen
2008-07-10 6:05 ` Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=482BF841.8050704@sgi.com \
--to=donaldd@sgi.com \
--cc=sandeen@sandeen.net \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox