Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F146115253
D20232.id57283.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D20232.id57283.diff
View Options
Index: subr_blist.c
===================================================================
--- subr_blist.c
+++ subr_blist.c
@@ -192,30 +192,40 @@
/*
- * Use binary search, or a faster method, to find the 1 bit in a u_daddr_t.
- * Assumes that the argument has only one bit set.
+ * Find the first bit set in a u_daddr_t.
*/
static inline int
-bitpos(u_daddr_t mask)
+generic_bitpos(u_daddr_t mask)
{
int hi, lo, mid;
+ lo = 0;
+ hi = BLIST_BMAP_RADIX;
+ while (lo + 1 < hi) {
+ mid = (lo + hi) >> 1;
+ if (mask & bitrange(0, mid))
+ hi = mid;
+ else
+ lo = mid;
+ }
+ return (lo);
+}
+
+static inline int
+bitpos(u_daddr_t mask)
+{
+
switch (sizeof(mask)) {
#ifdef HAVE_INLINE_FFSLL
case sizeof(long long):
return (ffsll(mask) - 1);
#endif
+#ifdef HAVE_INLINE_FFS
+ case sizeof(int):
+ return (ffs(mask) - 1);
+#endif
default:
- lo = 0;
- hi = BLIST_BMAP_RADIX;
- while (lo + 1 < hi) {
- mid = (lo + hi) >> 1;
- if ((mask >> mid) != 0)
- lo = mid;
- else
- hi = mid;
- }
- return (lo);
+ return (generic_bitpos(mask));
}
}
@@ -532,7 +542,8 @@
struct gap_stats gstats;
struct gap_stats *stats = &gstats;
daddr_t i, nodes, radix;
- u_daddr_t bit, diff, mask;
+ u_daddr_t diff, mask;
+ int digit;
init_gap_stats(stats);
nodes = 0;
@@ -570,9 +581,9 @@
if (gap_stats_counting(stats))
diff ^= 1;
while (diff != 0) {
- bit = diff & -diff;
- update_gap_stats(stats, i + bitpos(bit));
- diff ^= bit;
+ digit = bitpos(diff);
+ update_gap_stats(stats, i + digit);
+ diff ^= bitrange(digit, 1);
}
}
nodes += radix_to_skip(radix);
@@ -763,7 +774,7 @@
blst_meta_alloc(blmeta_t *scan, daddr_t cursor, daddr_t count, u_daddr_t radix)
{
daddr_t blk, i, r, skip;
- u_daddr_t bit, mask;
+ u_daddr_t mask;
bool scan_from_start;
int digit;
@@ -795,8 +806,7 @@
* Examine the nonempty subtree associated with each bit set in mask.
*/
do {
- bit = mask & -mask;
- digit = bitpos(bit);
+ digit = bitpos(mask);
i = 1 + digit * skip;
if (count <= scan[i].bm_bighint) {
/*
@@ -806,12 +816,12 @@
count, radix);
if (r != SWAPBLK_NONE) {
if (scan[i].bm_bitmap == 0)
- scan->bm_bitmap ^= bit;
+ scan->bm_bitmap ^= bitrange(digit, 1);
return (r);
}
}
cursor = blk;
- } while ((mask ^= bit) != 0);
+ } while ((mask ^= bitrange(digit, 1)) != 0);
/*
* We couldn't allocate count in this subtree. If the whole tree was
@@ -1006,7 +1016,7 @@
blst_radix_print(blmeta_t *scan, daddr_t blk, daddr_t radix, int tab)
{
daddr_t skip;
- u_daddr_t bit, mask;
+ u_daddr_t mask;
int digit;
if (radix == BLIST_BMAP_RADIX) {
@@ -1038,11 +1048,10 @@
mask = scan->bm_bitmap;
/* Examine the nonempty subtree associated with each bit set in mask */
do {
- bit = mask & -mask;
- digit = bitpos(bit);
+ digit = bitpos(mask);
blst_radix_print(&scan[1 + digit * skip], blk + digit * radix,
radix, tab);
- } while ((mask ^= bit) != 0);
+ } while ((mask ^= bitrange(digit, 1)) != 0);
tab -= 4;
printf(
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Feb 28, 10:57 PM (19 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29053707
Default Alt Text
D20232.id57283.diff (2 KB)
Attached To
Mode
D20232: Make bitpos() handle arguments with many set bits
Attached
Detach File
Event Timeline
Log In to Comment