Page MenuHomeFreeBSD

blist_alloc_count.patch

Authored By
dougm
May 2 2019, 3:55 PM
Size
1 KB
Referenced Files
None
Subscribers
None

blist_alloc_count.patch

diff --git a/sys/kern/subr_blist.c b/sys/kern/subr_blist.c
index 3f8f1771d66..f7e431a0513 100644
--- a/sys/kern/subr_blist.c
+++ b/sys/kern/subr_blist.c
@@ -278,6 +278,14 @@ blist_destroy(blist_t bl)
free(bl, M_SWAP);
}
+#include <sys/sysctl.h>
+static SYSCTL_NODE(_debug, OID_AUTO, counters, CTLFLAG_RD, 0, "");
+
+static long alloc_success, alloc_failure, avg_count, count_err;
+SYSCTL_ULONG(_debug_counters, OID_AUTO, alloc_success, CTLFLAG_RD, &alloc_success, 0, "");
+SYSCTL_ULONG(_debug_counters, OID_AUTO, alloc_failure, CTLFLAG_RD, &alloc_failure, 0, "");
+SYSCTL_ULONG(_debug_counters, OID_AUTO, avg_count, CTLFLAG_RD, &avg_count, 0, "");
+
/*
* blist_alloc() - reserve space in the block bitmap. Return the base
* of a contiguous region or SWAPBLK_NONE if space could
@@ -297,6 +305,9 @@ blist_alloc(blist_t bl, daddr_t count)
* non-zero. When the cursor is zero, an allocation failure will
* stop further iterations.
*/
+ count_err += count - avg_count;
+ avg_count += count_err / (alloc_success + alloc_failure + 1);
+ count_err %= alloc_success + alloc_failure + 1;
for (;;) {
blk = blst_meta_alloc(bl->bl_root, bl->bl_cursor, count,
bl->bl_radix);
@@ -305,9 +316,12 @@ blist_alloc(blist_t bl, daddr_t count)
bl->bl_cursor = blk + count;
if (bl->bl_cursor == bl->bl_blocks)
bl->bl_cursor = 0;
+ alloc_success++;
return (blk);
- } else if (bl->bl_cursor == 0)
+ } else if (bl->bl_cursor == 0) {
+ alloc_failure++;
return (SWAPBLK_NONE);
+ }
bl->bl_cursor = 0;
}
}

File Metadata

Mime Type
text/x-diff
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1870818
Default Alt Text
blist_alloc_count.patch (1 KB)

Event Timeline