[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 7/9] hw/9pfs/9p-synth: avoid n-square issue in synth_readdir()
From: |
Christian Schoenebeck |
Subject: |
[PATCH v2 7/9] hw/9pfs/9p-synth: avoid n-square issue in synth_readdir() |
Date: |
Wed, 18 Dec 2019 14:52:03 +0100 |
This patch is just a temporary benchmark hack, not intended
to be merged!
9pfs synth driver's readdir() implementation has a severe
n-square performance problem. This patch is a quick and dirty
hack to prevent that performance problem from tainting the
readdir() benchmark results. In its current form, this patch
is not useful for anything else than for an isolated readdir
benchmark.
Signed-off-by: Christian Schoenebeck <address@hidden>
---
hw/9pfs/9p-synth.c | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c
index 7eb210ffa8..54dc30f37b 100644
--- a/hw/9pfs/9p-synth.c
+++ b/hw/9pfs/9p-synth.c
@@ -225,7 +225,8 @@ static void synth_direntry(V9fsSynthNode *node,
}
static struct dirent *synth_get_dentry(V9fsSynthNode *dir,
- struct dirent *entry, off_t off)
+ struct dirent *entry, off_t off,
+ V9fsSynthNode **hack)
{
int i = 0;
V9fsSynthNode *node;
@@ -243,16 +244,38 @@ static struct dirent *synth_get_dentry(V9fsSynthNode *dir,
/* end of directory */
return NULL;
}
+ *hack = node;
synth_direntry(node, entry, off);
return entry;
}
static struct dirent *synth_readdir(FsContext *ctx, V9fsFidOpenState *fs)
{
- struct dirent *entry;
+ struct dirent *entry = NULL;
V9fsSynthOpenState *synth_open = fs->private;
V9fsSynthNode *node = synth_open->node;
- entry = synth_get_dentry(node, &synth_open->dent, synth_open->offset);
+
+ /*
+ * HACK: This is just intended for benchmark, to avoid severe n-square
+ * performance problem of synth driver's readdir implementation here which
+ * would otherwise unncessarily taint the benchmark results. By simply
+ * caching (globally) the previous node (of the previous synth_readdir()
+ * call) we can simply proceed to next node in chained list efficiently.
+ *
+ * not a good idea for any production code ;-)
+ */
+ static struct V9fsSynthNode *cachedNode;
+
+ if (!cachedNode) {
+ entry = synth_get_dentry(node, &synth_open->dent, synth_open->offset,
+ &cachedNode);
+ } else {
+ cachedNode = cachedNode->sibling.le_next;
+ if (cachedNode) {
+ entry = &synth_open->dent;
+ synth_direntry(cachedNode, entry, synth_open->offset + 1);
+ }
+ }
if (entry) {
synth_open->offset++;
}
--
2.20.1
- [PATCH v2 0/9] 9pfs: readdir optimization, Christian Schoenebeck, 2019/12/18
- [PATCH v2 9/9] hw/9pfs/9p.c: benchmark time on T_readdir request, Christian Schoenebeck, 2019/12/18
- [PATCH v2 4/9] tests/virtio-9p: added readdir test, Christian Schoenebeck, 2019/12/18
- [PATCH v2 7/9] hw/9pfs/9p-synth: avoid n-square issue in synth_readdir(),
Christian Schoenebeck <=
- [PATCH v2 8/9] 9pfs: T_readdir latency optimization, Christian Schoenebeck, 2019/12/18
- [PATCH v2 1/9] tests/virtio-9p: add terminating null in v9fs_string_read(), Christian Schoenebeck, 2019/12/18
- [PATCH v2 2/9] 9pfs: validate count sent by client with T_readdir, Christian Schoenebeck, 2019/12/18
- [PATCH v2 6/9] 9pfs: readdir benchmark, Christian Schoenebeck, 2019/12/18
- [PATCH v2 3/9] hw/9pfs/9p-synth: added directory for readdir test, Christian Schoenebeck, 2019/12/18
- [PATCH v2 5/9] tests/virtio-9p: check file names of R_readdir response, Christian Schoenebeck, 2019/12/18