]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/zrlock.c
ABD changes for vectorized RAIDZ
[mirror_zfs.git] / module / zfs / zrlock.c
index 36134431f69404c4f3a987fa3e56476d3369c1c0..52f9ee83930e8dc847d2a0191888bc3e47ac8fab 100644 (file)
@@ -20,6 +20,7 @@
  */
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014 by Delphix. All rights reserved.
  */
 
 /*
  * function calls.
  */
 #include <sys/zrlock.h>
+#include <sys/trace_zrlock.h>
 
 /*
  * A ZRL can be locked only while there are zero references, so ZRL_LOCKED is
  * treated as zero references.
  */
-#define        ZRL_LOCKED      ((uint32_t)-1)
+#define        ZRL_LOCKED      -1
 #define        ZRL_DESTROYED   -2
 
 void
@@ -60,7 +62,7 @@ zrl_init(zrlock_t *zrl)
 void
 zrl_destroy(zrlock_t *zrl)
 {
-       ASSERT(zrl->zr_refcount == 0);
+       ASSERT0(zrl->zr_refcount);
 
        mutex_destroy(&zrl->zr_mtx);
        zrl->zr_refcount = ZRL_DESTROYED;
@@ -80,7 +82,7 @@ zrl_add(zrlock_t *zrl)
                uint32_t cas = atomic_cas_32(
                    (uint32_t *)&zrl->zr_refcount, n, n + 1);
                if (cas == n) {
-                       ASSERT((int32_t)n >= 0);
+                       ASSERT3S((int32_t)n, >=, 0);
 #ifdef ZFS_DEBUG
                        if (zrl->zr_owner == curthread) {
                                DTRACE_PROBE2(zrlock__reentry,
@@ -98,7 +100,7 @@ zrl_add(zrlock_t *zrl)
        while (zrl->zr_refcount == ZRL_LOCKED) {
                cv_wait(&zrl->zr_cv, &zrl->zr_mtx);
        }
-       ASSERT(zrl->zr_refcount >= 0);
+       ASSERT3S(zrl->zr_refcount, >=, 0);
        zrl->zr_refcount++;
 #ifdef ZFS_DEBUG
        zrl->zr_owner = curthread;
@@ -112,14 +114,14 @@ zrl_remove(zrlock_t *zrl)
 {
        uint32_t n;
 
-       n = atomic_dec_32_nv((uint32_t *)&zrl->zr_refcount);
-       ASSERT((int32_t)n >= 0);
 #ifdef ZFS_DEBUG
        if (zrl->zr_owner == curthread) {
                zrl->zr_owner = NULL;
                zrl->zr_caller = NULL;
        }
 #endif
+       n = atomic_dec_32_nv((uint32_t *)&zrl->zr_refcount);
+       ASSERT3S((int32_t)n, >=, 0);
 }
 
 int
@@ -132,14 +134,14 @@ zrl_tryenter(zrlock_t *zrl)
                    (uint32_t *)&zrl->zr_refcount, 0, ZRL_LOCKED);
                if (cas == 0) {
 #ifdef ZFS_DEBUG
-                       ASSERT(zrl->zr_owner == NULL);
+                       ASSERT3P(zrl->zr_owner, ==, NULL);
                        zrl->zr_owner = curthread;
 #endif
                        return (1);
                }
        }
 
-       ASSERT((int32_t)n > ZRL_DESTROYED);
+       ASSERT3S((int32_t)n, >, ZRL_DESTROYED);
 
        return (0);
 }
@@ -147,11 +149,11 @@ zrl_tryenter(zrlock_t *zrl)
 void
 zrl_exit(zrlock_t *zrl)
 {
-       ASSERT(zrl->zr_refcount == ZRL_LOCKED);
+       ASSERT3S(zrl->zr_refcount, ==, ZRL_LOCKED);
 
        mutex_enter(&zrl->zr_mtx);
 #ifdef ZFS_DEBUG
-       ASSERT(zrl->zr_owner == curthread);
+       ASSERT3P(zrl->zr_owner, ==, curthread);
        zrl->zr_owner = NULL;
        membar_producer();      /* make sure the owner store happens first */
 #endif
@@ -165,7 +167,7 @@ zrl_refcount(zrlock_t *zrl)
 {
        int n;
 
-       ASSERT(zrl->zr_refcount > ZRL_DESTROYED);
+       ASSERT3S(zrl->zr_refcount, >, ZRL_DESTROYED);
 
        n = (int)zrl->zr_refcount;
        return (n <= 0 ? 0 : n);
@@ -174,7 +176,7 @@ zrl_refcount(zrlock_t *zrl)
 int
 zrl_is_zero(zrlock_t *zrl)
 {
-       ASSERT(zrl->zr_refcount > ZRL_DESTROYED);
+       ASSERT3S(zrl->zr_refcount, >, ZRL_DESTROYED);
 
        return (zrl->zr_refcount <= 0);
 }
@@ -182,7 +184,7 @@ zrl_is_zero(zrlock_t *zrl)
 int
 zrl_is_locked(zrlock_t *zrl)
 {
-       ASSERT(zrl->zr_refcount > ZRL_DESTROYED);
+       ASSERT3S(zrl->zr_refcount, >, ZRL_DESTROYED);
 
        return (zrl->zr_refcount == ZRL_LOCKED);
 }
@@ -194,3 +196,14 @@ zrl_owner(zrlock_t *zrl)
        return (zrl->zr_owner);
 }
 #endif
+
+#if defined(_KERNEL) && defined(HAVE_SPL)
+
+#ifdef ZFS_DEBUG
+EXPORT_SYMBOL(zrl_add_debug);
+#else
+EXPORT_SYMBOL(zrl_add);
+#endif
+EXPORT_SYMBOL(zrl_remove);
+
+#endif