svn commit: r354675 - in stable/12/sys/cddl/contrib/opensolaris/uts/common: fs/zfs sys
Andriy Gapon
avg at FreeBSD.org
Wed Nov 13 07:39:23 UTC 2019
Author: avg
Date: Wed Nov 13 07:39:20 2019
New Revision: 354675
URL: https://svnweb.freebsd.org/changeset/base/354675
Log:
MFC r353636: MFV r353630: 10809 Performance optimization of AVL tree comparator functions
Modified:
stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c
stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c
stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/range_tree.c
stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c
stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c
stable/12/sys/cddl/contrib/opensolaris/uts/common/sys/avl.h
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c Wed Nov 13 07:39:20 2019 (r354675)
@@ -768,22 +768,31 @@ ddt_prefetch(spa_t *spa, const blkptr_t *bp)
}
}
+/*
+ * Opaque struct used for ddt_key comparison
+ */
+#define DDT_KEY_CMP_LEN (sizeof (ddt_key_t) / sizeof (uint16_t))
+
+typedef struct ddt_key_cmp {
+ uint16_t u16[DDT_KEY_CMP_LEN];
+} ddt_key_cmp_t;
+
int
ddt_entry_compare(const void *x1, const void *x2)
{
const ddt_entry_t *dde1 = x1;
const ddt_entry_t *dde2 = x2;
- const uint64_t *u1 = (const uint64_t *)&dde1->dde_key;
- const uint64_t *u2 = (const uint64_t *)&dde2->dde_key;
+ const ddt_key_cmp_t *k1 = (const ddt_key_cmp_t *)&dde1->dde_key;
+ const ddt_key_cmp_t *k2 = (const ddt_key_cmp_t *)&dde2->dde_key;
+ int32_t cmp = 0;
- for (int i = 0; i < DDT_KEY_WORDS; i++) {
- if (u1[i] < u2[i])
- return (-1);
- if (u1[i] > u2[i])
- return (1);
+ for (int i = 0; i < DDT_KEY_CMP_LEN; i++) {
+ cmp = (int32_t)k1->u16[i] - (int32_t)k2->u16[i];
+ if (likely(cmp))
+ break;
}
- return (0);
+ return (AVL_ISIGN(cmp));
}
static ddt_t *
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c Wed Nov 13 07:39:20 2019 (r354675)
@@ -259,8 +259,13 @@ lz4_decompress(void *s_start, void *d_start, size_t s_
#undef unlikely
#endif
+#ifndef likely
#define likely(expr) expect((expr) != 0, 1)
+#endif
+
+#ifndef unlikely
#define unlikely(expr) expect((expr) != 0, 0)
+#endif
/* Basic types */
#define BYTE uint8_t
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c Wed Nov 13 07:39:20 2019 (r354675)
@@ -1203,9 +1203,6 @@ metaslab_rangesize_compare(const void *x1, const void
if (likely(cmp))
return (cmp);
- if (r1->rs_start < r2->rs_start)
- return (-1);
-
return (AVL_CMP(r1->rs_start, r2->rs_start));
}
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/range_tree.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/range_tree.c Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/range_tree.c Wed Nov 13 07:39:20 2019 (r354675)
@@ -164,7 +164,7 @@ range_tree_seg_compare(const void *x1, const void *x2)
ASSERT3U(r1->rs_start, <=, r1->rs_end);
ASSERT3U(r2->rs_start, <=, r2->rs_end);
-
+
return ((r1->rs_start >= r2->rs_end) - (r1->rs_end <= r2->rs_start));
}
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c Wed Nov 13 07:39:20 2019 (r354675)
@@ -114,29 +114,24 @@ static vdc_stats_t vdc_stats = {
#define VDCSTAT_BUMP(stat) atomic_inc_64(&vdc_stats.stat.value.ui64);
-static int
+static inline int
vdev_cache_offset_compare(const void *a1, const void *a2)
{
- const vdev_cache_entry_t *ve1 = a1;
- const vdev_cache_entry_t *ve2 = a2;
+ const vdev_cache_entry_t *ve1 = (const vdev_cache_entry_t *)a1;
+ const vdev_cache_entry_t *ve2 = (const vdev_cache_entry_t *)a2;
- if (ve1->ve_offset < ve2->ve_offset)
- return (-1);
- if (ve1->ve_offset > ve2->ve_offset)
- return (1);
- return (0);
+ return (AVL_CMP(ve1->ve_offset, ve2->ve_offset));
}
static int
vdev_cache_lastused_compare(const void *a1, const void *a2)
{
- const vdev_cache_entry_t *ve1 = a1;
- const vdev_cache_entry_t *ve2 = a2;
+ const vdev_cache_entry_t *ve1 = (const vdev_cache_entry_t *)a1;
+ const vdev_cache_entry_t *ve2 = (const vdev_cache_entry_t *)a2;
- if (ve1->ve_lastused < ve2->ve_lastused)
- return (-1);
- if (ve1->ve_lastused > ve2->ve_lastused)
- return (1);
+ int cmp = AVL_CMP(ve1->ve_lastused, ve2->ve_lastused);
+ if (likely(cmp))
+ return (cmp);
/*
* Among equally old entries, sort by offset to ensure uniqueness.
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c Wed Nov 13 07:39:20 2019 (r354675)
@@ -353,25 +353,15 @@ vdev_queue_type_tree(vdev_queue_t *vq, zio_type_t t)
int
vdev_queue_timestamp_compare(const void *x1, const void *x2)
{
- const zio_t *z1 = x1;
- const zio_t *z2 = x2;
+ const zio_t *z1 = (const zio_t *)x1;
+ const zio_t *z2 = (const zio_t *)x2;
- if (z1->io_timestamp < z2->io_timestamp)
- return (-1);
- if (z1->io_timestamp > z2->io_timestamp)
- return (1);
+ int cmp = AVL_CMP(z1->io_timestamp, z2->io_timestamp);
- if (z1->io_offset < z2->io_offset)
- return (-1);
- if (z1->io_offset > z2->io_offset)
- return (1);
+ if (likely(cmp))
+ return (cmp);
- if (z1 < z2)
- return (-1);
- if (z1 > z2)
- return (1);
-
- return (0);
+ return (AVL_PCMP(z1, z2));
}
void
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c Wed Nov 13 07:39:20 2019 (r354675)
@@ -107,14 +107,10 @@
static int
rangelock_compare(const void *arg1, const void *arg2)
{
- const locked_range_t *rl1 = arg1;
- const locked_range_t *rl2 = arg2;
+ const locked_range_t *rl1 = (const locked_range_t *)arg1;
+ const locked_range_t *rl2 = (const locked_range_t *)arg2;
- if (rl1->lr_offset > rl2->lr_offset)
- return (1);
- if (rl1->lr_offset < rl2->lr_offset)
- return (-1);
- return (0);
+ return (AVL_CMP(rl1->lr_offset, rl2->lr_offset));
}
/*
Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/sys/avl.h
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/sys/avl.h Wed Nov 13 07:04:11 2019 (r354674)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/sys/avl.h Wed Nov 13 07:39:20 2019 (r354675)
@@ -105,6 +105,13 @@ extern "C" {
* as is needed for any linked list implementation.
*/
+/*
+ * AVL comparator helpers
+ */
+#define AVL_ISIGN(a) (((a) > 0) - ((a) < 0))
+#define AVL_CMP(a, b) (((a) > (b)) - ((a) < (b)))
+#define AVL_PCMP(a, b) \
+ (((uintptr_t)(a) > (uintptr_t)(b)) - ((uintptr_t)(a) < (uintptr_t)(b)))
/*
* AVL comparator helpers
More information about the svn-src-all
mailing list