Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1627899 > unrolled thread
| Started by | js1304@gmail.com |
|---|---|
| First post | 2017-04-21 03:20 +0200 |
| Last post | 2017-04-21 03:20 +0200 |
| Articles | 2 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH v3 0/4] zram: implement deduplication in zram js1304@gmail.com - 2017-04-21 03:20 +0200
[PATCH v3 4/4] zram: compare all the entries with same checksum for deduplication js1304@gmail.com - 2017-04-21 03:20 +0200
| From | js1304@gmail.com |
|---|---|
| Date | 2017-04-21 03:20 +0200 |
| Subject | [PATCH v3 0/4] zram: implement deduplication in zram |
| Message-ID | <tyvoS-7Sg-5@gated-at.bofh.it> |
From: Joonsoo Kim <iamjoonsoo.kim@lge.com> Changes from v2 o rebase to latest zram code o manage alloc/free of the zram_entry in zram_drv.c o remove useless RB_CLEAR_NODE o set RO permission tor use_deup sysfs entry if CONFIG_ZRAM_DEDUP=n Changes from v1 o reogranize dedup specific functions o support Kconfig on/off o update zram documents o compare all the entries with same checksum (patch #4) This patchset implements deduplication feature in zram. Motivation is to save memory usage by zram. There are detailed description about motivation and experimental results on patch #2 so please refer it. Thanks. Joonsoo Kim (4): zram: introduce zram_entry to prepare dedup functionality zram: implement deduplication in zram zram: make deduplication feature optional zram: compare all the entries with same checksum for deduplication Documentation/ABI/testing/sysfs-block-zram | 10 ++ Documentation/blockdev/zram.txt | 3 + drivers/block/zram/Kconfig | 14 ++ drivers/block/zram/Makefile | 3 +- drivers/block/zram/zram_dedup.c | 254 +++++++++++++++++++++++++++++ drivers/block/zram/zram_dedup.h | 45 +++++ drivers/block/zram/zram_drv.c | 184 +++++++++++++++++---- drivers/block/zram/zram_drv.h | 28 +++- 8 files changed, 503 insertions(+), 38 deletions(-) create mode 100644 drivers/block/zram/zram_dedup.c create mode 100644 drivers/block/zram/zram_dedup.h -- 2.7.4
[toc] | [next] | [standalone]
| From | js1304@gmail.com |
|---|---|
| Date | 2017-04-21 03:20 +0200 |
| Subject | [PATCH v3 4/4] zram: compare all the entries with same checksum for deduplication |
| Message-ID | <tyvoS-7Sg-11@gated-at.bofh.it> |
| In reply to | #1627899 |
From: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Until now, we compare just one entry with same checksum when
checking duplication since it is the simplest way to implement.
However, for the completeness, checking all the entries is better
so this patch implement to compare all the entries with same checksum.
Since this event would be rare so there would be no performance loss.
Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
---
drivers/block/zram/zram_dedup.c | 59 ++++++++++++++++++++++++++++++++---------
1 file changed, 47 insertions(+), 12 deletions(-)
diff --git a/drivers/block/zram/zram_dedup.c b/drivers/block/zram/zram_dedup.c
index 560b1f5..14c4988 100644
--- a/drivers/block/zram/zram_dedup.c
+++ b/drivers/block/zram/zram_dedup.c
@@ -109,6 +109,51 @@ static unsigned long zram_dedup_put(struct zram *zram,
return entry->refcount;
}
+static struct zram_entry *__zram_dedup_get(struct zram *zram,
+ struct zram_hash *hash, unsigned char *mem,
+ struct zram_entry *entry)
+{
+ struct zram_entry *tmp, *prev = NULL;
+ struct rb_node *rb_node;
+
+ /* find left-most entry with same checksum */
+ while ((rb_node = rb_prev(&entry->rb_node))) {
+ tmp = rb_entry(rb_node, struct zram_entry, rb_node);
+ if (tmp->checksum != entry->checksum)
+ break;
+
+ entry = tmp;
+ }
+
+again:
+ entry->refcount++;
+ atomic64_add(entry->len, &zram->stats.dup_data_size);
+ spin_unlock(&hash->lock);
+
+ if (prev)
+ zram_entry_free(zram, prev);
+
+ if (zram_dedup_match(zram, entry, mem))
+ return entry;
+
+ spin_lock(&hash->lock);
+ tmp = NULL;
+ rb_node = rb_next(&entry->rb_node);
+ if (rb_node)
+ tmp = rb_entry(rb_node, struct zram_entry, rb_node);
+
+ if (tmp && (tmp->checksum == entry->checksum)) {
+ prev = entry;
+ entry = tmp;
+ goto again;
+ }
+
+ spin_unlock(&hash->lock);
+ zram_entry_free(zram, entry);
+
+ return NULL;
+}
+
static struct zram_entry *zram_dedup_get(struct zram *zram,
unsigned char *mem, u32 checksum)
{
@@ -122,18 +167,8 @@ static struct zram_entry *zram_dedup_get(struct zram *zram,
rb_node = hash->rb_root.rb_node;
while (rb_node) {
entry = rb_entry(rb_node, struct zram_entry, rb_node);
- if (checksum == entry->checksum) {
- entry->refcount++;
- atomic64_add(entry->len, &zram->stats.dup_data_size);
- spin_unlock(&hash->lock);
-
- if (zram_dedup_match(zram, entry, mem))
- return entry;
-
- zram_entry_free(zram, entry);
-
- return NULL;
- }
+ if (checksum == entry->checksum)
+ return __zram_dedup_get(zram, hash, mem, entry);
if (checksum < entry->checksum)
rb_node = rb_node->rb_left;
--
2.7.4
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web