Blame SOURCES/0053-fs-ntfs3-Make-binary-search-to-search-smaller-chunks.patch

Kmods SIG d83023
From ef9297007e9904588682699e618c56401f61d1c2 Mon Sep 17 00:00:00 2001
Kmods SIG d83023
From: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG d83023
Date: Thu, 2 Sep 2021 18:40:49 +0300
Kmods SIG d83023
Subject: [Backport ef9297007e99] src: Make binary search to search
Kmods SIG d83023
 smaller chunks in beginning
Kmods SIG d83023
Kmods SIG d83023
We could try to optimize algorithm to first fill just small table and
Kmods SIG d83023
after that use bigger table all the way up to ARRAY_SIZE(offs). This
Kmods SIG d83023
way we can use bigger search array, but not lose benefits with entry
Kmods SIG d83023
count smaller < ARRAY_SIZE(offs).
Kmods SIG d83023
Kmods SIG d83023
Signed-off-by: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG d83023
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG d83023
---
Kmods SIG d83023
 src/index.c | 7 +++++--
Kmods SIG d83023
 1 file changed, 5 insertions(+), 2 deletions(-)
Kmods SIG d83023
Kmods SIG d83023
diff --git a/src/index.c b/src/index.c
Kmods SIG d83023
index a16256ab3e9ffd5bcc660c602194c9bd2de7cfc9..3ad1ee608e531ea7c7793e691fe706ee0a6c33a4 100644
Kmods SIG d83023
--- a/src/index.c
Kmods SIG d83023
+++ b/src/index.c
Kmods SIG d83023
@@ -8,6 +8,7 @@
Kmods SIG d83023
 #include <linux/blkdev.h>
Kmods SIG d83023
 #include <linux/buffer_head.h>
Kmods SIG d83023
 #include <linux/fs.h>
Kmods SIG d83023
+#include <linux/kernel.h>
Kmods SIG d83023
 
Kmods SIG d83023
 #include "debug.h"
Kmods SIG d83023
 #include "ntfs.h"
Kmods SIG d83023
@@ -679,8 +680,9 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
Kmods SIG d83023
 #ifdef NTFS3_INDEX_BINARY_SEARCH
Kmods SIG d83023
 	struct NTFS_DE *found = NULL;
Kmods SIG d83023
 	int min_idx = 0, mid_idx, max_idx = 0;
Kmods SIG d83023
+	int table_size = 8;
Kmods SIG d83023
 	int diff2;
Kmods SIG d83023
-	u16 offs[64];
Kmods SIG d83023
+	u16 offs[128];
Kmods SIG d83023
 
Kmods SIG d83023
 	if (end > 0x10000)
Kmods SIG d83023
 		goto next;
Kmods SIG d83023
@@ -700,7 +702,7 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
Kmods SIG d83023
 		off += e_size;
Kmods SIG d83023
 
Kmods SIG d83023
 		max_idx++;
Kmods SIG d83023
-		if (max_idx < ARRAY_SIZE(offs))
Kmods SIG d83023
+		if (max_idx < table_size)
Kmods SIG d83023
 			goto fill_table;
Kmods SIG d83023
 
Kmods SIG d83023
 		max_idx--;
Kmods SIG d83023
@@ -718,6 +720,7 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
Kmods SIG d83023
 				return NULL;
Kmods SIG d83023
 
Kmods SIG d83023
 			max_idx = 0;
Kmods SIG d83023
+			table_size = min(table_size * 2, 128);
Kmods SIG d83023
 			goto fill_table;
Kmods SIG d83023
 		}
Kmods SIG d83023
 	} else if (diff2 < 0) {
Kmods SIG d83023
-- 
Kmods SIG d83023
2.31.1
Kmods SIG d83023