Sleep uninteruptibly, waking up early may result in a crash
This commit is contained in:
parent
511176398c
commit
3f4126739d
|
@ -309,31 +309,32 @@ splat_kmem_cache_size_test(struct file *file, void *arg,
|
||||||
NULL, &kcp, NULL, flags);
|
NULL, &kcp, NULL, flags);
|
||||||
if (!cache) {
|
if (!cache) {
|
||||||
splat_vprint(file, name,
|
splat_vprint(file, name,
|
||||||
"Unable to create '%s'\n", SPLAT_KMEM_CACHE_NAME);
|
"Unable to create '%s'\n",
|
||||||
|
SPLAT_KMEM_CACHE_NAME);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
kcd = kmem_cache_alloc(cache, KM_SLEEP);
|
kcd = kmem_cache_alloc(cache, KM_SLEEP);
|
||||||
if (!kcd) {
|
if (!kcd) {
|
||||||
splat_vprint(file, name,
|
splat_vprint(file, name,
|
||||||
"Unable to allocate from '%s'\n",
|
"Unable to allocate from '%s'\n",
|
||||||
SPLAT_KMEM_CACHE_NAME);
|
SPLAT_KMEM_CACHE_NAME);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kcd->kcd_flag) {
|
if (!kcd->kcd_flag) {
|
||||||
splat_vprint(file, name,
|
splat_vprint(file, name,
|
||||||
"Failed to run contructor for '%s'\n",
|
"Failed to run contructor for '%s'\n",
|
||||||
SPLAT_KMEM_CACHE_NAME);
|
SPLAT_KMEM_CACHE_NAME);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kcd->kcd_magic != kcp.kcp_magic) {
|
if (kcd->kcd_magic != kcp.kcp_magic) {
|
||||||
splat_vprint(file, name,
|
splat_vprint(file, name,
|
||||||
"Failed to pass private data to constructor "
|
"Failed to pass private data to constructor "
|
||||||
"for '%s'\n", SPLAT_KMEM_CACHE_NAME);
|
"for '%s'\n", SPLAT_KMEM_CACHE_NAME);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
@ -346,14 +347,14 @@ splat_kmem_cache_size_test(struct file *file, void *arg,
|
||||||
kmem_cache_destroy(cache);
|
kmem_cache_destroy(cache);
|
||||||
if (kcp.kcp_count) {
|
if (kcp.kcp_count) {
|
||||||
splat_vprint(file, name,
|
splat_vprint(file, name,
|
||||||
"Failed to run destructor on all slab objects "
|
"Failed to run destructor on all slab objects "
|
||||||
"for '%s'\n", SPLAT_KMEM_CACHE_NAME);
|
"for '%s'\n", SPLAT_KMEM_CACHE_NAME);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
splat_vprint(file, name,
|
splat_vprint(file, name,
|
||||||
"Successfully ran ctors/dtors for %d elements in '%s'\n",
|
"Successfully ran ctors/dtors for %d elements in '%s'\n",
|
||||||
max, SPLAT_KMEM_CACHE_NAME);
|
max, SPLAT_KMEM_CACHE_NAME);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ typedef struct rw_thr {
|
||||||
static inline void
|
static inline void
|
||||||
splat_rwlock_sleep(signed long delay)
|
splat_rwlock_sleep(signed long delay)
|
||||||
{
|
{
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||||
schedule_timeout(delay);
|
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,
|
while (splat_rwlock_lock_and_test(&rwv.rw_priv_lock,
|
||||||
atomic_read(&rwv.rw_acquired) != 0 ||
|
atomic_read(&rwv.rw_acquired) != 0 ||
|
||||||
atomic_read(&rwv.rw_waiters) != 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
|
/* If any of the write threads ever acquired the lock
|
||||||
|
|
Loading…
Reference in New Issue