From 3f4126739dc5c2a0b10ec1f6143ec43028755aa4 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 22 Jan 2009 09:58:48 -0800 Subject: [PATCH] Sleep uninteruptibly, waking up early may result in a crash --- module/splat/splat-kmem.c | 23 ++++++++++++----------- module/splat/splat-rwlock.c | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/module/splat/splat-kmem.c b/module/splat/splat-kmem.c index a9792b1a5..31499dde3 100644 --- a/module/splat/splat-kmem.c +++ b/module/splat/splat-kmem.c @@ -309,31 +309,32 @@ splat_kmem_cache_size_test(struct file *file, void *arg, NULL, &kcp, NULL, flags); if (!cache) { splat_vprint(file, name, - "Unable to create '%s'\n", SPLAT_KMEM_CACHE_NAME); + "Unable to create '%s'\n", + SPLAT_KMEM_CACHE_NAME); return -ENOMEM; } kcd = kmem_cache_alloc(cache, KM_SLEEP); if (!kcd) { splat_vprint(file, name, - "Unable to allocate from '%s'\n", - SPLAT_KMEM_CACHE_NAME); + "Unable to allocate from '%s'\n", + SPLAT_KMEM_CACHE_NAME); rc = -EINVAL; goto out_free; } if (!kcd->kcd_flag) { splat_vprint(file, name, - "Failed to run contructor for '%s'\n", - SPLAT_KMEM_CACHE_NAME); + "Failed to run contructor for '%s'\n", + SPLAT_KMEM_CACHE_NAME); rc = -EINVAL; goto out_free; } if (kcd->kcd_magic != kcp.kcp_magic) { splat_vprint(file, name, - "Failed to pass private data to constructor " - "for '%s'\n", SPLAT_KMEM_CACHE_NAME); + "Failed to pass private data to constructor " + "for '%s'\n", SPLAT_KMEM_CACHE_NAME); rc = -EINVAL; goto out_free; } @@ -346,14 +347,14 @@ splat_kmem_cache_size_test(struct file *file, void *arg, kmem_cache_destroy(cache); if (kcp.kcp_count) { splat_vprint(file, name, - "Failed to run destructor on all slab objects " - "for '%s'\n", SPLAT_KMEM_CACHE_NAME); + "Failed to run destructor on all slab objects " + "for '%s'\n", SPLAT_KMEM_CACHE_NAME); rc = -EINVAL; } splat_vprint(file, name, - "Successfully ran ctors/dtors for %d elements in '%s'\n", - max, SPLAT_KMEM_CACHE_NAME); + "Successfully ran ctors/dtors for %d elements in '%s'\n", + max, SPLAT_KMEM_CACHE_NAME); return rc; diff --git a/module/splat/splat-rwlock.c b/module/splat/splat-rwlock.c index b1db12ea8..70c9dc3d0 100644 --- a/module/splat/splat-rwlock.c +++ b/module/splat/splat-rwlock.c @@ -84,7 +84,7 @@ typedef struct rw_thr { static inline void splat_rwlock_sleep(signed long delay) { - set_current_state(TASK_INTERRUPTIBLE); + set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(delay); } @@ -431,7 +431,7 @@ splat_rwlock_test2(struct file *file, void *arg) while (splat_rwlock_lock_and_test(&rwv.rw_priv_lock, atomic_read(&rwv.rw_acquired) != 0 || atomic_read(&rwv.rw_waiters) != 0)) { - splat_rwlock_sleep(1 * HZ); + splat_rwlock_sleep(HZ); } /* If any of the write threads ever acquired the lock